costin 02/04/18 19:34:38 Modified: jk/native2/server/isapi jk_service_iis.c Log: Update, after merging few dozens cvs conflicts :-) Nacho already did most of the changes - I moved some stuff that is not iis-specific in common and tried to reduce it to the essential. Revision Changes Path 1.4 +227 -454 jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c Index: jk_service_iis.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/isapi/jk_service_iis.c,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- jk_service_iis.c 19 Apr 2002 00:23:45 -0000 1.3 +++ jk_service_iis.c 19 Apr 2002 02:34:38 -0000 1.4 @@ -59,8 +59,7 @@ * Description: IIS Jk2 Service * Author: Gal Shachor <[EMAIL PROTECTED]> * Henri Gomez <[EMAIL PROTECTED]> - * Ignacio J. Ortega <[EMAIL PROTECTED]> - * Version: $Revision: 1.3 $ + * Ignacio J. Ortega <[EMAIL PROTECTED]> */ // This define is needed to include wincrypt,h, needed to get client certificates @@ -71,7 +70,7 @@ #include <wininet.h> #include "jk_global.h" -//#include "jk_util.h" +#include "jk_requtil.h" #include "jk_map.h" #include "jk_pool.h" #include "jk_env.h" @@ -79,387 +78,134 @@ #include "jk_worker.h" #include "jk_iis.h" -//#include "jk_uri_worker_map.h" static char *SERVER_NAME = "SERVER_NAME"; static char *SERVER_SOFTWARE = "SERVER_SOFTWARE"; -static const char begin_cert [] = - "-----BEGIN CERTIFICATE-----\r\n"; -static const char end_cert [] = - "-----END CERTIFICATE-----\r\n"; - -static const char basis_64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -static int base64_encode_cert_len(int len) -{ - int n = ((len + 2) / 3 * 4) + 1; // base64 encoded size - n += (n + 63 / 64) * 2; // add CRLF's - n += sizeof(begin_cert) + sizeof(end_cert) - 2; // add enclosing strings. - return n; -} - -static int base64_encode_cert(char *encoded, - const unsigned char *string, int len) -{ - int i,c; - char *p; - const char *t; - - p = encoded; - - t = begin_cert; - while (*t != '\0') - *p++ = *t++; - - c = 0; - for (i = 0; i < len - 2; i += 3) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2) | - ((int) (string[i + 2] & 0xC0) >> 6)]; - *p++ = basis_64[string[i + 2] & 0x3F]; - c += 4; - if ( c >= 64 ) { - *p++ = '\r'; - *p++ = '\n'; - c = 0; - } - } - if (i < len) { - *p++ = basis_64[(string[i] >> 2) & 0x3F]; - if (i == (len - 1)) { - *p++ = basis_64[((string[i] & 0x3) << 4)]; - *p++ = '='; - } - else { - *p++ = basis_64[((string[i] & 0x3) << 4) | - ((int) (string[i + 1] & 0xF0) >> 4)]; - *p++ = basis_64[((string[i + 1] & 0xF) << 2)]; - } - *p++ = '='; - c++; - } - if ( c != 0 ) { - *p++ = '\r'; - *p++ = '\n'; - } - - t = end_cert; - while (*t != '\0') - *p++ = *t++; - - *p++ = '\0'; - return p - encoded; -} - - -static char x2c(const char *what) -{ - register char digit; - - digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 : (what[0] - '0')); - digit *= 16; - digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 : (what[1] - '0')); - return (digit); -} - -static int unescape_url(char *url) -{ - register int x, y, badesc, badpath; - - badesc = 0; - badpath = 0; - for (x = 0, y = 0; url[y]; ++x, ++y) { - if (url[y] != '%') - url[x] = url[y]; - else { - if (!isxdigit(url[y + 1]) || !isxdigit(url[y + 2])) { - badesc = 1; - url[x] = '%'; - } - else { - url[x] = x2c(&url[y + 1]); - y += 2; - if (url[x] == '/' || url[x] == '\0') - badpath = 1; - } - } - } - url[x] = '\0'; - if (badesc) - return BAD_REQUEST; - else if (badpath) - return BAD_PATH; - else - return 0; -} - -static void getparents(char *name) -{ - int l, w; - - /* Four paseses, as per RFC 1808 */ - /* a) remove ./ path segments */ - - for (l = 0, w = 0; name[l] != '\0';) { - if (name[l] == '.' && name[l + 1] == '/' && (l == 0 || name[l - 1] == '/')) - l += 2; - else - name[w++] = name[l++]; - } - - /* b) remove trailing . path, segment */ - if (w == 1 && name[0] == '.') - w--; - else if (w > 1 && name[w - 1] == '.' && name[w - 2] == '/') - w--; - name[w] = '\0'; - - /* c) remove all xx/../ segments. (including leading ../ and /../) */ - l = 0; - - while (name[l] != '\0') { - if (name[l] == '.' && name[l + 1] == '.' && name[l + 2] == '/' && - (l == 0 || name[l - 1] == '/')) { - register int m = l + 3, n; - - l = l - 2; - if (l >= 0) { - while (l >= 0 && name[l] != '/') - l--; - l++; - } - else - l = 0; - n = l; - while ((name[n] = name[m])) - (++n, ++m); - } - else - ++l; - } - - /* d) remove trailing xx/.. segment. */ - if (l == 2 && name[0] == '.' && name[1] == '.') - name[0] = '\0'; - else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' && name[l - 3] == '/') { - l = l - 4; - if (l >= 0) { - while (l >= 0 && name[l] != '/') - l--; - l++; - } - else - l = 0; - name[l] = '\0'; - } -} - -/* Apache code to escape a URL */ - -#define T_OS_ESCAPE_PATH (4) - -static const unsigned char test_char_table[256] = { - 0,14,14,14,14,14,14,14,14,14,15,14,14,14,14,14,14,14,14,14, - 14,14,14,14,14,14,14,14,14,14,14,14,14,0,7,6,1,6,1,1, - 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,8,15, - 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,15,15,15,7,0,7,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,15,7,15,1,14,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6 -}; - -#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f)) - -static const char c2x_table[] = "0123456789abcdef"; - -static unsigned char *c2x(unsigned what, unsigned char *where) -{ - *where++ = '%'; - *where++ = c2x_table[what >> 4]; - *where++ = c2x_table[what & 0xf]; - return where; -} - -static int escape_url(const char *path, char *dest, int destsize) -{ - const unsigned char *s = (const unsigned char *)path; - unsigned char *d = (unsigned char *)dest; - unsigned char *e = dest + destsize - 1; - unsigned char *ee = dest + destsize - 3; - unsigned c; - - while ((c = *s)) { - if (TEST_CHAR(c, T_OS_ESCAPE_PATH)) { - if (d >= ee ) - return JK_FALSE; - d = c2x(c, d); - } - else { - if (d >= e ) - return JK_FALSE; - *d++ = c; - } - ++s; - } - *d = '\0'; - return JK_TRUE; -} - - - -static void write_error_response(PHTTP_FILTER_CONTEXT pfc,char *status,char * msg) -{ - char crlf[3] = { (char)13, (char)10, '\0' }; - char ctype[30]; - DWORD len = strlen(msg); - - sprintf(ctype, - "Content-Type:text/html%s%s", - crlf, - crlf); - - /* reject !!! */ - pfc->ServerSupportFunction(pfc, - SF_REQ_SEND_RESPONSE_HEADER, - status, - (DWORD)crlf, - (DWORD)ctype); - pfc->WriteClient(pfc, msg, &len, 0); -} static int JK_METHOD jk2_service_iis_head(jk_env_t *env, jk_ws_service_t *s ){ static char crlf[3] = { (char)13, (char)10, '\0' }; - char *reason; + char *reason; + LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private; + DWORD len_of_status; + char *status_str; + char *headers_str; + int headerCount; + env->l->jkLog(env,env->l, JK_LOG_DEBUG, - "Into jk_ws_service_t::start_response\n"); + "Into jk_ws_service_t::start_response\n"); if (s->status< 100 || s->status > 1000) { env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::jk2_service_iis_head, invalid status %d\n", s->status); return JK_FALSE; } + + if (!s->response_started) { + return JK_TRUE; + } - if (s && s->ws_private) { - isapi_private_data_t *p = s->ws_private; - if (!p->request_started) { - DWORD len_of_status; - char *status_str; - char *headers_str; + if( lpEcb == NULL ) { + env->l->jkLog(env,env->l, JK_LOG_ERROR, + "jk_ws_service_t::start_response, no lpEcp\n"); + return JK_FALSE; + } + + s->response_started = JK_TRUE; + + /* + * Create the status line + */ + if (!s->msg) { + reason = ""; + } else { + reason = s->msg; + } - p->request_started = JK_TRUE; + status_str = (char *)_alloca((6 + strlen(reason)) * sizeof(char)); + sprintf(status_str, "%d %s", s->status, reason); + len_of_status = strlen(status_str); - /* - * Create the status line - */ - if (!s->msg) { - reason = ""; - } else { - reason = s->msg; - } - status_str = (char *)_alloca((6 + strlen(reason)) * sizeof(char)); - sprintf(status_str, "%d %s", s->status, reason); - len_of_status = strlen(status_str); + headerCount=s->headers_out->size( env, s->headers_out ); + /* + * Create response headers string + */ + if ( headerCount> 0 ) { + int i; + unsigned len_of_headers; - /* - * Create response headers string - */ - if (s->headers_out->size) { - int i; - unsigned len_of_headers; - for(i = 0 , len_of_headers = 0 ; i < s->headers_out->size(env,s->headers_out) ; i++) { - len_of_headers += strlen(s->headers_out->nameAt(env,s->headers_out,i)); - len_of_headers += strlen(s->headers_out->valueAt(env,s->headers_out,i)); - len_of_headers += 4; /* extra for colon, space and crlf */ - } - - len_of_headers += 3; /* crlf and terminating null char */ - headers_str = (char *)_alloca(len_of_headers * sizeof(char)); - headers_str[0] = '\0'; - - for(i = 0 ; i < s->headers_out->size(env,s->headers_out) ; i++) { - strcat(headers_str, s->headers_out->nameAt(env,s->headers_out,i)); - strcat(headers_str, ": "); - strcat(headers_str, s->headers_out->valueAt(env,s->headers_out,i)); - strcat(headers_str, crlf); - } - strcat(headers_str, crlf); - } else { - headers_str = crlf; - } - - if (!p->lpEcb->ServerSupportFunction(p->lpEcb->ConnID, - HSE_REQ_SEND_RESPONSE_HEADER, - status_str, - (LPDWORD)&len_of_status, - (LPDWORD)headers_str)) { - env->l->jkLog(env,env->l, JK_LOG_ERROR, - "jk_ws_service_t::jk2_service_iis_head, ServerSupportFunction failed\n"); - return JK_FALSE; - } - - + for(i = 0 , len_of_headers = 0 ; i < headerCount ; i++) { + len_of_headers += strlen(s->headers_out->nameAt(env,s->headers_out,i)); + len_of_headers += strlen(s->headers_out->valueAt(env,s->headers_out,i)); + len_of_headers += 4; /* extra for colon, space and crlf */ } - return JK_TRUE; - + + len_of_headers += 3; /* crlf and terminating null char */ + headers_str = (char *)_alloca(len_of_headers * sizeof(char)); + headers_str[0] = '\0'; + + for(i = 0 ; i < headerCount ; i++) { + strcat(headers_str, s->headers_out->nameAt(env,s->headers_out,i)); + strcat(headers_str, ": "); + strcat(headers_str, s->headers_out->valueAt(env,s->headers_out,i)); + strcat(headers_str, crlf); + } + } else { + headers_str = crlf; } - env->l->jkLog(env,env->l, JK_LOG_ERROR, - "jk_ws_service_t::jk2_service_iis_head, NULL parameters\n"); - - return JK_FALSE; + if (!lpEcb->ServerSupportFunction(lpEcb->ConnID, + HSE_REQ_SEND_RESPONSE_HEADER, + status_str, + (LPDWORD)&len_of_status, + (LPDWORD)headers_str)) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "jk_ws_service_t::start_response, ServerSupportFunction failed\n"); + return JK_FALSE; + } + + return JK_TRUE; } static int JK_METHOD jk2_service_iis_read(jk_env_t *env, jk_ws_service_t *s, - void *b, - unsigned l, - unsigned *a) + void *b, unsigned len, unsigned *actually_read) { - env->l->jkLog(env,env->l, JK_LOG_DEBUG, - "Into jk_ws_service_t::read\n"); - - if (s && s->ws_private && b && a) { - isapi_private_data_t *p = s->ws_private; + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "Into jk_ws_service_t::read\n"); + + if (s && s->ws_private && b && actually_read) { + LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private; - *a = 0; - if (l) { + *actually_read = 0; + if (len) { char *buf = b; - DWORD already_read = p->lpEcb->cbAvailable - p->bytes_read_so_far; + DWORD already_read = lpEcb->cbAvailable - s->content_read; - if (already_read >= l) { - memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, l); - p->bytes_read_so_far += l; - *a = l; + if (already_read >= len) { + memcpy(buf, lpEcb->lpbData + s->content_read, len); + s->content_read += len; + *actually_read = len; } else { /* * Try to copy what we already have */ if (already_read > 0) { - memcpy(buf, p->lpEcb->lpbData + p->bytes_read_so_far, already_read); + memcpy(buf, lpEcb->lpbData + s->content_read, already_read); buf += already_read; - l -= already_read; - p->bytes_read_so_far = p->lpEcb->cbAvailable; + len -= already_read; + s->content_read = lpEcb->cbAvailable; - *a = already_read; + *actually_read = already_read; } /* * Now try to read from the client ... */ - if (p->lpEcb->ReadClient(p->lpEcb->ConnID, buf, &l)) { - *a += l; + if (lpEcb->ReadClient(lpEcb->ConnID, buf, &len)) { + *actually_read += len; } else { env->l->jkLog(env,env->l, JK_LOG_ERROR, "jk_ws_service_t::read, ReadClient failed\n"); @@ -469,70 +215,53 @@ } return JK_TRUE; } - - env->l->jkLog(env,env->l, JK_LOG_ERROR, - "jk_ws_service_t::read, NULL parameters\n"); + + env->l->jkLog(env, env->l, JK_LOG_ERROR, + "jk_ws_service_t::read, NULL parameters\n"); return JK_FALSE; } -static int JK_METHOD jk2_service_iis_write(jk_env_t *env,jk_ws_service_t *s, - const void *b, - unsigned l) +static int JK_METHOD jk2_service_iis_write(jk_env_t *env, jk_ws_service_t *s, + const void *b, unsigned len) { - env->l->jkLog(env,env->l, JK_LOG_DEBUG, - "Into jk_ws_service_t::write\n"); - + env->l->jkLog(env, env->l, JK_LOG_DEBUG, + "Into jk_ws_service_t::write\n"); + if (s && s->ws_private && b) { - isapi_private_data_t *p = s->ws_private; - - if (l) { + LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)s->ws_private; + + if (len) { unsigned written = 0; char *buf = (char *)b; - - if (!p->request_started) { - jk2_service_iis_head(env, s ); + + if (!s->response_started) { + s->head(env, s ); } - - while(written < l) { - DWORD try_to_write = l - written; - if (!p->lpEcb->WriteClient(p->lpEcb->ConnID, - buf + written, - &try_to_write, - 0)) { - env->l->jkLog(env,env->l, JK_LOG_ERROR, + + while(written < len) { + DWORD try_to_write = len - written; + if (!lpEcb->WriteClient(lpEcb->ConnID, + buf + written, + &try_to_write, + 0)) { + env->l->jkLog(env, env->l, JK_LOG_ERROR, "jk_ws_service_t::write, WriteClient failed\n"); return JK_FALSE; } written += try_to_write; } } - + return JK_TRUE; - + } - - env->l->jkLog(env,env->l, JK_LOG_ERROR, + + env->l->jkLog(env, env->l, JK_LOG_ERROR, "jk_ws_service_t::write, NULL parameters\n"); - - return JK_FALSE; -} - - -int JK_METHOD jk2_service_iis_init(jk_env_t *env, jk_ws_service_t *s) -{ - if(s==NULL ) { - return JK_FALSE; - } - - s->head = jk2_service_iis_head; - s->read = jk2_service_iis_read; - s->write = jk2_service_iis_write; - s->init = jk2_service_iis_init_ws_service; - return JK_TRUE; + return JK_FALSE; } - static int get_server_value(LPEXTENSION_CONTROL_BLOCK lpEcb, char *name, char *buf, @@ -550,32 +279,49 @@ if (bufsz > 0) { buf[bufsz - 1] = '\0'; } + env->l->jkLog(env,env->l, JK_LOG_ERROR, + "jk_ws_service_t::write, NULL parameters\n"); return JK_TRUE; } +int JK_METHOD jk2_service_iis_init(jk_env_t *env, jk_ws_service_t *s) +{ + if(s==NULL ) { + return JK_FALSE; + } + + s->head = jk2_service_iis_head; + s->read = jk2_service_iis_read; + s->write = jk2_service_iis_write; + s->init = jk2_service_iis_init_ws_service; + + return JK_TRUE; +} + static int JK_METHOD jk2_service_iis_init_ws_service( struct jk_env *env, jk_ws_service_t *s, struct jk_worker *w, void *serverObj ) - /* */ - { - isapi_private_data_t *private_data=serverObj; - char huge_buf[16 * 1024]; /* should be enough for all */ - char **worker_name; + LPEXTENSION_CONTROL_BLOCK lpEcb=(LPEXTENSION_CONTROL_BLOCK)serverObj; + char **worker_name; DWORD huge_buf_sz; s->jvm_route = NULL; - - GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, (*worker_name)); + + s->head = jk_service_iis_head; + s->read = read; + s->write = write; + + GET_SERVER_VARIABLE_VALUE(HTTP_WORKER_HEADER_NAME, ( worker->name )); GET_SERVER_VARIABLE_VALUE(HTTP_URI_HEADER_NAME, s->req_uri); GET_SERVER_VARIABLE_VALUE(HTTP_QUERY_HEADER_NAME, s->query_string); - + if (s->req_uri == NULL) { - s->query_string = private_data->lpEcb->lpszQueryString; - *worker_name = DEFAULT_WORKER_NAME; + s->query_string = lpEcb->lpszQueryString; + /* *worker_name = DEFAULT_WORKER_NAME; */ GET_SERVER_VARIABLE_VALUE("URL", s->req_uri); if (unescape_url(s->req_uri) < 0) return JK_FALSE; @@ -588,18 +334,18 @@ GET_SERVER_VARIABLE_VALUE("REMOTE_HOST", s->remote_host); GET_SERVER_VARIABLE_VALUE("REMOTE_ADDR", s->remote_addr); GET_SERVER_VARIABLE_VALUE(SERVER_NAME, s->server_name); - GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80) + GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT", s->server_port, 80); GET_SERVER_VARIABLE_VALUE(SERVER_SOFTWARE, s->server_software); GET_SERVER_VARIABLE_VALUE_INT("SERVER_PORT_SECURE", s->is_ssl, 0); - s->method = private_data->lpEcb->lpszMethod; - s->content_length = private_data->lpEcb->cbTotalBytes; + s->method = lpEcb->lpszMethod; + s->content_length = lpEcb->cbTotalBytes; s->ssl_cert = NULL; s->ssl_cert_len = 0; s->ssl_cipher = NULL; s->ssl_session = NULL; - s->ssl_key_size = -1; + s->ssl_key_size = -1; jk2_map_default_create(env, &s->headers_in, s->pool ); // s->headers_values = NULL; @@ -643,46 +389,47 @@ if (num_of_vars) { unsigned j; - jk2_map_default_create(env, &s->attributes, s->pool ); - + jk2_map_default_create(env, &s->attributes, s->pool ); j = 0; for(i = 0 ; i < 9 ; i++) { if (ssl_env_values[i]) { - s->attributes->put(env,s->attributes,ssl_env_names[i],ssl_env_values[i],NULL); + s->attributes->put( env, s->attributes, + ssl_env_names[i], ssl_env_values[i]); j++; } } - if (ssl_env_values[4] && ssl_env_values[4][0] == '1') { - CERT_CONTEXT_EX cc; - DWORD cc_sz = sizeof(cc); - cc.cbAllocated = sizeof(huge_buf); - cc.CertContext.pbCertEncoded = (BYTE*) huge_buf; - cc.CertContext.cbCertEncoded = 0; - - if (private_data->lpEcb->ServerSupportFunction(private_data->lpEcb->ConnID, - (DWORD)HSE_REQ_GET_CERT_INFO_EX, - (LPVOID)&cc,NULL,NULL) != FALSE) - { - env->l->jkLog(env,env->l, JK_LOG_DEBUG,"Client Certificate encoding:%d sz:%d flags:%ld\n", - cc.CertContext.dwCertEncodingType & X509_ASN_ENCODING , - cc.CertContext.cbCertEncoded, - cc.dwCertificateFlags); - s->ssl_cert=private_data->p.alloc(env,&private_data->p, - base64_encode_cert_len(cc.CertContext.cbCertEncoded)); - - s->ssl_cert_len = base64_encode_cert(s->ssl_cert, - huge_buf,cc.CertContext.cbCertEncoded) - 1; - } - } + if (ssl_env_values[4] && ssl_env_values[4][0] == '1') { + CERT_CONTEXT_EX cc; + DWORD cc_sz = sizeof(cc); + cc.cbAllocated = sizeof(huge_buf); + cc.CertContext.pbCertEncoded = (BYTE*) huge_buf; + cc.CertContext.cbCertEncoded = 0; + + if (lpEcb->ServerSupportFunction(lpEcb->ConnID, + (DWORD)HSE_REQ_GET_CERT_INFO_EX, + (LPVOID)&cc,NULL,NULL) != FALSE) + { + env->l->jkLog(env, env->l, JK_LOG_DEBUG,"Client Certificate encoding:%d sz:%d flags:%ld\n", + cc.CertContext.dwCertEncodingType & X509_ASN_ENCODING , + cc.CertContext.cbCertEncoded, + cc.dwCertificateFlags); + s->ssl_cert=s->pool->alloc(env, s->pool, + jk_requtil_base64CertLen(cc.CertContext.cbCertEncoded)); + + s->ssl_cert_len = jk_requtil_base64EncodeCert(s->ssl_cert, + huge_buf,cc.CertContext.cbCertEncoded) - 1; + } + } } } - huge_buf_sz = sizeof(huge_buf); - if (get_server_value(private_data->lpEcb, - "ALL_HTTP", - huge_buf, - huge_buf_sz, - "")) { + + huge_buf_sz = sizeof(huge_buf); + if (get_server_value(lpEcb, + "ALL_HTTP", + huge_buf, + huge_buf_sz, + "")) { unsigned cnt = 0; char *tmp; @@ -691,46 +438,37 @@ cnt++; } } - + if (cnt) { - char *headers_buf = private_data->p.pstrdup(env,&private_data->p, huge_buf); + char *headers_buf = s->pool->pstrdup(env, s->pool, huge_buf); unsigned i; unsigned len_of_http_prefix = strlen("HTTP_"); BOOL need_content_length_header = (s->content_length == 0); cnt -= 2; /* For our two special headers */ /* allocate an extra header slot in case we need to add a content-length header */ -/* - s->headers_names = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); - s->headers_values = jk_pool_alloc(&private_data->p, (cnt + 1) * sizeof(char *)); - - if (!s->headers_names || !s->headers_values || !headers_buf) { - return JK_FALSE; - } - - */ + jk2_map_default_create(env, &s->headers_in, s->pool ); for(i = 0, tmp = headers_buf ; *tmp && i < cnt ; ) { int real_header = JK_TRUE; - char *name; - + char *headerName; /* Skipp the HTTP_ prefix to the beginning of th header name */ tmp += len_of_http_prefix; if (!strnicmp(tmp, URI_HEADER_NAME, strlen(URI_HEADER_NAME)) || - !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME))) { + !strnicmp(tmp, WORKER_HEADER_NAME, strlen(WORKER_HEADER_NAME))) { real_header = JK_FALSE; } else if(need_content_length_header && - !strnicmp(tmp, CONTENT_LENGTH, strlen(CONTENT_LENGTH))) { + !strnicmp(tmp, CONTENT_LENGTH, strlen(CONTENT_LENGTH))) { need_content_length_header = FALSE; - name = tmp; + headerName = tmp; } else if (!strnicmp(tmp, TOMCAT_TRANSLATE_HEADER_NAME, - strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { + strlen(TOMCAT_TRANSLATE_HEADER_NAME))) { tmp += 6; /* TOMCAT */ - name = tmp; + headerName = tmp; } else { - name = tmp; + headerName = tmp; } - + while(':' != *tmp && *tmp) { if ('_' == *tmp) { *tmp = '-'; @@ -748,7 +486,7 @@ } if (real_header) { - s->headers_in->put(env,s->headers_in,name,tmp,NULL); + s->headers_in->put( env, s->headers_in, headerName, tmp ); } while(*tmp != '\n' && *tmp != '\r') { @@ -756,12 +494,12 @@ } *tmp = '\0'; tmp++; - + /* skipp CR LF */ while(*tmp == '\n' || *tmp == '\r') { tmp++; } - + if (real_header) { i++; } @@ -771,7 +509,8 @@ * but non-zero length body. */ if(need_content_length_header) { - s->headers_in->put(env,s->headers_in,"content-length","0",NULL); + s->headers_in->put( env, s->headers_in, + "content-length", "0"); cnt++; } } else { @@ -785,4 +524,38 @@ return JK_TRUE; } +static void jk2_service_iis_afterRequest(jk_env_t *env, jk_ws_service_t *s ) +{ + + if (s->content_read < s->content_length || + (s->is_chunked && ! s->no_more_chunks)) { + + request_rec *r=s->ws_private; + + char *buff = apr_palloc(r->pool, 2048); + if (buff != NULL) { + int rd; + /* Is there a IIS equivalent ? */ + /* while ((rd = ap_get_client_block(r, buff, 2048)) > 0) { */ + /* s->content_read += rd; */ + /* } */ + } + } +} + + +int jk2_service_iis_init(jk_env_t *env, jk_ws_service_t *s) +{ + if(s==NULL ) { + return JK_FALSE; + } + + s->head = jk2_service_iis_head; + s->read = jk2_service_iis_read; + s->write = jk2_service_iis_write; + s->init = jk2_service_iis_initService; + s->afterRequest = jk2_service_iis_afterRequest; + + return JK_TRUE; +}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>