mturk       2004/12/15 12:31:17

  Modified:    jk/native/common jk_ajp_common.c
  Log:
  Backport sc_for_req_header from mod_proxy.
  It uses case insensitive matching.
  
  Revision  Changes    Path
  1.67      +83 -95    
jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c
  
  Index: jk_ajp_common.c
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_ajp_common.c,v
  retrieving revision 1.66
  retrieving revision 1.67
  diff -u -r1.66 -r1.67
  --- jk_ajp_common.c   13 Dec 2004 07:39:51 -0000      1.66
  +++ jk_ajp_common.c   15 Dec 2004 20:31:16 -0000      1.67
  @@ -68,10 +68,11 @@
       "WWW-Authenticate"
   };
   
  -static const char *long_res_header_for_sc(int sc)
  +static const char *long_res_header_for_sc(int sc) 
   {
       const char *rc = NULL;
  -    if (sc <= SC_RES_HEADERS_NUM && sc > 0) {
  +    sc = sc & 0X00FF;
  +    if(sc <= SC_RES_HEADERS_NUM && sc > 0) {
           rc = response_trans_headers[sc - 1];
       }
   
  @@ -170,105 +171,92 @@
       return rc;
   }
   
  -static int sc_for_req_header(const char *header_name, unsigned short *sc)
  +#define UNKNOWN_METHOD (-1)
  +
  +static int sc_for_req_header(const char *header_name)
   {
  -    switch (header_name[0]) {
  -    case 'a':
  -        if ('c' == header_name[1] &&
  -            'c' == header_name[2] &&
  -            'e' == header_name[3] &&
  -            'p' == header_name[4] && 't' == header_name[5]) {
  -            if ('-' == header_name[6]) {
  -                if (!strcmp(header_name + 7, "charset")) {
  -                    *sc = SC_ACCEPT_CHARSET;
  -                }
  -                else if (!strcmp(header_name + 7, "encoding")) {
  -                    *sc = SC_ACCEPT_ENCODING;
  -                }
  -                else if (!strcmp(header_name + 7, "language")) {
  -                    *sc = SC_ACCEPT_LANGUAGE;
  -                }
  -                else {
  -                    return JK_FALSE;
  +    char header[16];
  +    size_t len = strlen(header_name);
  +    const char *p = header_name;
  +    int i = 0;
  +
  +    /* ACCEPT-LANGUAGE is the longest headeer
  +     * that is of interest.
  +     */
  +    if (len < 4 || len > 15)
  +        return UNKNOWN_METHOD;
  +    
  +    while (*p)
  +        header[i++] = toupper((unsigned char)*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) == 0)
  +                        return SC_ACCEPT_ENCODING;
  +                    else if (memcmp(p, "LANGUAGE", 8) == 0)
  +                        return SC_ACCEPT_LANGUAGE;
  +                    else
  +                        return UNKNOWN_METHOD;
                   }
  +                else
  +                    return UNKNOWN_METHOD;
               }
  -            else if ('\0' == header_name[6]) {
  -                *sc = SC_ACCEPT;
  -            }
  -            else {
  -                return JK_FALSE;
  -            }
  -        }
  -        else if (!strcmp(header_name, "authorization")) {
  -            *sc = SC_AUTHORIZATION;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +            else if (memcmp(p, "UTHORIZATION", 12) == 0)
  +                return SC_AUTHORIZATION;
  +            else
  +                return UNKNOWN_METHOD;
           break;
  -
  -    case 'c':
  -        if (!strcmp(header_name, "cookie")) {
  -            *sc = SC_COOKIE;
  -        }
  -        else if (!strcmp(header_name, "connection")) {
  -            *sc = SC_CONNECTION;
  -        }
  -        else if (!strcmp(header_name, "content-type")) {
  -            *sc = SC_CONTENT_TYPE;
  -        }
  -        else if (!strcmp(header_name, "content-length")) {
  -            *sc = SC_CONTENT_LENGTH;
  -        }
  -        else if (!strcmp(header_name, "cookie2")) {
  -            *sc = SC_COOKIE2;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +        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 (!strcmp(header_name, "host")) {
  -            *sc = SC_HOST;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +        case 'H':
  +            if(memcmp(p, "OST", 3) == 0)
  +                return SC_HOST;
  +            else
  +                return UNKNOWN_METHOD;
           break;
  -
  -    case 'p':
  -        if (!strcmp(header_name, "pragma")) {
  -            *sc = SC_PRAGMA;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +        case 'P':
  +            if(memcmp(p, "RAGMA", 5) == 0)
  +                return SC_PRAGMA;
  +            else
  +                return UNKNOWN_METHOD;
           break;
  -
  -    case 'r':
  -        if (!strcmp(header_name, "referer")) {
  -            *sc = SC_REFERER;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +        case 'R':
  +            if(memcmp(p, "EFERER", 6) == 0)
  +                return SC_REFERER;
  +            else
  +                return UNKNOWN_METHOD;
           break;
  -
  -    case 'u':
  -        if (!strcmp(header_name, "user-agent")) {
  -            *sc = SC_USER_AGENT;
  -        }
  -        else {
  -            return JK_FALSE;
  -        }
  +        case 'U':
  +            if(memcmp(p, "SER-AGENT", 9) == 0)
  +                return SC_USER_AGENT;
  +            else
  +                return UNKNOWN_METHOD;
           break;
  -
  -    default:
  -        return JK_FALSE;
  +        default:
  +            return UNKNOWN_METHOD;
       }
  -
  -    return JK_TRUE;
  +    /* NOTREACHED */
   }
   
   
  @@ -339,10 +327,10 @@
       }
   
       for (i = 0; i < s->num_headers; i++) {
  -        unsigned short sc;
  +        int sc;
   
  -        if (sc_for_req_header(s->headers_names[i], &sc)) {
  -            if (jk_b_append_int(msg, sc)) {
  +        if ((sc = sc_for_req_header(s->headers_names[i])) != UNKNOWN_METHOD) 
{
  +            if (jk_b_append_int(msg, (unsigned short)sc)) {
                   jk_log(l, JK_LOG_ERROR,
                          "failed appending the header name\n");
                   JK_TRACE_EXIT(l);
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to