* persistent session to the Citadel server, handling HTTP WebCit requests as
* they arrive and presenting a user interface.
*
- * Copyright (c) 1996-2012 by the citadel.org team
+ * Copyright (c) 1996-2013 by the citadel.org team
*
* This program is open source software. You can redistribute it and/or
* modify it under the terms of the GNU General Public License, version 3.
void stuff_to_cookie(int unset_cookie);
extern int GetConnected(void);
-
+extern int verbose;
void PutRequestLocalMem(void *Data, DeleteHashDataFunc DeleteIt)
{
wcsession *WCC = WC;
char httpnow[128];
- hprintf("HTTP/1.1 200 OK\n");
+ if (WCC->isFailure)
+ hprintf("HTTP/2.2 500 Internal Server Error");
+ else if (WCC->Hdr->HaveRange > 1)
+ hprintf("HTTP/1.1 206 Partial Content\r\n");
+ else
+ hprintf("HTTP/1.1 200 OK\r\n");
+
http_datestring(httpnow, sizeof httpnow, time(NULL));
if (do_httpheaders) {
*/
void http_transmit_thing(const char *content_type, int is_static)
{
- syslog(9, "http_transmit_thing(%s)%s", content_type, ((is_static > 0) ? " (static)" : ""));
+ if (verbose)
+ syslog(LOG_DEBUG, "http_transmit_thing(%s)%s", content_type, ((is_static > 0) ? " (static)" : ""));
output_headers(0, 0, 0, 0, 0, is_static);
hprintf("Content-type: %s\r\n"
end_burst();
}
+void http_transmit_headers(const char *content_type, int is_static, long is_chunked, int is_gzip)
+{
+ wcsession *WCC = WC;
+ if (verbose)
+ syslog(LOG_DEBUG, "http_transmit_thing(%s)%s", content_type, ((is_static > 0) ? " (static)" : ""));
+ output_headers(0, 0, 0, 0, 0, is_static);
+
+ if (is_gzip)
+ hprintf("Content-encoding: gzip\r\n");
+
+ if (WCC->Hdr->HaveRange)
+ hprintf("Accept-Ranges: bytes\r\n"
+ "Content-Range: bytes %ld-%ld/%ld\r\n",
+ WCC->Hdr->RangeStart,
+ WCC->Hdr->RangeTil,
+ WCC->Hdr->TotalBytes);
+
+ hprintf("Content-type: %s\r\n"
+ "Server: "PACKAGE_STRING"\r\n"
+ "%s"
+ "Connection: close\r\n\r\n",
+ content_type,
+ (is_chunked)?"Transfer-Encoding: chunked\r\n":"");
+}
+
/*
* Convenience functions to display a page containing only a string
PACKAGE_STRING, ChrPtr(WC->serv_info->serv_software)
);
hprintf("WWW-Authenticate: Basic realm=\"%s\"\r\n", ChrPtr(WC->serv_info->serv_humannode));
+
+ /* if this is a false cookie authentication, remove it to avoid endless loops. */
+ if (StrLength(WCC->Hdr->HR.RawCookie) > 0)
+ stuff_to_cookie(1);
+
hprintf("Content-Type: text/html\r\n");
begin_burst();
wc_printf("<h1>");
char *junk;
size_t len;
- syslog(LOG_DEBUG, "ajax_servcmd() g_cmd=\"%s\"", bstr("g_cmd") );
+ if (verbose)
+ syslog(LOG_DEBUG, "ajax_servcmd() g_cmd=\"%s\"", bstr("g_cmd") );
begin_ajax_response();
Buf = NewStrBuf();
serv_puts(bstr("g_cmd"));
}
FreeStrBuf(&WCC->PushedDestination);
- WCC->PushedDestination = NewStrBufDup(SBSTR("url"));
- syslog(9, "Push: %s", ChrPtr(WCC->PushedDestination));
+ WCC->PushedDestination = NewStrBufDup(sbstr("url"));
+ if (verbose)
+ syslog(LOG_DEBUG, "Push: %s", ChrPtr(WCC->PushedDestination));
wc_printf("OK");
}
/*
* All righty then! We have a destination saved, so go there now.
*/
- syslog(9, "Pop: %s", ChrPtr(WCC->PushedDestination));
+ if (verbose)
+ syslog(LOG_DEBUG, "Pop: %s", ChrPtr(WCC->PushedDestination));
http_redirect(ChrPtr(WCC->PushedDestination));
}
/* If the client sent a nonce that is incorrect, kill the request. */
if (havebstr("nonce")) {
- syslog(9, "Comparing supplied nonce %s to session nonce %d",
- bstr("nonce"), WCC->nonce
- );
+ if (verbose)
+ syslog(LOG_DEBUG, "Comparing supplied nonce %s to session nonce %d",
+ bstr("nonce"), WCC->nonce
+ );
if (ibstr("nonce") != WCC->nonce) {
- syslog(9, "Ignoring request with mismatched nonce.");
+ syslog(LOG_INFO, "Ignoring request with mismatched nonce.");
hprintf("HTTP/1.1 404 Security check failed\r\n");
hprintf("Content-Type: text/plain\r\n");
begin_burst();
*/
if (havebstr("go")) {
int ret;
- syslog(9, "Explicit room selection: %s", bstr("go"));
+ if (verbose)
+ syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("go"));
ret = gotoroom(sbstr("go")); /* do quietly to avoid session output! */
if ((ret/100) != 2) {
- syslog(1, "Unable to change to [%s]; Reason: %d", bstr("go"), ret);
+ if (verbose)
+ syslog(LOG_DEBUG, "Unable to change to [%s]; Reason: %d", bstr("go"), ret);
}
}
else if (havebstr("gotofirst")) {
int ret;
- syslog(9, "Explicit room selection: %s", bstr("gotofirst"));
+ if (verbose)
+ syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("gotofirst"));
ret = gotoroom(sbstr("gotofirst")); /* do quietly to avoid session output! */
if ((ret/100) != 2) {
- syslog(1, "Unable to change to [%s]; Reason: %d", bstr("gotofirst"), ret);
+ syslog(LOG_INFO, "Unable to change to [%s]; Reason: %d", bstr("gotofirst"), ret);
}
}
else if ( (StrLength(WCC->CurRoom.name) == 0) && ( (StrLength(WCC->Hdr->c_roomname) > 0) )) {
int ret;
- syslog(9, "We are in '%s' but cookie indicates '%s', going there...",
- ChrPtr(WCC->CurRoom.name),
- ChrPtr(WCC->Hdr->c_roomname)
+ if (verbose)
+ syslog(LOG_DEBUG, "We are in '%s' but cookie indicates '%s', going there...",
+ ChrPtr(WCC->CurRoom.name),
+ ChrPtr(WCC->Hdr->c_roomname)
);
ret = gotoroom(WCC->Hdr->c_roomname); /* do quietly to avoid session output! */
if ((ret/100) != 2) {
- syslog(1, "COOKIEGOTO: Unable to change to [%s]; Reason: %d",
- ChrPtr(WCC->Hdr->c_roomname), ret);
+ if (verbose)
+ syslog(LOG_DEBUG, "COOKIEGOTO: Unable to change to [%s]; Reason: %d",
+ ChrPtr(WCC->Hdr->c_roomname), ret);
}
}
if (WCC->Hdr->HR.Handler != NULL) {
if ( (!WCC->logged_in)
&& ((WCC->Hdr->HR.Handler->Flags & ANONYMOUS) == 0)
+ && (WCC->serv_info != NULL)
&& (WCC->serv_info->serv_supports_guest == 0)
) {
display_login();
/* default action */
if (havebstr("go")) {
- syslog(9, "Explicit room selection: %s", bstr("go"));
- StrBuf *teh_room = NewStrBufPlain(bstr("go"), strlen(bstr("go")));
- smart_goto(teh_room);
- FreeStrBuf(&teh_room);
+ if (verbose)
+ syslog(LOG_DEBUG, "Explicit room selection: %s", bstr("go"));
+ smart_goto(sbstr("go"));
}
else if (default_landing_page) {
http_redirect(default_landing_page);
WebcitAddUrlHandler(HKEY("pop"), "", 0, pop_destination, 0);
WebcitAddUrlHandler(HKEY("401"), "", 0, authorization_required, ANONYMOUS|COOKIEUNNEEDED);
- RegisterConditional(HKEY("COND:IMPMSG"), 0, ConditionalImportantMesage, CTX_NONE);
- RegisterConditional(HKEY("COND:REST:DEPTH"), 0, Conditional_REST_DEPTH, CTX_NONE);
- RegisterConditional(HKEY("COND:IS_HTTPS"), 0, Conditional_IS_HTTPS, CTX_NONE);
+ RegisterConditional("COND:IMPMSG", 0, ConditionalImportantMesage, CTX_NONE);
+ RegisterConditional("COND:REST:DEPTH", 0, Conditional_REST_DEPTH, CTX_NONE);
+ RegisterConditional("COND:IS_HTTPS", 0, Conditional_IS_HTTPS, CTX_NONE);
RegisterNamespace("CSSLOCAL", 0, 0, tmplput_csslocal, NULL, CTX_NONE);
RegisterNamespace("IMPORTANTMESSAGE", 0, 0, tmplput_importantmessage, NULL, CTX_NONE);
snprintf(dir, SIZ, "%s/webcit.css", static_local_dir);
if (!access(dir, R_OK)) {
- syslog(9, "Using local Stylesheet [%s]", dir);
+ syslog(LOG_INFO, "Using local Stylesheet [%s]", dir);
csslocal = NewStrBufPlain(HKEY("<link href=\"static.local/webcit.css\" rel=\"stylesheet\" type=\"text/css\" />"));
}
else
- syslog(9, "No Site-local Stylesheet [%s] installed.", dir);
+ syslog(LOG_INFO, "No Site-local Stylesheet [%s] installed.", dir);
}