-const char parsers_rcs[] = "$Id: parsers.c,v 1.15 2001/06/03 11:03:48 oes Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.21 2001/07/31 14:46:00 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
*
* Revisions :
* $Log: parsers.c,v $
- * Revision 1.15 2001/06/03 11:03:48 oes
- * Makefile/in
- *
- * introduced cgi.c
- *
- * actions.c:
- *
- * adapted to new enlist_unique arg format
- *
- * conf loadcfg.c
- *
- * introduced confdir option
- *
- * filters.c filtrers.h
- *
- * extracted-CGI relevant stuff
- *
- * jbsockets.c
- *
- * filled comment
- *
- * jcc.c
- *
- * support for new cgi mechansim
- *
- * list.c list.h
- *
- * functions for new list type: "map"
- * extended enlist_unique
- *
- * miscutil.c .h
- * introduced bindup()
- *
- * parsers.c parsers.h
- *
+ * Revision 1.21 2001/07/31 14:46:00 oes
+ * - Persistant connections now suppressed
+ * - sed() no longer appends empty header to csp->headers
+ *
+ * Revision 1.20 2001/07/30 22:08:36 jongfoster
+ * Tidying up #defines:
+ * - All feature #defines are now of the form FEATURE_xxx
+ * - Permanently turned off WIN_GUI_EDIT
+ * - Permanently turned on WEBDAV and SPLIT_PROXY_ARGS
+ *
+ * Revision 1.19 2001/07/25 17:21:54 oes
+ * client_uagent now saves copy of User-Agent: header value
+ *
+ * Revision 1.18 2001/07/13 14:02:46 oes
+ * - Included fix to repair broken HTTP requests that
+ * don't contain a path, not even '/'.
+ * - Removed all #ifdef PCRS
+ * - content_type now always inspected and classified as
+ * text, gif or other.
+ * - formatting / comments
+ *
+ * Revision 1.17 2001/06/29 21:45:41 oes
+ * Indentation, CRLF->LF, Tab-> Space
+ *
+ * Revision 1.16 2001/06/29 13:32:42 oes
+ * - Fixed a comment
+ * - Adapted free_http_request
+ * - Removed logentry from cancelled commit
+ *
+ * Revision 1.15 2001/06/03 19:12:38 oes
* deleted const struct interceptors
*
- * pcrs.c
- * added FIXME
- *
- * project.h
- *
- * added struct map
- * added struct http_response
- * changes struct interceptors to struct cgi_dispatcher
- * moved HTML stuff to cgi.h
- *
- * re_filterfile:
- *
- * changed
- *
- * showargs.c
- * NO TIME LEFT
- *
* Revision 1.14 2001/06/01 18:49:17 jongfoster
* Replaced "list_share" with "list" - the tiny memory gain was not
* worth the extra complexity.
* CRLF -> LF
*
* Revision 1.11 2001/05/29 20:11:19 joergs
- * '/* inside comment' warning removed.
+ * '/ * inside comment' warning removed.
*
* Revision 1.10 2001/05/29 09:50:24 jongfoster
* Unified blocklist/imagelist/permissionslist.
{ "from:", 5, client_from },
{ "cookie:", 7, client_send_cookie },
{ "x-forwarded-for:", 16, client_x_forwarded },
- { "proxy-connection:", 17, crumble },
-#ifdef DENY_GZIP
+#ifdef FEATURE_DENY_GZIP
{ "Accept-Encoding: gzip", 21, crumble },
-#endif /* def DENY_GZIP */
-#if defined(DETECT_MSIE_IMAGES)
+#endif /* def FEATURE_DENY_GZIP */
+#if defined(FEATURE_IMAGE_DETECT_MSIE)
{ "Accept:", 7, client_accept },
-#endif /* defined(DETECT_MSIE_IMAGES) */
-#ifdef FORCE_LOAD
+#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */
+#ifdef FEATURE_FORCE_LOAD
{ "Host:", 5, client_host },
-#endif /* def FORCE_LOAD */
+#endif /* def FEATURE_FORCE_LOAD */
/* { "if-modified-since:", 18, crumble }, */
+ { "Keep-Alive:", 11, crumble },
+ { "connection:", 11, crumble },
+ { "proxy-connection:", 17, crumble },
{ NULL, 0, NULL }
};
const struct parsers server_patterns[] = {
{ "set-cookie:", 11, server_set_cookie },
{ "connection:", 11, crumble },
-#if defined(PCRS) || defined(KILLPOPUPS)
{ "Content-Type:", 13, content_type },
-#endif /* defined(PCRS) || defined(KILLPOPUPS) */
-#ifdef PCRS
{ "Content-Length:", 15, content_length },
-#endif /* def PCRS */
{ NULL, 0, NULL }
};
client_cookie_adder,
client_x_forwarded_adder,
client_xtra_adder,
+ connection_close_adder,
NULL
};
void (* const add_server_headers[])(struct client_state *) = {
+ connection_close_adder,
NULL
};
(*f)(csp);
}
- /* add the blank line at the end of the header, if necessary */
- if ( (csp->headers->last == NULL)
- || (csp->headers->last->str == NULL)
- || (*csp->headers->last->str != '\0') )
- {
- enlist(csp->headers, "");
- }
-
hdr = list_to_text(csp->headers);
return(hdr);
freez(http->hostport);
freez(http->path);
freez(http->ver);
+ freez(http->host_ip_addr_str);
+ freez(http->user_agent);
}
http->cmd = strdup(req);
buf = strdup(req);
-
n = ssplit(buf, " \r\n", v, SZ(v), 1, 1);
if (n == 3)
http->ver = strdup(v[2]);
}
-#ifdef WEBDAV
-
-/* This next line is a little ugly, but it simplifies the if statement below. */
-/* Basically if using webDAV, we want the OR condition to use these too. */
-
-/*
- * by haroon
- * These are the headers as defined in RFC2518 to add webDAV support
- */
-
-#define OR_WEBDAV || \
- (0 == strcmpic(v[0], "propfind")) || \
- (0 == strcmpic(v[0], "proppatch")) || \
- (0 == strcmpic(v[0], "move")) || \
- (0 == strcmpic(v[0], "copy")) || \
- (0 == strcmpic(v[0], "mkcol")) || \
- (0 == strcmpic(v[0], "lock")) || \
- (0 == strcmpic(v[0], "unlock"))
-
-#else /* No webDAV support is enabled. Provide an empty OR_WEBDAV macro. */
-
-#define OR_WEBDAV
-
-#endif
-
/* or it could be a GET or a POST (possibly webDAV too) */
- if ((strcmpic(v[0], "get") == 0) ||
- (strcmpic(v[0], "head") == 0) OR_WEBDAV ||
- (strcmpic(v[0], "post") == 0))
+ if ((0 == strcmpic(v[0], "get"))
+ || (0 == strcmpic(v[0], "head"))
+ || (0 == strcmpic(v[0], "post"))
+ /* These are the headers as defined in RFC2518 to add webDAV support: */
+ || (0 == strcmpic(v[0], "propfind"))
+ || (0 == strcmpic(v[0], "proppatch"))
+ || (0 == strcmpic(v[0], "move"))
+ || (0 == strcmpic(v[0], "copy"))
+ || (0 == strcmpic(v[0], "mkcol"))
+ || (0 == strcmpic(v[0], "lock"))
+ || (0 == strcmpic(v[0], "unlock"))
+ )
{
http->ssl = 0;
http->gpc = strdup(v[0]);
url = NULL;
}
- if (url && (p = strchr(url, '/')))
+ if (url)
{
- http->path = strdup(p);
- *p = '\0';
- http->hostport = strdup(url);
+ if ((p = strchr(url, '/')))
+ {
+ http->path = strdup(p);
+ *p = '\0';
+ http->hostport = strdup(url);
+ }
+ /*
+ * Repair broken HTTP requests that don't contain a path
+ */
+ else
+ {
+ /* Repair hostport & path */
+ http->path = strdup("/");
+ http->hostport = strdup(url);
+
+ /* Even repair cmd in case we're just forwarding. Boy are we nice ;-) */
+ freez(http->cmd);
+ http->cmd = strsav(http->cmd, http->gpc);
+ http->cmd = strsav(http->cmd, " / ");
+ http->cmd = strsav(http->cmd, http->ver);
+ }
}
}
}
}
-#if defined(PCRS) || defined(KILLPOPUPS)
-
/*********************************************************************
*
* Function : content_type
*********************************************************************/
char *content_type(const struct parsers *v, char *s, struct client_state *csp)
{
- if (strstr (s, " text/") || strstr (s, "application/x-javascript"))
- csp->is_text = 1;
+ if (strstr(s, " text/") || strstr(s, "application/x-javascript"))
+ csp->content_type = CT_TEXT;
+ else if (strstr(s, " image/gif"))
+ csp->content_type = CT_GIF;
else
- csp->is_text = 0;
+ csp->content_type = 0;
return(strdup(s));
}
-#endif /* defined(PCRS) || defined(KILLPOPUPS) */
-#ifdef PCRS
/*********************************************************************
*
* Function : content_length
*
- * Description : Crunch Content-Length header if & only if we are
- * filtering this page through PCRS.
+ * Description : Adjust Content-Length header if we modified
+ * the body.
*
* Parameters :
* 1 : v = ignored
char *content_length(const struct parsers *v, char *s, struct client_state *csp)
{
if (csp->content_length != 0) /* Content has been modified */
- {
- s = (char *) zalloc(100);
- sprintf(s, "Content-Length: %d", csp->content_length);
- log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
- return(s);
- }
+ {
+ s = (char *) zalloc(100);
+ sprintf(s, "Content-Length: %d", csp->content_length);
+
+ log_error(LOG_LEVEL_HEADER, "Adjust Content-Length to %d", csp->content_length);
+ return(s);
+ }
else
{
return(strdup(s));
}
-}
-#endif /* def PCRS */
+}
/*********************************************************************
char *client_referrer(const struct parsers *v, char *s, struct client_state *csp)
{
const char * newval;
-#ifdef FORCE_LOAD
+#ifdef FEATURE_FORCE_LOAD
/* Since the referrer can include the prefix even
* even if the request itself is non-forced, we must
* clean it unconditionally
*/
strclean(s, FORCE_PREFIX);
-#endif /* def FORCE_LOAD */
+#endif /* def FEATURE_FORCE_LOAD */
-#ifdef TRUST_FILES
+#ifdef FEATURE_TRUST
csp->referrer = strdup(s);
-#endif /* def TRUST_FILES */
+#endif /* def FEATURE_TRUST */
/*
* Are we sending referer?
*
* Function : client_uagent
*
- * Description : Handle the "user-agent" config setting properly.
- * Called from `sed'.
+ * Description : Handle the "user-agent" config setting properly
+ * and remember its original value to enable browser
+ * bug workarounds. Called from `sed'.
*
* Parameters :
* 1 : v = ignored
{
const char * newval;
-#ifdef DETECT_MSIE_IMAGES
+ /* Save the client's User-Agent: value */
+ if (strlen(s) >= 12)
+ {
+ csp->http->user_agent = strdup(s + 12);
+ }
+
+#ifdef FEATURE_IMAGE_DETECT_MSIE
if (strstr (s, "MSIE "))
{
/* This is Microsoft Internet Explorer.
*/
csp->accept_types |= ACCEPT_TYPE_IS_MSIE;
}
-#endif /* def DETECT_MSIE_IMAGES */
+#endif /* def FEATURE_IMAGE_DETECT_MSIE */
if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
{
}
-#if defined(DETECT_MSIE_IMAGES)
+#if defined(FEATURE_IMAGE_DETECT_MSIE)
/*********************************************************************
*
* Function : client_accept
*********************************************************************/
char *client_accept(const struct parsers *v, char *s, struct client_state *csp)
{
-#ifdef DETECT_MSIE_IMAGES
+#ifdef FEATURE_IMAGE_DETECT_MSIE
if (strstr (s, "image/gif"))
{
/* Client will accept HTML. If this seems counterintuitive,
{
csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE;
}
-#endif /* def DETECT_MSIE_IMAGES */
+#endif /* def FEATURE_IMAGE_DETECT_MSIE */
return(strdup(s));
}
-#endif /* defined(DETECT_MSIE_IMAGES) */
+#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */
}
+/*********************************************************************
+ *
+ * Function : connection_close_adder
+ *
+ * Description : Adds a "Connection: close" header to csp->headers
+ * as a temporary fix for the needed but missing HTTP/1.1
+ * support. Called from `sed'.
+ * FIXME: This whole function shouldn't be neccessary!
+ *
+ * Parameters :
+ * 1 : csp = Current client state (buffers, headers, etc...)
+ *
+ * Returns : N/A
+ *
+ *********************************************************************/
+void connection_close_adder(struct client_state *csp)
+{
+ enlist(csp->headers, strdup("Connection: close"));
+
+}
+
+
/*********************************************************************
*
* Function : server_set_cookie
*********************************************************************/
char *server_set_cookie(const struct parsers *v, char *s, struct client_state *csp)
{
-#ifdef JAR_FILES
+#ifdef FEATURE_COOKIE_JAR
if (csp->config->jar)
{
fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
}
-#endif /* def JAR_FILES */
+#endif /* def FEATURE_COOKIE_JAR */
if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
{
}
-#ifdef FORCE_LOAD
+#ifdef FEATURE_FORCE_LOAD
/*********************************************************************
*
* Function : client_host
return(cleanhost);
}
-#endif /* def FORCE_LOAD */
+#endif /* def FEATURE_FORCE_LOAD */
-#ifdef FORCE_LOAD
+#ifdef FEATURE_FORCE_LOAD
/*********************************************************************
*
* Function : strclean
return(hits);
}
-#endif /* def FORCE_LOAD */
+#endif /* def FEATURE_FORCE_LOAD */
/*