]> granicus.if.org Git - apache/commitdiff
include translation information in the request_rec;
authorJeff Trawick <trawick@apache.org>
Wed, 17 May 2000 03:19:38 +0000 (03:19 +0000)
committerJeff Trawick <trawick@apache.org>
Wed, 17 May 2000 03:19:38 +0000 (03:19 +0000)
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
include/util_ebcdic.h
modules/http/http_protocol.c
modules/http/http_request.c

index b1f4b7289faae33b2972a972dfe75794b158dc30..cf3f83e7f15279df616109a63837f662ca61e147 100644 (file)
@@ -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
index 71c4d1dc1ae08da054ae1758fc7456a283a92cc8..747da4ec59eab068adfd1b5c599a5dae5b93863f 100644 (file)
@@ -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 *);
 
index 335f249801f8dd7ad58da8ae6129049d871ad7f3..6c09e64cc85581ca937b1ae57d359859b19a4a63 100644 (file)
@@ -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 <stdarg.h>
 
@@ -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;
index e1dda872de8187c04222156ed164afa664201f88..10a577b138cab473e409859ca0442352359d5baf 100644 (file)
@@ -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;
 }