]> granicus.if.org Git - apache/commitdiff
APACHE_XLATE, CHARSET_EBCDIC stuff:
authorJeff Trawick <trawick@apache.org>
Thu, 25 May 2000 20:51:25 +0000 (20:51 +0000)
committerJeff Trawick <trawick@apache.org>
Thu, 25 May 2000 20:51:25 +0000 (20:51 +0000)
Provide new function ap_set_content_xlate() to simplify what needs
to be done to set up translation of content.  Use it where appropriate.

With this change, EBCDIC logic was tweaked so that ap_checkconv() does
not overlay a translation handle previously stored (e.g., by a module)
unless it is turning translation off.  Unless ap_checkconv() determines
that translation is inappropriate, it should leave the translation handle
alone.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@85296 13f79535-47bb-0310-9956-ffa450edef68

include/util_charset.h
modules/http/http_core.c
modules/http/http_protocol.c
modules/http/http_request.c
server/Makefile.in
server/util_charset.c [new file with mode: 0644]
server/util_ebcdic.c

index aea3f23356634821ddbe01b6b0007a9604f54d52..663ea660703ee8cbd465fe574e59c79f24e424af 100644 (file)
@@ -100,6 +100,12 @@ extern ap_xlate_t *ap_locale_to_ascii, *ap_locale_from_ascii;
 #define AP_POP_OUTPUTCONVERSION_STATE(_buff) \
         ap_bsetopt(_buff, BO_WXLATE, &saved_output_xlate)
 
+/* ap_set_content_xlate() is called by Apache core or a module to set
+ * up character set translation (a.k.a. recoding) for content.
+ */
+API_EXPORT(ap_status_t) ap_set_content_xlate(request_rec *r, int output,
+                                             ap_xlate_t *xlate);
+
 #ifdef __cplusplus
 }
 #endif
index 77bddeff8c32369c9022469670d77f750678c355..afefe2a0e40f1e08b1df17ffec3a4dedd8d07f40 100644 (file)
@@ -2413,14 +2413,13 @@ static int default_handler(request_rec *r)
     }
 
 #ifdef CHARSET_EBCDIC
-    /* ap_checkconv() sets a flag in the buff based on content type  
-     * to indicate whether text charset conversion should be done
-     * later.  If the content type contains the "magic" prefix
-     * for serving raw ascii (text/x-ascii-{plain,html,...}), the type is 
-     * corrected to the real text/{plain,html,...} type which goes into
-     * the headers.
+    /* By default, we convert all content.  ap_checkconv() can decide
+     * that conversion shouldn't be performed.  Also, if the content type
+     * contains the "magic" prefix for serving raw ascii
+     * (text/x-ascii-{plain,html,...}), the type is corrected to the real
+     * text/{plain,html,...} type which goes into the headers.
      */
