1
0
mirror of https://github.com/apache/httpd.git synced 2025-08-07 04:02:58 +03:00

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
This commit is contained in:
Jeff Trawick
2000-05-17 03:19:38 +00:00
parent 710c1945d1
commit d83c61bf73
4 changed files with 96 additions and 85 deletions

View File

@@ -584,6 +584,16 @@ typedef struct request_rec request_rec;
#include "util_uri.h" #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 { struct process_rec {
ap_pool_t *pool; /* Global pool. Please try to cleared on _all_ exits */ ap_pool_t *pool; /* Global pool. Please try to cleared on _all_ exits */
ap_pool_t *pconf; /* aka configuration pool, cleared on restarts */ ap_pool_t *pconf; /* aka configuration pool, cleared on restarts */
@@ -741,6 +751,10 @@ struct request_rec {
*/ */
const struct htaccess_result *htaccess; 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 /* Things placed at the end of the record to avoid breaking binary
* compatibility. It would be nice to remember to reorder the entire * compatibility. It would be nice to remember to reorder the entire
* record to improve 64bit alignment the next time we need to break * record to improve 64bit alignment the next time we need to break

View File

@@ -66,9 +66,7 @@ extern "C" {
#endif #endif
#include "apr_xlate.h" #include "apr_xlate.h"
#include "util_charset.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;
ap_status_t ap_init_ebcdic(ap_pool_t *); ap_status_t ap_init_ebcdic(ap_pool_t *);

View File

@@ -75,6 +75,7 @@
#include "http_log.h" /* For errors detected in basic auth common #include "http_log.h" /* For errors detected in basic auth common
* support code... */ * support code... */
#include "util_date.h" /* For parseHTTPdate and BAD_DATE */ #include "util_date.h" /* For parseHTTPdate and BAD_DATE */
#include "util_charset.h"
#include "mpm_status.h" #include "mpm_status.h"
#include <stdarg.h> #include <stdarg.h>
@@ -90,28 +91,6 @@ AP_HOOK_STRUCT(
ap_bgetopt (r->connection->client, BO_BYTECT, &r->bytes_sent); \ ap_bgetopt (r->connection->client, BO_BYTECT, &r->bytes_sent); \
} while (0) } 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 * Builds the content-type that should be sent to the client from the
* content-type specified. The following rules are followed: * 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; long range_start, range_end;
char *range; char *range;
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
/* determine current setting of conversion flag, /* determine current translation handle, set to the one for
* set to ON (protocol strings MUST be converted) * protocol strings, and reset to original setting before
* and reset to original setting before returning * returning
*/ */
PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client,
#endif /*CHARSET_EBCDIC*/ ap_hdrs_to_ascii);
#endif /*APACHE_XLATE*/
if (!**r_range) { if (!**r_range) {
if (r->byterange > 1) { if (r->byterange > 1) {
@@ -296,17 +276,17 @@ static int internal_byterange(int realreq, long *tlength, request_rec *r,
else else
*tlength += 4 + strlen(r->boundary) + 4; *tlength += 4 + strlen(r->boundary) + 4;
} }
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); AP_POP_OUTPUTCONVERSION_STATE(r->connection->client);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
return 0; return 0;
} }
range = ap_getword(r->pool, r_range, ','); range = ap_getword(r->pool, r_range, ',');
if (!parse_byterange(range, r->clength, &range_start, &range_end)) if (!parse_byterange(range, r->clength, &range_start, &range_end))
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); AP_POP_OUTPUTCONVERSION_STATE(r->connection->client);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
/* Skip this one */ /* Skip this one */
return internal_byterange(realreq, tlength, r, r_range, offset, return internal_byterange(realreq, tlength, r, r_range, offset,
length); length);
@@ -333,9 +313,9 @@ static int internal_byterange(int realreq, long *tlength, request_rec *r,
else { else {
*tlength += range_end - range_start + 1; *tlength += range_end - range_start + 1;
} }
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); AP_POP_OUTPUTCONVERSION_STATE(r->connection->client);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
return 1; return 1;
} }
@@ -750,17 +730,17 @@ static int getline(char *s, int n, BUFF *in, int fold)
char *pos, next; char *pos, next;
int retval; int retval;
int total = 0; int total = 0;
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
/* When getline() is called, the HTTP protocol is in a state /* When getline() is called, the HTTP protocol is in a state
* where we MUST be reading "plain text" protocol stuff, * where we MUST be reading "plain text" protocol stuff,
* (Request line, MIME headers, Chunk sizes) regardless of * (Request line, MIME headers, Chunk sizes) regardless of
* the MIME type and conversion setting of the document itself. * the MIME type and conversion setting of the document itself.
* Save the current setting of the ASCII-EBCDIC conversion flag * Save the current setting of the translation handle for
* for uploads, then temporarily set it to ON * uploads, then temporarily set it to the one used for headers
* (and restore it before returning). * (and restore it before returning).
*/ */
PUSH_EBCDIC_INPUTCONVERSION_STATE(in, 1); AP_PUSH_INPUTCONVERSION_STATE(in, ap_hdrs_from_ascii);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
pos = s; pos = s;
@@ -804,10 +784,10 @@ static int getline(char *s, int n, BUFF *in, int fold)
&& (next = ap_blookc(in)) && (next = ap_blookc(in))
&& ((next == ' ') || (next == '\t'))); && ((next == ' ') || (next == '\t')));
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
/* restore ASCII->EBCDIC conversion state */ /* restore translation handle */
POP_EBCDIC_INPUTCONVERSION_STATE(in); AP_POP_INPUTCONVERSION_STATE(in);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
return total; 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->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */
r->the_request = NULL; r->the_request = NULL;
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
ap_bsetflag(r->connection->client, B_ASCII2EBCDIC|B_EBCDIC2ASCII, 1); 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 #endif
ap_bsetopt(conn->client, BO_TIMEOUT, 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; 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 ? * as we are operating on an octed stream ?
*/ */
while (*auth_line== ' ' || *auth_line== '\t') while (*auth_line== ' ' || *auth_line== '\t')
@@ -1422,9 +1406,10 @@ API_EXPORT(void) ap_basic_http_header(request_rec *r)
else else
protocol = AP_SERVER_PROTOCOL; protocol = AP_SERVER_PROTOCOL;
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
{ PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); { AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client,
#endif /*CHARSET_EBCDIC*/ ap_hdrs_to_ascii);
#endif /*APACHE_XLATE*/
/* Output the HTTP/1.x Status-Line and the Date and Server fields */ /* 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, "Date"); /* Avoid bogosity */
ap_table_unset(r->headers_out, "Server"); ap_table_unset(r->headers_out, "Server");
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); } AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); }
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
} }
/* Navigator versions 2.x, 3.x and 4.0 betas up to and including 4.0b2 /* 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); ap_basic_http_header(r);
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
{ PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); { AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client,
#endif /*CHARSET_EBCDIC*/ ap_hdrs_to_ascii);
#endif /*APACHE_XLATE*/
ap_set_keepalive(r); ap_set_keepalive(r);
@@ -1727,9 +1713,9 @@ API_EXPORT(void) ap_send_http_header(request_rec *r)
/* Set buffer flags for the body */ /* Set buffer flags for the body */
if (r->chunked) if (r->chunked)
ap_bsetflag(r->connection->client, B_CHUNK, 1); ap_bsetflag(r->connection->client, B_CHUNK, 1);
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); } AP_POP_OUTPUTCONVERSION_STATE(r->connection->client); }
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
} }
/* finalize_request_protocol is called at completion of sending the /* 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) API_EXPORT(void) ap_finalize_request_protocol(request_rec *r)
{ {
if (r->chunked && !r->connection->aborted) { if (r->chunked && !r->connection->aborted) {
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
PUSH_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client, 1); AP_PUSH_OUTPUTCONVERSION_STATE(r->connection->client,
ap_hdrs_to_ascii);
#endif #endif
/* /*
* Turn off chunked encoding --- we can only do this once. * 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 */ /* If we had footer "headers", we'd send them now */
ap_rputs(CRLF, r); ap_rputs(CRLF, r);
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
POP_EBCDIC_OUTPUTCONVERSION_STATE(r->connection->client); AP_POP_OUTPUTCONVERSION_STATE(r->connection->client);
#endif /*CHARSET_EBCDIC*/ #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 || strncasecmp(typep, "multipart/", 10) == 0 ||
strcasecmp (typep, "application/x-www-form-urlencoded") == 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; return OK;
} }
@@ -2056,19 +2043,20 @@ API_EXPORT(long) ap_get_client_block(request_rec *r, char *buffer, int bufsiz)
r->remaining -= len_read; r->remaining -= len_read;
if (r->remaining == 0) { /* End of chunk, get trailing CRLF */ 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: */ /* Chunk end is Protocol stuff! Set conversion = 1 to read CR LF: */
PUSH_EBCDIC_INPUTCONVERSION_STATE(r->connection->client, 1); AP_PUSH_INPUTCONVERSION_STATE(r->connection->client,
#endif /*CHARSET_EBCDIC*/ ap_hdrs_from_ascii);
#endif /*APACHE_XLATE*/
if ((c = ap_bgetc(r->connection->client)) == CR) { if ((c = ap_bgetc(r->connection->client)) == CR) {
c = ap_bgetc(r->connection->client); c = ap_bgetc(r->connection->client);
} }
#ifdef CHARSET_EBCDIC #ifdef APACHE_XLATE
/* restore ASCII->EBCDIC conversion state */ /* restore previous input translation handle */
POP_EBCDIC_INPUTCONVERSION_STATE(r->connection->client); AP_POP_INPUTCONVERSION_STATE(r->connection->client);
#endif /*CHARSET_EBCDIC*/ #endif /*APACHE_XLATE*/
if (c != LF) { if (c != LF) {
r->connection->keepalive = -1; r->connection->keepalive = -1;

View File

@@ -75,6 +75,7 @@
#include "http_protocol.h" #include "http_protocol.h"
#include "http_log.h" #include "http_log.h"
#include "http_main.h" #include "http_main.h"
#include "util_charset.h"
#include "apr_fnmatch.h" #include "apr_fnmatch.h"
AP_HOOK_STRUCT( 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) API_EXPORT(int) ap_run_sub_req(request_rec *r)
{ {
#ifndef CHARSET_EBCDIC #ifndef APACHE_XLATE
int retval = ap_invoke_handler(r); int retval = ap_invoke_handler(r);
#else /*CHARSET_EBCDIC*/ #else /*APACHE_XLATE*/
/* Save the EBCDIC conversion setting of the caller across subrequests */ /* Save the output conversion setting of the caller across subrequests */
int convert = ap_bgetflag(r->connection->client, B_EBCDIC2ASCII); int retval;
int retval = ap_invoke_handler(r); ap_xlate_t *saved_xlate;
ap_bsetflag(r->connection->client, B_EBCDIC2ASCII, convert);
#endif /*CHARSET_EBCDIC*/ 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); ap_finalize_sub_req_protocol(r);
return retval; return retval;
} }
@@ -1342,6 +1346,13 @@ static request_rec *internal_internal_redirect(const char *new_uri, request_rec
return NULL; 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; return new;
} }