-const char parsers_rcs[] = "$Id: parsers.c,v 1.22 2001/09/10 10:58:53 oes Exp $";
+const char parsers_rcs[] = "$Id: parsers.c,v 1.17 2001/06/29 21:45:41 oes Exp $";
/*********************************************************************
*
* File : $Source: /cvsroot/ijbswa/current/parsers.c,v $
*
* Revisions :
* $Log: parsers.c,v $
- * Revision 1.22 2001/09/10 10:58:53 oes
- * Silenced compiler warnings
- *
- * 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
*
* 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 },
-#ifdef FEATURE_DENY_GZIP
+ { "proxy-connection:", 17, crumble },
+#ifdef DENY_GZIP
{ "Accept-Encoding: gzip", 21, crumble },
-#endif /* def FEATURE_DENY_GZIP */
-#if defined(FEATURE_IMAGE_DETECT_MSIE)
+#endif /* def DENY_GZIP */
+#if defined(DETECT_MSIE_IMAGES)
{ "Accept:", 7, client_accept },
-#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */
-#ifdef FEATURE_FORCE_LOAD
+#endif /* defined(DETECT_MSIE_IMAGES) */
+#ifdef FORCE_LOAD
{ "Host:", 5, client_host },
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
/* { "if-modified-since:", 18, crumble }, */
- { "Keep-Alive:", 11, crumble },
- { "connection:", 11, crumble },
- { "proxy-connection:", 17, crumble },
{ 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->path);
freez(http->ver);
freez(http->host_ip_addr_str);
- freez(http->user_agent);
}
*********************************************************************/
void parse_http_request(char *req, struct http_request *http, struct client_state *csp)
{
- char *buf, *v[10], *url, *p, *save_url;
+ char *buf, *v[10], *url, *p;
int n;
memset(http, '\0', sizeof(*http));
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 ((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"))
- )
+ if ((strcmpic(v[0], "get") == 0) ||
+ (strcmpic(v[0], "head") == 0) OR_WEBDAV ||
+ (strcmpic(v[0], "post") == 0))
{
http->ssl = 0;
http->gpc = strdup(v[0]);
url = v[1];
http->ver = strdup(v[2]);
- save_url = url;
if (strncmpic(url, "http://", 7) == 0)
{
url += 7;
if (url)
{
- if ((p = strchr(url, '/')))
+ if (p = strchr(url, '/'))
{
http->path = strdup(p);
*p = '\0';
/* 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, save_url);
- http->cmd = strsav(http->cmd, "/ ");
+ http->cmd = strsav(http->cmd, " / ");
http->cmd = strsav(http->cmd, http->ver);
}
}
char *client_referrer(const struct parsers *v, char *s, struct client_state *csp)
{
const char * newval;
-#ifdef FEATURE_FORCE_LOAD
+#ifdef 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 FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
-#ifdef FEATURE_TRUST
+#ifdef TRUST_FILES
csp->referrer = strdup(s);
-#endif /* def FEATURE_TRUST */
+#endif /* def TRUST_FILES */
/*
* Are we sending referer?
*
* Function : client_uagent
*
- * Description : Handle the "user-agent" config setting properly
- * and remember its original value to enable browser
- * bug workarounds. Called from `sed'.
+ * Description : Handle the "user-agent" config setting properly.
+ * Called from `sed'.
*
* Parameters :
* 1 : v = ignored
{
const char * newval;
- /* Save the client's User-Agent: value */
- if (strlen(s) >= 12)
- {
- csp->http->user_agent = strdup(s + 12);
- }
-
-#ifdef FEATURE_IMAGE_DETECT_MSIE
+#ifdef DETECT_MSIE_IMAGES
if (strstr (s, "MSIE "))
{
/* This is Microsoft Internet Explorer.
*/
csp->accept_types |= ACCEPT_TYPE_IS_MSIE;
}
-#endif /* def FEATURE_IMAGE_DETECT_MSIE */
+#endif /* def DETECT_MSIE_IMAGES */
if ((csp->action->flags & ACTION_HIDE_USER_AGENT) == 0)
{
}
-#if defined(FEATURE_IMAGE_DETECT_MSIE)
+#if defined(DETECT_MSIE_IMAGES)
/*********************************************************************
*
* Function : client_accept
*********************************************************************/
char *client_accept(const struct parsers *v, char *s, struct client_state *csp)
{
-#ifdef FEATURE_IMAGE_DETECT_MSIE
+#ifdef DETECT_MSIE_IMAGES
if (strstr (s, "image/gif"))
{
/* Client will accept HTML. If this seems counterintuitive,
{
csp->accept_types |= ACCEPT_TYPE_MSIE_IMAGE;
}
-#endif /* def FEATURE_IMAGE_DETECT_MSIE */
+#endif /* def DETECT_MSIE_IMAGES */
return(strdup(s));
}
-#endif /* defined(FEATURE_IMAGE_DETECT_MSIE) */
+#endif /* defined(DETECT_MSIE_IMAGES) */
}
-/*********************************************************************
- *
- * 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 FEATURE_COOKIE_JAR
+#ifdef JAR_FILES
if (csp->config->jar)
{
fprintf(csp->config->jar, "%s\t%s\n", csp->http->host, (s + v->len + 1));
}
-#endif /* def FEATURE_COOKIE_JAR */
+#endif /* def JAR_FILES */
if ((csp->action->flags & ACTION_NO_COOKIE_SET) != 0)
{
}
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
/*********************************************************************
*
* Function : client_host
return(cleanhost);
}
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
-#ifdef FEATURE_FORCE_LOAD
+#ifdef FORCE_LOAD
/*********************************************************************
*
* Function : strclean
return(hits);
}
-#endif /* def FEATURE_FORCE_LOAD */
+#endif /* def FORCE_LOAD */
/*