You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2001/12/15 18:29:35 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/server/apache2 jk_service_apache2.c

costin      01/12/15 09:29:35

  Modified:    jk/native2/server/apache2 jk_service_apache2.c
  Log:
  Changed to use jk_map for headers and attributes.
  
  Use jk_map_aprtable ( conditional of USE_APRTABLES ) to avoid copying
  and to use directly the native data structures.
  
  Revision  Changes    Path
  1.3       +117 -122  jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c
  
  Index: jk_service_apache2.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- jk_service_apache2.c	2001/12/13 19:05:31	1.2
  +++ jk_service_apache2.c	2001/12/15 17:29:35	1.3
  @@ -59,7 +59,7 @@
    * Description: Apache 2 plugin for Jakarta/Tomcat                         
    * Author:      Gal Shachor <sh...@il.ibm.com>                           
    *                 Henri Gomez <hg...@slib.fr>                            
  - * Version:     $Revision: 1.2 $                                           
  + * Version:     $Revision: 1.3 $                                           
    */
   
   #include "apu_compat.h"
  @@ -92,59 +92,65 @@
   
   #include "jk_apache2.h"
   
  +#define USE_APRTABLES
  +
   #define NULL_FOR_EMPTY(x)   ((x && !strlen(x)) ? NULL : x) 
   
  -static int JK_METHOD ws_start_response(jk_ws_service_t *s,
  -                                       int status,
  -                                       const char *reason,
  -                                       const char * const *header_names,
  -                                       const char * const *header_values,
  -                                       unsigned num_of_headers)
  +static int JK_METHOD jk_service_apache2_head(jk_ws_service_t *s )
   {
  -    if(s && s->ws_private) {
  -        unsigned h;
  -        request_rec *r = (request_rec *)s->ws_private;  
  +    int h;
  +    request_rec *r;
  +    jk_map_t *headers;
  +    
  +    if(s==NULL ||  s->ws_private==NULL )
  +        return JK_FALSE;
  +    
  +    r = (request_rec *)s->ws_private;  
           
  -        if(!reason) {
  -            reason = "";
  -        }
  -        r->status = status;
  -        r->status_line = apr_psprintf(r->pool, "%d %s", status, reason);
  +    if(s->msg==NULL) {
  +        s->msg = "";
  +    }
  +    r->status = s->status;
  +    r->status_line = apr_psprintf(r->pool, "%d %s", s->status, s->msg);
   
  -        for(h = 0 ; h < num_of_headers ; h++) {
  -            if(!strcasecmp(header_names[h], "Content-type")) {
  -                char *tmp = apr_pstrdup(r->pool, header_values[h]);
  -                ap_content_type_tolower(tmp);
  -                r->content_type = tmp;
  -            } else if(!strcasecmp(header_names[h], "Location")) {
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Content-Length")) {
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Transfer-Encoding")) {
  -                apr_table_set(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            } else if(!strcasecmp(header_names[h], "Last-Modified")) {
  -                /*
  -                 * If the script gave us a Last-Modified header, we can't just
  -                 * pass it on blindly because of restrictions on future values.
  -                 */
  -                ap_update_mtime(r, ap_parseHTTPdate(header_values[h]));
  -                ap_set_last_modified(r);
  -            } else {                
  -                apr_table_add(r->headers_out, 
  -                              header_names[h], header_values[h]);
  -            }
  +    headers=s->headers_out;
  +    /* XXX As soon as we switch to jk_map_apache2, this will not be needed ! */
  +    
  +    for(h = 0 ; h < headers->size( NULL, headers ) ; h++) {
  +        char *name=headers->nameAt( NULL, headers, h );
  +        char *val=headers->valueAt( NULL, headers, h );
  +
  +        /* the cmp can also be avoided in we do this earlier and use
  +           the header id */
  +        if(!strcasecmp(name, "Content-type")) {
  +            /* XXX should be done in handler ! */
  +            char *tmp = apr_pstrdup(r->pool, val);
  +            ap_content_type_tolower(tmp); 
  +            r->content_type = tmp;
  +        } else if(!strcasecmp(name, "Location")) {
  +            /* XXX setn */
  +            apr_table_set(r->headers_out, name, val);
  +        } else if(!strcasecmp(name, "Content-Length")) {
  +            apr_table_set(r->headers_out, name, val );
  +        } else if(!strcasecmp(name, "Transfer-Encoding")) {
  +            apr_table_set(r->headers_out,name, val);
  +        } else if(!strcasecmp(name, "Last-Modified")) {
  +            /*
  +             * If the script gave us a Last-Modified header, we can't just
  +             * pass it on blindly because of restrictions on future values.
  +             */
  +            ap_update_mtime(r, ap_parseHTTPdate(val));
  +            ap_set_last_modified(r);
  +        } else {                
  +            apr_table_add(r->headers_out, name, val);
           }
  -
  -        /* this NOP function was removed in apache 2.0 alpha14 */
  -        /* ap_send_http_header(r); */
  -        s->response_started = JK_TRUE;
  -          
  -        return JK_TRUE;
       }
  -    return JK_FALSE;
  +
  +    /* this NOP function was removed in apache 2.0 alpha14 */
  +    /* ap_send_http_header(r); */
  +    s->response_started = JK_TRUE;
  +    
  +    return JK_TRUE;
   }
   
   /*
  @@ -156,10 +162,9 @@
    * the jk_ws_service class.  Think of the *s param as a "this" or "self"
    * pointer.
    */
  -static int JK_METHOD ws_read(jk_ws_service_t *s,
  -                             void *b,
  -                             unsigned len,
  -                             unsigned *actually_read)
  +static int JK_METHOD jk_service_apache2_read(jk_ws_service_t *s,
  +                                             void *b, unsigned len,
  +                                             unsigned *actually_read)
   {
       if(s && s->ws_private && b && actually_read) {
           if(!s->read_body_started) {
  @@ -197,9 +202,9 @@
   #define CHUNK_SIZE 4096
   #endif
   
  -static int JK_METHOD ws_write(jk_ws_service_t *s,
  -                              const void *b,
  -                              unsigned len)
  +static int JK_METHOD jk_service_apache2_write(jk_ws_service_t *s,
  +                                              const void *b,
  +                                              unsigned len)
   {
       jk_logger_t *l=s->workerEnv->l;
       
  @@ -214,7 +219,7 @@
               if(!s->response_started) {
                   l->jkLog(l, JK_LOG_DEBUG, 
                          "Write without start, starting with defaults\n");
  -                if(!s->start_response(s, 200, NULL, NULL, NULL, 0)) {
  +                if(!s->head(s)) {
                       return JK_FALSE;
                   }
               }
  @@ -281,6 +286,7 @@
       jk_workerEnv_t *workerEnv=e->worker->workerEnv;
       jk_logger_t *l=workerEnv->l;
       request_rec *r=serverObj;
  +    int need_content_length_header=JK_FALSE;
   
       /* Common initialization */
       /* XXX Probably not needed, we're duplicating */
  @@ -402,84 +408,73 @@
               }
           }
   
  +#ifdef USE_APRTABLES
  +        /* We can't do that - the filtering should happen in
  +           common to enable that.
  +           
  +          jk_map_aprtable_factory( workerEnv->env, s->pool,
  +          &s->attributes,
  +          "map", "aprtable" );
  +          s->attributes->init( NULL, s->attributes, 0, XXX);
  +        */
  +        jk_map_default_create(NULL, &s->attributes, s->pool );
  +#else
  +        jk_map_default_create(NULL, &s->attributes, s->pool );
  +#endif
  +        
           if(workerEnv->envvars_in_use) {
  -            const apr_array_header_t *t = apr_table_elts(workerEnv->envvars);
  -            if(t && t->nelts) {
  -                int i;
  -                apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;
  -                s->attributes_names = apr_palloc(r->pool, 
  -                                                 sizeof(char *) * t->nelts);
  -                s->attributes_values = apr_palloc(r->pool, 
  -                                                  sizeof(char *) * t->nelts);
  -
  -                for(i = 0 ; i < t->nelts ; i++) {
  -                    s->attributes_names[i] = elts[i].key;
  -                    s->attributes_values[i] = 
  -                        (char *)apr_table_get(r->subprocess_env, elts[i].key);
  -                    if(!s->attributes_values[i]) {
  -                        s->attributes_values[i] = elts[i].val;
  -                    }
  -                }
  +            int envCnt=workerEnv->envvars->size( NULL, workerEnv->envvars );
  +            int i;
   
  -                s->num_attributes = t->nelts;
  +            for( i=0; i< envCnt ; i++ ) {
  +                char *name= workerEnv->envvars->nameAt( NULL, workerEnv->envvars, i );
  +                char *val= (char *)apr_table_get(r->subprocess_env, name);
  +                if(val==NULL) {
  +                    val=workerEnv->envvars->valueAt( NULL, workerEnv->envvars, i );
  +                }
  +                s->attributes->put( NULL, s->attributes, name, val, NULL );
               }
           }
       }
  +
  +#ifdef USE_APRTABLES
  +    jk_map_aprtable_factory( workerEnv->env, s->pool,
  +                             &s->headers_in,
  +                             "map", "aprtable" );
  +    s->headers_in->init( NULL, s->headers_in, 0, r->headers_in);
  +#else
  +    jk_map_default_create(NULL, &s->headers_in, s->pool );
   
  -    s->headers_names    = NULL;
  -    s->headers_values   = NULL;
  -    s->num_headers      = 0;
       if(r->headers_in && apr_table_elts(r->headers_in)) {
  -        int need_content_length_header =
  -            (!s->is_chunked && s->content_length == 0) ? JK_TRUE : JK_FALSE;
  -        
           const apr_array_header_t *t = apr_table_elts(r->headers_in);
           if(t && t->nelts) {
               int i;
  +
               apr_table_entry_t *elts = (apr_table_entry_t *)t->elts;
  -            s->num_headers = t->nelts;
  -            /* allocate an extra header slot in case we need to add a
  -               content-length header */
  -            s->headers_names  =
  -                apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
  -            s->headers_values =
  -                apr_palloc(r->pool, sizeof(char *) * (t->nelts + 1));
  -            if(!s->headers_names || !s->headers_values)
  -                return JK_FALSE;
  +
               for(i = 0 ; i < t->nelts ; i++) {
  -                char *hname = apr_pstrdup(r->pool, elts[i].key);
  -                s->headers_values[i] = apr_pstrdup(r->pool, elts[i].val);
  -                s->headers_names[i] = hname;
  -                while(*hname) {
  -                    *hname = tolower(*hname);
  -                    hname++;
  -                }
  -                if(need_content_length_header &&
  -                        !strncmp(s->headers_values[i],"content-length",14)) {
  -                    need_content_length_header = JK_FALSE;
  -                }
  +                s->headers_in->add( NULL, s->headers_in,
  +                                    elts[i].key, elts[i].val);
               }
  -            /* Add a content-length = 0 header if needed.
  -             * Ajp13 assumes an absent content-length header means an unknown,
  -             * but non-zero length body.
  -             */
  -            if(need_content_length_header) {
  -                s->headers_names[s->num_headers] = "content-length";
  -                s->headers_values[s->num_headers] = "0";
  -                s->num_headers++;
  -            }
           }
  -        /* Add a content-length = 0 header if needed.*/
  -        else if (need_content_length_header) {
  -            s->headers_names  = apr_palloc(r->pool, sizeof(char *));
  -            s->headers_values = apr_palloc(r->pool, sizeof(char *));
  -            if(!s->headers_names || !s->headers_values)
  -                return JK_FALSE;
  -            s->headers_names[0] = "content-length";
  -            s->headers_values[0] = "0";
  -            s->num_headers++;
  -        }
       }
  +#endif
  +
  +    if(!s->is_chunked && s->content_length == 0) {
  +        /* XXX if r->contentLength == 0 I assume there's no header
  +           or a header with '0'. In the second case, put will override it 
  +         */
  +        s->headers_in->put( NULL, s->headers_in, "content-length", "0", NULL );
  +    }
  +
  +#ifdef USE_APRTABLES
  +    jk_map_aprtable_factory( workerEnv->env, s->pool,
  +                             &s->headers_out,
  +                             "map", "aprtable" );
  +    s->headers_in->init( NULL, s->headers_out, 0, r->headers_out);
  +#else
  +    jk_map_default_create(NULL, &s->headers_out, s->pool );
  +#endif
   
       return JK_TRUE;
   }
  @@ -527,10 +522,10 @@
           return JK_FALSE;
       }
   
  -    s->start_response   = ws_start_response;
  -    s->read             = ws_read;
  -    s->write            = ws_write;
  -    s->init             = init_ws_service;
  +    s->head   = jk_service_apache2_head;
  +    s->read   = jk_service_apache2_read;
  +    s->write  = jk_service_apache2_write;
  +    s->init   = init_ws_service;
       s->afterRequest     = jk_service_apache2_afterRequest;
       
       *result=(void *)s;
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>