+ if (ListMutex != NULL)
+ CtdlLogResult(pthread_mutex_unlock(ListMutex));
+ }
+ return TheSession;
+}
+
+
+/* If it's a "force 404" situation then display the error and bail. */
+void do_404(void)
+{
+ hprintf("HTTP/1.1 404 Not found\r\n");
+ hprintf("Content-Type: text/plain\r\n");
+ wc_printf("Not found\r\n");
+ end_burst();
+}
+
+int ReadHttpSubject(ParsedHttpHdrs *Hdr, StrBuf *Line, StrBuf *Buf)
+{
+ const char *Args;
+ void *vLine, *vHandler;
+ const char *Pos = NULL;
+
+
+ Hdr->HR.ReqLine = Line;
+ /* The requesttype... GET, POST... */
+ StrBufExtract_token(Buf, Hdr->HR.ReqLine, 0, ' ');
+ if (GetHash(HttpReqTypes, SKEY(Buf), &vLine) &&
+ (vLine != NULL))
+ {
+ Hdr->HR.eReqType = *(long*)vLine;
+ }
+ else {
+ Hdr->HR.eReqType = eGET;
+ return 1;
+ }
+ StrBufCutLeft(Hdr->HR.ReqLine, StrLength(Buf) + 1);
+
+ /* the HTTP Version... */
+ StrBufExtract_token(Buf, Hdr->HR.ReqLine, 1, ' ');
+ StrBufCutRight(Hdr->HR.ReqLine, StrLength(Buf) + 1);
+
+ if (StrLength(Buf) == 0) {
+ Hdr->HR.eReqType = eGET;
+ return 1;
+ }
+
+ StrBufAppendBuf(Hdr->this_page, Hdr->HR.ReqLine, 0);
+
+ /* chop Filename / query arguments */
+ Args = strchr(ChrPtr(Hdr->HR.ReqLine), '?');
+ if (Args == NULL) /* whe're not that picky about params... TODO: this will spoil '&' in filenames.*/
+ Args = strchr(ChrPtr(Hdr->HR.ReqLine), '&');
+ if (Args != NULL) {
+ Args ++; /* skip the ? */
+ StrBufPlain(Hdr->PlainArgs,
+ Args,
+ StrLength(Hdr->HR.ReqLine) -
+ (Args - ChrPtr(Hdr->HR.ReqLine)));
+ StrBufCutAt(Hdr->HR.ReqLine, 0, Args - 1);
+ } /* don't parse them yet, maybe we don't even care... */
+
+ /* now lookup what we are going to do with this... */
+ /* skip first slash */
+ StrBufExtract_NextToken(Buf, Hdr->HR.ReqLine, &Pos, '/');
+ do {
+ StrBufExtract_NextToken(Buf, Hdr->HR.ReqLine, &Pos, '/');
+
+ GetHash(HandlerHash, SKEY(Buf), &vHandler),
+ Hdr->HR.Handler = (WebcitHandler*) vHandler;
+ if (Hdr->HR.Handler == NULL)
+ break;
+ /*
+ * If the request is prefixed by "/webcit" then chop that off. This
+ * allows a front end web server to forward all /webcit requests to us
+ * while still using the same web server port for other things.
+ */
+ if ((Hdr->HR.Handler->Flags & URLNAMESPACE) != 0)
+ continue;
+ break;
+ } while (1);
+ /* remove the handlername from the URL */
+ if ((Pos != NULL) && (Pos != StrBufNOTNULL)){
+ StrBufCutLeft(Hdr->HR.ReqLine,
+ Pos - ChrPtr(Hdr->HR.ReqLine));
+ }
+
+ if (Hdr->HR.Handler != NULL) {
+ if ((Hdr->HR.Handler->Flags & BOGUS) != 0)
+ return 1;
+ Hdr->HR.DontNeedAuth = (
+ ((Hdr->HR.Handler->Flags & ISSTATIC) != 0) ||
+ ((Hdr->HR.Handler->Flags & ANONYMOUS) != 0)
+ );
+ }
+ else {
+ Hdr->HR.DontNeedAuth = 1; /* Flat request? show him the login screen... */