mturk 2004/07/28 12:16:21 Modified: ajp/ajplib/test ajp_header.c Log: Rewrite sc_for_req_header using apr and a little bit smarter comparision, using memcmp instead strcasecmp. Revision Changes Path 1.7 +83 -82 jakarta-tomcat-connectors/ajp/ajplib/test/ajp_header.c Index: ajp_header.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/ajplib/test/ajp_header.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- ajp_header.c 28 Jul 2004 17:25:22 -0000 1.6 +++ ajp_header.c 28 Jul 2004 19:16:21 -0000 1.7 @@ -210,91 +210,91 @@ } -static apr_status_t sc_for_req_header(const char *header_name, - apr_uint16_t *sc) +static apr_status_t sc_for_req_header(const char *header_name) { - switch((tolower(header_name[0]))) { - case 'a': - if('c' ==tolower(header_name[1]) && - 'c' ==tolower(header_name[2]) && - 'e' ==tolower(header_name[3]) && - 'p' ==tolower(header_name[4]) && - 't' ==tolower(header_name[5])) { - if ('-' == header_name[6]) { - if(!strcasecmp(header_name + 7, "charset")) { - *sc = SC_ACCEPT_CHARSET; - } else if(!strcasecmp(header_name + 7, "encoding")) { - *sc = SC_ACCEPT_ENCODING; - } else if(!strcasecmp(header_name + 7, "language")) { - *sc = SC_ACCEPT_LANGUAGE; - } else { - return APR_EGENERAL; - } - } else if ('\0' == header_name[6]) { - *sc = SC_ACCEPT; - } else { - return APR_EGENERAL; + char header[24]; + apr_size_t len = strlen(header_name); + const char *p = header_name; + int i = 0; + + /* ACCEPT-CONTENT_LENGTH is the longest headeer + * that is of interest. + */ + if (len < 4 || len > 21) + return UNKNOWN_METHOD; + + while (*p) + header[i++] = apr_toupper(*p++); + header[i] = '\0'; + p = &header[1]; + + switch (header[0]) { + case 'A': + if (memcmp(p, "CCEPT", 5) == 0) { + if (!header[6]) + return SC_ACCEPT; + else if (header[6] == '-') { + p += 6; + if (memcmp(p, "CHARSET", 7) == 0) + return SC_ACCEPT_CHARSET; + else if (memcmp(p, "ENCODING", 8)) + return SC_ACCEPT_ENCODING; + else if (memcmp(p, "LANGUAGE", 8)) + return SC_ACCEPT_LANGUAGE; + else + return UNKNOWN_METHOD; } - } else if (!strcasecmp(header_name, "authorization")) { - *sc = SC_AUTHORIZATION; - } else { - return APR_EGENERAL; - } - break; - - case 'c': - if(!strcasecmp(header_name, "cookie")) { - *sc = SC_COOKIE; - } else if(!strcasecmp(header_name, "connection")) { - *sc = SC_CONNECTION; - } else if(!strcasecmp(header_name, "content-type")) { - *sc = SC_CONTENT_TYPE; - } else if(!strcasecmp(header_name, "content-length")) { - *sc = SC_CONTENT_LENGTH; - } else if(!strcasecmp(header_name, "cookie2")) { - *sc = SC_COOKIE2; - } else { - return APR_EGENERAL; + else + return UNKNOWN_METHOD; } + else if (memcmp(p, "UTHORIZATION", 12) == 0) + return SC_AUTHORIZATION; + else + return UNKNOWN_METHOD; + break; + case 'C': + if (memcmp(p, "OOKIE", 5) == 0) + return SC_COOKIE; + else if(memcmp(p, "ONNECTION", 9) == 0) + return SC_CONNECTION; + else if(memcmp(p, "ONTENT_TYPE", 11) == 0) + return SC_CONTENT_TYPE; + else if(memcmp(p, "ONTENT_LENGTH", 13) == 0) + return SC_CONTENT_LENGTH; + else if(memcmp(p, "OOKIE2", 6) == 0) + return SC_COOKIE2; + else + return UNKNOWN_METHOD; + break; + case 'H': + if(memcmp(p, "OST", 3) == 0) + return SC_HOST; + else + return UNKNOWN_METHOD; + break; + case 'P': + if(memcmp(p, "RAGMA", 5) == 0) + return SC_PRAGMA; + else + return UNKNOWN_METHOD; + break; + case 'R': + if(memcmp(p, "EFERER", 6) == 0) + return SC_REFERER; + else + return UNKNOWN_METHOD; + break; + case 'U': + if(memcmp(p, "SER_AGENT", 9) == 0) + return SC_USER_AGENT; + else + return UNKNOWN_METHOD; break; - - case 'h': - if(!strcasecmp(header_name, "host")) { - *sc = SC_HOST; - } else { - return APR_EGENERAL; - } - break; - - case 'p': - if(!strcasecmp(header_name, "pragma")) { - *sc = SC_PRAGMA; - } else { - return APR_EGENERAL; - } - break; - - case 'r': - if(!strcasecmp(header_name, "referer")) { - *sc = SC_REFERER; - } else { - return APR_EGENERAL; - } - break; - - case 'u': - if(!strcasecmp(header_name, "user-agent")) { - *sc = SC_USER_AGENT; - } else { - return APR_EGENERAL; - } - break; - default: - return APR_EGENERAL; + return UNKNOWN_METHOD; } - return APR_SUCCESS; + /* NOTREACHED */ } @@ -376,18 +376,19 @@ } for (i = 0 ; i < num_headers ; i++) { - apr_uint16_t sc; + int sc; const apr_array_header_t *t = apr_table_elts(r->headers_in); const apr_table_entry_t *elts = (apr_table_entry_t *)t->elts; - if (sc_for_req_header(elts[i].key, &sc)) { - if (ajp_msg_append_uint16(msg, sc)) { + if ((sc = sc_for_req_header(elts[i].key)) != UNKNOWN_METHOD) { + if (ajp_msg_append_uint16(msg, (apr_uint16_t)sc)) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "Error ajp_marshal_into_msgb - " "Error appending the header name"); return APR_EGENERAL; } - } else { + } + else { if (ajp_msg_append_string(msg, elts[i].key)) { ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, "Error ajp_marshal_into_msgb - "
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]