costin 01/12/15 09:23:28 Modified: jk/native2/common jk_handler_response.c Log: Change the storage of headers and attributes. The start_response methods was changed - it didn't actually started the response, but set the fields in request_rec. ( probably in a jk3 we should change jk_service to use virtual methods, and use directly the 'original' server structure and methods ) Revision Changes Path 1.9 +55 -56 jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c Index: jk_handler_response.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_response.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- jk_handler_response.c 2001/12/14 07:12:42 1.8 +++ jk_handler_response.c 2001/12/15 17:23:28 1.9 @@ -116,81 +116,80 @@ jk_endpoint_t *ae, jk_logger_t *l) { - int err; - unsigned i; + int err=JK_FALSE; + int i; jk_pool_t * pool = s->pool; + int headerCount; s->status = msg->getInt(msg); s->msg = (char *)msg->getString(msg); if (s->msg) { jk_xlate_from_ascii(s->msg, strlen(s->msg)); + /* Do we want this ? Probably not needed, but safer ! */ + s->msg = ae->cPool->pstrdup( ae->cPool, s->msg ); } - s->out_headers = msg->getInt(msg); - s->out_header_names = NULL; - s->out_header_values = NULL; - - if (s->out_headers > 0 ) { - s->out_header_names = pool->alloc(pool, sizeof(char *) * s->out_headers); - s->out_header_values = pool->alloc(pool, sizeof(char *) * s->out_headers); - - if (s->out_header_names==NULL || - s->out_header_values==NULL) { - l->jkLog(l, JK_LOG_ERROR, - "handler.startResponse() OutOfMemoryError %d headers\n", - s->out_headers); - return JK_HANDLER_FATAL; - } - for(i = 0 ; i < s->out_headers ; i++) { - unsigned short name = msg->peekInt(msg) ; + headerCount = msg->getInt(msg); + + /* XXX assert msg->headers_out is set - the server adapter should know what + kind of map to use ! */ - if ((name & 0XFF00) == 0XA000) { - msg->getInt(msg); - name = name & 0X00FF; - if (name <= SC_RES_HEADERS_NUM) { - s->out_header_names[i] = - (char *)jk_requtil_getHeaderById(name); - } else { - l->jkLog(l, JK_LOG_ERROR, - "handler.response() Invalid header id (%d)\n", - name); - return JK_HANDLER_FATAL; - } + for(i = 0 ; i < headerCount ; i++) { + char *nameS; + char *valueS; + unsigned short name = msg->peekInt(msg) ; + + if ((name & 0XFF00) == 0XA000) { + msg->getInt(msg); + name = name & 0X00FF; + if (name <= SC_RES_HEADERS_NUM) { + nameS = + (char *)jk_requtil_getHeaderById(name); } else { - s->out_header_names[i] = (char *)msg->getString(msg); - if (!s->out_header_names[i]) { - l->jkLog(l, JK_LOG_ERROR, - "handler.response() Null header name \n"); - return JK_HANDLER_FATAL; - } - jk_xlate_from_ascii(s->out_header_names[i], - strlen(s->out_header_names[i])); + l->jkLog(l, JK_LOG_ERROR, + "handler.response() Invalid header id (%d)\n", + name); + return JK_HANDLER_FATAL; } - s->out_header_values[i] = (char *)msg->getString(msg); - if (!s->out_header_values[i]) { + } else { + nameS = (char *)msg->getString(msg); + if (nameS==NULL) { l->jkLog(l, JK_LOG_ERROR, - "Error ajp_unmarshal_response - Null header value\n"); + "handler.response() Null header name \n"); return JK_HANDLER_FATAL; } - - jk_xlate_from_ascii(s->out_header_values[i], - strlen(s->out_header_values[i])); - - l->jkLog(l, JK_LOG_DEBUG, - "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", - i, - s->out_header_names[i], - s->out_header_values[i]); + jk_xlate_from_ascii(nameS, strlen(nameS)); } + + valueS = (char *)msg->getString(msg); + if (valueS==NULL ) { + l->jkLog(l, JK_LOG_ERROR, + "Error ajp_unmarshal_response - Null header value\n"); + return JK_HANDLER_FATAL; + } + + jk_xlate_from_ascii(valueS, + strlen(valueS)); + + l->jkLog(l, JK_LOG_DEBUG, + "ajp_unmarshal_response: Header[%d] [%s] = [%s]\n", + i, nameS, valueS); + + /* Do we want this ? Preserve the headers, maybe someone will + need them. Alternative is to use a different buffer every time, + which may be more efficient. */ + /* We probably don't need that, we'll send them in the next call */ +/*Apache does it - will change if we add jk_map_apache + nameS=ae->cPool->pstrdup( ae->cPool, nameS ); */ +/* valueS=ae->cPool->pstrdup( ae->cPool, valueS ); */ + + s->headers_out->add( NULL, s->headers_out, nameS, valueS ); } l->jkLog(l, JK_LOG_INFO, "handler.response(): status=%d headers=%d\n", - s->status, s->out_headers); + s->status, headerCount); - err=s->start_response(s, s->status, s->msg, - (const char * const *)s->out_header_names, - (const char * const *)s->out_header_values, - s->out_headers); + err=s->head(s); if( err!=JK_TRUE ) { l->jkLog(l, JK_LOG_ERROR, "handler.response() Error sending response");
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>