-    r->rrx->to_net = ap_checkconv(r);
+    ap_checkconv(r);
 #endif  
 #ifdef USE_MMAP_FILES
     if ((r->finfo.size >= MMAP_THRESHOLD)
index e3baaadd03fee23486dd4dcc8461ea400969e091..22eb2fcbdb49731a06b111899df5aabe9b802353 100644 (file)
@@ -1030,11 +1030,9 @@ request_rec *ap_read_request(conn_rec *conn)
 
 #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_set_content_xlate(r, 1, ap_locale_to_ascii);
+    ap_set_content_xlate(r, 0, ap_locale_from_ascii);
+#endif /*APACHE_XLATE*/
 
     ap_bsetopt(conn->client, BO_TIMEOUT,
                conn->keptalive
index 10a577b138cab473e409859ca0442352359d5baf..f24baae1bdc9a2f5310e8ed0adcfdd8655e9ce0c 100644 (file)
@@ -1348,9 +1348,8 @@ static request_rec *internal_internal_redirect(const char *new_uri, request_rec
 
 #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)? */
+    ap_set_content_xlate(new, 1, ap_locale_to_ascii);
+    ap_set_content_xlate(new, 0, ap_locale_from_ascii);
 #endif /*APACHE_XLATE*/
 
     return new;
index 11998d31af8b3552c5cb686d3288d2ac39f8878a..2401acf85d4369ffdc6eb4ab420f555260324095 100644 (file)
@@ -7,7 +7,8 @@ LTLIBRARY_SOURCES = \
        buff.c http_config.c http_core.c http_log.c http_main.c \
        http_protocol.c http_request.c http_vhost.c util.c util_date.c \
        util_script.c util_uri.c util_md5.c util_cfgtree.c util_ebcdic.c \
-       rfc1413.c http_connection.c iol_file.c listen.c mpm_common.c
+       rfc1413.c http_connection.c iol_file.c listen.c mpm_common.c \
+       util_charset.c
 
 include $(top_srcdir)/build/ltlib.mk
 
diff --git a/server/util_charset.c b/server/util_charset.c
new file mode 100644 (file)
index 0000000..8a613f9
--- /dev/null
@@ -0,0 +1,122 @@
+/* ====================================================================
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2000 The Apache Software Foundation.  All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution,
+ *    if any, must include the following acknowledgment:
+ *       "This product includes software developed by the
+ *        Apache Software Foundation (http://www.apache.org/)."
+ *    Alternately, this acknowledgment may appear in the software itself,
+ *    if and wherever such third-party acknowledgments normally appear.
+ *
+ * 4. The names "Apache" and "Apache Software Foundation" must
+ *    not be used to endorse or promote products derived from this
+ *    software without prior written permission. For written
+ *    permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache",
+ *    nor may "Apache" appear in their name, without prior written
+ *    permission of the Apache Software Foundation.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation.  For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ * Portions of this software are based upon public domain software
+ * originally written at the National Center for Supercomputing Applications,
+ * University of Illinois, Urbana-Champaign.
+ */
+
+#include "ap_config.h"
+
+#ifdef APACHE_XLATE
+
+#include "httpd.h"
+#include "http_log.h"
+#include "http_core.h"
+#include "util_charset.h"
+
+/* ap_hdrs_to_ascii, ap_hdrs_from_ascii
+ *
+ * These are the translation handles used to translate between the network
+ * format of protocol headers and the local machine format.
+ *
+ * For an EBCDIC machine, these are valid handles which are set up at
+ * initialization to translate between ISO-8859-1 and the code page of
+ * the source code.
+ *
+ * For an ASCII machine, these remain NULL so that when they are stored
+ * in the BUFF via ap_bsetop(BO_WXLATE or BO_RXLATE) it ensures that no
+ * translation is performed.
+ */
+ap_xlate_t *ap_hdrs_to_ascii, *ap_hdrs_from_ascii;
+
+/* ap_locale_to_ascii, ap_locale_from_ascii
+ *
+ * These handles are used for the translation of content, unless a
+ * configuration module overrides them.
+ *
+ * For an EBCDIC machine, these are valid handles which are set up at
+ * initialization to translate between ISO-8859-1 and the code page of
+ * the httpd process's locale.
+ *
+ * For an ASCII machine, these remain NULL so that no translation is
+ * performed (unless a configuration module does something, of course).
+ */
+
+ap_xlate_t *ap_locale_to_ascii, *ap_locale_from_ascii;
+
+API_EXPORT(ap_status_t) ap_set_content_xlate(request_rec *r, int output, 
+                                             ap_xlate_t *xlate)
+{
+    ap_status_t rv;
+
+    if (output) {
+        r->rrx->to_net = xlate;
+        rv = ap_bsetopt(r->connection->client, BO_WXLATE, &xlate);
+    }
+    else {
+        r->rrx->from_net = xlate;
+        rv = ap_bsetopt(r->connection->client, BO_RXLATE, &xlate);
+    }
+
+    if (rv) {
+        ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+                      "BO_%sXLATE failed",
+                      output ? "W" : "R");
+    }
+
+    return rv;
+}
+
+#endif /*APACHE_XLATE*/
index fb8c041a3fa9758b4f043892a5805ac8e12fdd76..8affa18327c6781e171f42cf32c3deea4d40022a 100644 (file)
 
 #include "ap_config.h"
 
-#ifdef APACHE_XLATE
+#ifdef CHARSET_EBCDIC
 
 #include "httpd.h"
 #include "http_log.h"
 #include "http_core.h"
 #include "util_ebcdic.h"
 
-/* Note: these variables really belong in util_charset.c, but it seems silly
- * to create util_charset.c at the moment since it would only contain the
- * variables.
- */
-
-/* ap_hdrs_to_ascii, ap_hdrs_from_ascii
- *
- * These are the translation handles used to translate between the network
- * format of protocol headers and the local machine format.
- *
- * For an EBCDIC machine, these are valid handles which are set up at
- * initialization to translate between ISO-8859-1 and the code page of
- * the source code.
- *
- * For an ASCII machine, these remain NULL so that when they are stored
- * in the BUFF via ap_bsetop(BO_WXLATE or BO_RXLATE) it ensures that no
- * translation is performed.
- */
-ap_xlate_t *ap_hdrs_to_ascii, *ap_hdrs_from_ascii;
-
-/* ap_locale_to_ascii, ap_locale_from_ascii
- *
- * These handles are used for the translation of content, unless a
- * configuration module overrides them.
- *
- * For an EBCDIC machine, these are valid handles which are set up at
- * initialization to translate between ISO-8859-1 and the code page of
- * the httpd process's locale.
- *
- * For an ASCII machine, these remain NULL so that no translation is
- * performed (unless a configuration module does something, of course).
- */
-
-ap_xlate_t *ap_locale_to_ascii, *ap_locale_from_ascii;
-
-#endif /*APACHE_XLATE*/
-
-#ifdef CHARSET_EBCDIC
-
 ap_status_t ap_init_ebcdic(ap_pool_t *pool)
 {
     ap_status_t rv;
@@ -185,12 +145,9 @@ ap_xlate_t *ap_checkconv(struct request_rec *r)
            /* translate EBCDIC to ASCII */
            convert_to_ascii = 1;
     }
-    /* Enable conversion if it's a text document */
-    if (convert_to_ascii) {
-        ap_bsetopt(r->connection->client, BO_WXLATE, &ap_locale_to_ascii);
-    }
-    else {
-        ap_bsetopt(r->connection->client, BO_WXLATE, &zero);
+    /* Turn off conversion if it's a text document */
+    if (!convert_to_ascii) {
+        ap_set_content_xlate(r, 1, zero);
     }
 
     return convert_to_ascii ? ap_locale_to_ascii : NULL;