From d83c61bf73f66227471ddb3fcdad0e6c9336166d Mon Sep 17 00:00:00 2001 From: Jeff Trawick Date: Wed, 17 May 2000 03:19:38 +0000 Subject: [PATCH] include translation information in the request_rec; finish converting ap_bsetflag(B_ASCII2EBCDIC or B_EBCDIC2ASCII) to ap_bsetopt(BO_WXLATE or BO_RXLATE) git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85238 13f79535-47bb-0310-9956-ffa450edef68 --- include/httpd.h | 14 ++++ include/util_ebcdic.h | 4 +- modules/http/http_protocol.c | 138 ++++++++++++++++------------------- modules/http/http_request.c | 25 +++++-- 4 files changed, 96 insertions(+), 85 deletions(-) diff --git a/include/httpd.h b/include/httpd.h index b1f4b7289f..cf3f83e7f1 100644 --- a/include/httpd.h +++ b/include/httpd.h @@ -584,6 +584,16 @@ typedef struct request_rec request_rec; #include "util_uri.h" +#ifdef APACHE_XLATE +#include "apr_xlate.h" + +struct ap_rr_xlate { + /* contents are experimental! expect it to change! */ + ap_xlate_t *to_net; + ap_xlate_t *from_net; +}; +#endif /*APACHE_XLATE*/ + struct process_rec { ap_pool_t *pool; /* Global pool. Please try to cleared on _all_ exits */ ap_pool_t *pconf; /* aka configuration pool, cleared on restarts */ @@ -741,6 +751,10 @@ struct request_rec { */ const struct htaccess_result *htaccess; +#ifdef APACHE_XLATE + struct ap_rr_xlate *rrx; +#endif /*APACHE_XLATE*/ + /* Things placed at the end of the record to avoid breaking binary * compatibility. It would be nice to remember to reorder the entire * record to improve 64bit alignment the next time we need to break diff --git a/include/util_ebcdic.h b/include/util_ebcdic.h index 71c4d1dc1a..747da4ec59 100644 --- a/include/util_ebcdic.h +++ b/include/util_ebcdic.h @@ -66,9 +66,7 @@ extern "C" { #endif #include "apr_xlate.h" - -extern ap_xlate_t *ap_hdrs_to_ascii, *ap_hdrs_from_ascii; -extern ap_xlate_t *ap_locale_to_ascii, *ap_locale_from_ascii; +#include "util_charset.h" ap_status_t ap_init_ebcdic(ap_pool_t *); diff --git a/modules/http/http_protocol.c b/modules/http/http_protocol.c index 335f249801..6c09e64cc8 100644 --- a/modules/http/http_protocol.c +++ b/modules/http/http_protocol.c @@ -75,6 +75,7 @@ #include "http_log.h" /* For errors detected in basic auth common * support code... */ #include "util_date.h" /* For parseHTTPdate and BAD_DATE */ +#include "util_charset.h" #include "mpm_status.h" #include @@ -90,28 +91,6 @@ AP_HOOK_STRUCT( ap_bgetopt (r->connection->client, BO_BYTECT, &r->bytes_sent); \ } while (0) -#ifdef CHARSET_EBCDIC -/* Save & Restore the current conversion settings - * "input" means: ASCII -> EBCDIC (when reading MIME Headers and PUT/POST data) - * "output" means: EBCDIC -> ASCII (when sending MIME Headers and Chunks) - */ - -#define PUSH_EBCDIC_INPUTCONVERSION_STATE(_buff, _onoff) \ - int _convert_in = ap_bgetflag(_buff, B_ASCII2EBCDIC); \ - ap_bsetflag(_buff, B_ASCII2EBCDIC, _onoff); - -#define POP_EBCDIC_INPUTCONVERSION_STATE(_buff) \ - ap_bsetflag(_buff, B_ASCII2EBCDIC, _convert_in); - -#define PUSH_EBCDIC_OUTPUTCONVERSION_STATE(_buff, _onoff) \ - int _convert_out = ap_bgetflag(_buff, B_EBCDIC2ASCII); \ - ap_bsetflag(_buff, B_EBCDIC2ASCII, _onoff); - -#define POP_EBCDIC_OUTPUTCONVERSION_STATE(_buff) \ - ap_bsetflag(_buff, B_EBCDIC2ASCII, _convert_out); - -#endif /*CHARSET_EBCDIC*/ - /* * Builds the content-type that should be sent to the client from the * content-type specified. The following rules are followed: @@ -281,13 +260,14 @@ static int internal_byterange(int realreq, long *tlength, request_rec *r, { long range_start, range_end; char *range; -#ifdef CHARSET_EBCDIC - /* determine current setting of conversion flag, - * set to ON (protocol strings MUST be converted) - * and reset to original setting before returning +#ifdef APACHE_XLATE + /* determine current translation handle, set to the one for + * protocol strings, and reset to original setting before + * returning */ - PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); -#endif /*CHARSET_EBCDIC*/ + AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client, + ap_hdrs_to_ascii); +#endif /*APACHE_XLATE*/ if (!**r_range) { if (r->byterange > 1) { @@ -296,17 +276,17 @@ static int internal_byterange(int realreq, long *tlength, request_rec *r, else *tlength += 4 + strlen(r->boundary) + 4; } -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); +#endif /*APACHE_XLATE*/ return 0; } range = ap_getword(r->pool, r_range, ','); if (!parse_byterange(range, r->clength, &range_start, &range_end)) -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); +#endif /*APACHE_XLATE*/ /* Skip this one */ return internal_byterange(realreq, tlength, r, r_range, offset, length); @@ -333,9 +313,9 @@ static int internal_byterange(int realreq, long *tlength, request_rec *r, else { *tlength += range_end - range_start + 1; } -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); +#endif /*APACHE_XLATE*/ return 1; } @@ -750,17 +730,17 @@ static int getline(char *s, int n, BUFF *in, int fold) char *pos, next; int retval; int total = 0; -#ifdef CHARSET_EBCDIC +#ifdef APACHE_XLATE /* When getline() is called, the HTTP protocol is in a state * where we MUST be reading "plain text" protocol stuff, * (Request line, MIME headers, Chunk sizes) regardless of * the MIME type and conversion setting of the document itself. - * Save the current setting of the ASCII-EBCDIC conversion flag - * for uploads, then temporarily set it to ON + * Save the current setting of the translation handle for + * uploads, then temporarily set it to the one used for headers * (and restore it before returning). */ - PUSH_EBCDIC_INPUTCONVERSION_STATE(in, 1); -#endif /*CHARSET_EBCDIC*/ + AP_PUSH_INPUTCONVERSION_STATE(in, ap_hdrs_from_ascii); +#endif /*APACHE_XLATE*/ pos = s; @@ -804,10 +784,10 @@ static int getline(char *s, int n, BUFF *in, int fold) && (next = ap_blookc(in)) && ((next == ' ') || (next == '\t'))); -#ifdef CHARSET_EBCDIC - /* restore ASCII->EBCDIC conversion state */ - POP_EBCDIC_INPUTCONVERSION_STATE(in); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + /* restore translation handle */ + AP_POP_INPUTCONVERSION_STATE(in); +#endif /*APACHE_XLATE*/ return total; } @@ -1049,8 +1029,12 @@ request_rec *ap_read_request(conn_rec *conn) r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */ r->the_request = NULL; -#ifdef CHARSET_EBCDIC - ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1); +#ifdef APACHE_XLATE + r->rrx = ap_pcalloc(p, sizeof(struct ap_rr_xlate)); + r->rrx->to_net = ap_locale_to_ascii; + r->rrx->from_net = ap_locale_from_ascii; + ap_bsetopt(r->connection->client, BO_WXLATE, &ap_hdrs_to_ascii); + ap_bsetopt(r->connection->client, BO_RXLATE, &ap_hdrs_from_ascii); #endif ap_bsetopt(conn->client, BO_TIMEOUT, @@ -1263,7 +1247,7 @@ API_EXPORT(int) ap_get_basic_auth_pw(request_rec *r, const char **pw) return AUTH_REQUIRED; } - /* CHARSET_EBCDIC Issue's here ?!? Compare with 32/9 instead + /* APACHE_XLATE Issue's here ?!? Compare with 32/9 instead * as we are operating on an octed stream ? */ while (*auth_line== ' ' || *auth_line== '\t') @@ -1422,9 +1406,10 @@ API_EXPORT(void) ap_basic_http_header(request_rec *r) else protocol = AP_SERVER_PROTOCOL; -#ifdef CHARSET_EBCDIC - { PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + { AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client, + ap_hdrs_to_ascii); +#endif /*APACHE_XLATE*/ /* Output the HTTP/1.x Status-Line and the Date and Server fields */ @@ -1437,9 +1422,9 @@ API_EXPORT(void) ap_basic_http_header(request_rec *r) ap_table_unset(r->headers_out, "Date"); /* Avoid bogosity */ ap_table_unset(r->headers_out, "Server"); -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); } -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); } +#endif /*APACHE_XLATE*/ } /* Navigator versions 2.x, 3.x and 4.0 betas up to and including 4.0b2 @@ -1673,9 +1658,10 @@ API_EXPORT(void) ap_send_http_header(request_rec *r) ap_basic_http_header(r); -#ifdef CHARSET_EBCDIC - { PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + { AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client, + ap_hdrs_to_ascii); +#endif /*APACHE_XLATE*/ ap_set_keepalive(r); @@ -1727,9 +1713,9 @@ API_EXPORT(void) ap_send_http_header(request_rec *r) /* Set buffer flags for the body */ if (r->chunked) ap_bsetflag(r->connection->client, B_CHUNK, 1); -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); } -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); } +#endif /*APACHE_XLATE*/ } /* finalize_request_protocol is called at completion of sending the @@ -1740,8 +1726,9 @@ API_EXPORT(void) ap_send_http_header(request_rec *r) API_EXPORT(void) ap_finalize_request_protocol(request_rec *r) { if (r->chunked && !r->connection->aborted) { -#ifdef CHARSET_EBCDIC - PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); +#ifdef APACHE_XLATE + AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client, + ap_hdrs_to_ascii); #endif /* * Turn off chunked encoding --- we can only do this once. @@ -1753,9 +1740,9 @@ API_EXPORT(void) ap_finalize_request_protocol(request_rec *r) /* If we had footer "headers", we'd send them now */ ap_rputs(CRLF, r); -#ifdef CHARSET_EBCDIC - POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); +#endif /*APACHE_XLATE*/ } } @@ -1864,9 +1851,9 @@ API_EXPORT(int) ap_setup_client_block(request_rec *r, int read_policy) strncasecmp(typep, "multipart/", 10) == 0 || strcasecmp (typep, "application/x-www-form-urlencoded") == 0 ); - ap_bsetflag(r->connection->client, B_ASCII2EBCDIC, convert_in); + ap_bsetopt(r->connection->client, BO_RXLATE, ap_locale_from_ascii); } -#endif +#endif /*CHARSET_EBCDIC*/ return OK; } @@ -2056,19 +2043,20 @@ API_EXPORT(long) ap_get_client_block(request_rec *r, char *buffer, int bufsiz) r->remaining -= len_read; if (r->remaining == 0) { /* End of chunk, get trailing CRLF */ -#ifdef CHARSET_EBCDIC +#ifdef APACHE_XLATE /* Chunk end is Protocol stuff! Set conversion = 1 to read CR LF: */ - PUSH_EBCDIC_INPUTCONVERSION_STATE(r->connection->client, 1); -#endif /*CHARSET_EBCDIC*/ + AP_PUSH_INPUTCONVERSION_STATE(r->connection->client, + ap_hdrs_from_ascii); +#endif /*APACHE_XLATE*/ if ((c = ap_bgetc(r->connection->client)) == CR) { c = ap_bgetc(r->connection->client); } -#ifdef CHARSET_EBCDIC - /* restore ASCII->EBCDIC conversion state */ - POP_EBCDIC_INPUTCONVERSION_STATE(r->connection->client); -#endif /*CHARSET_EBCDIC*/ +#ifdef APACHE_XLATE + /* restore previous input translation handle */ + AP_POP_INPUTCONVERSION_STATE(r->connection->client); +#endif /*APACHE_XLATE*/ if (c != LF) { r->connection->keepalive = -1; diff --git a/modules/http/http_request.c b/modules/http/http_request.c index e1dda872de..10a577b138 100644 --- a/modules/http/http_request.c +++ b/modules/http/http_request.c @@ -75,6 +75,7 @@ #include "http_protocol.h" #include "http_log.h" #include "http_main.h" +#include "util_charset.h" #include "apr_fnmatch.h" AP_HOOK_STRUCT( @@ -949,14 +950,17 @@ API_EXPORT(request_rec *) ap_sub_req_lookup_file(const char *new_file, API_EXPORT(int) ap_run_sub_req(request_rec *r) { -#ifndef CHARSET_EBCDIC +#ifndef APACHE_XLATE int retval = ap_invoke_handler(r); -#else /*CHARSET_EBCDIC*/ - /* Save the EBCDIC conversion setting of the caller across subrequests */ - int convert = ap_bgetflag(r->connection->client, B_EBCDIC2ASCII); - int retval = ap_invoke_handler(r); - ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert); -#endif /*CHARSET_EBCDIC*/ +#else /*APACHE_XLATE*/ + /* Save the output conversion setting of the caller across subrequests */ + int retval; + ap_xlate_t *saved_xlate; + + ap_bgetopt(r->connection->client, BO_WXLATE, &saved_xlate); + retval = ap_invoke_handler(r); + ap_bsetopt(r->connection->client, BO_WXLATE, &saved_xlate); +#endif /*APACHE_XLATE*/ ap_finalize_sub_req_protocol(r); return retval; } @@ -1342,6 +1346,13 @@ static request_rec *internal_internal_redirect(const char *new_uri, request_rec return NULL; } +#ifdef APACHE_XLATE + new->rrx = ap_pcalloc(new->pool, sizeof(struct ap_rr_xlate)); + new->rrx->to_net = ap_locale_to_ascii; + new->rrx->from_net = ap_locale_from_ascii; + /* QUESTION: should we bsetopt(BO_WXLATE) and bsetop(BO_RXLATE)? */ +#endif /*APACHE_XLATE*/ + return new; } -- 2.40.0