httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Jones" <oscare...@gmail.com>
Subject [PATCH] Response to TRACE garbled from EBCDIC platform
Date Thu, 15 May 2008 17:54:35 GMT
The response to TRACE when "TraceEnable Off" is not used on an EBCDIC
platform is partially in ASCII and partially in EBCDIC (part readable, part
garbage).

routine ap_send_http_trace in modules/http_filters.c recreates the request
and echoes it back when TRACE is requested.
form_header_field (from apr_table_do) has the necessary EBCDIC conditional
code to translate those fields to ASCII.
But, the request header and ending CRLF are created outside of that call,
and need to translated as well.

Index: httpd.h
===================================================================
--- httpd.h     (revision 579232)
+++ httpd.h     (working copy)
@@ -649,6 +649,8 @@
 #define LF '\n'
 #define CRLF "\r\n"
 #endif /* APR_CHARSET_EBCDIC */
+/* Useful for common code with either platform charset. */
+#define CRLF_ASCII "\015\012"

 /**
  * @defgroup values_request_rec_body Possible values for
request_rec.read_body

Index: http_filters.c
===================================================================
--- http_filters.c      (revision 656736)
+++ http_filters.c      (working copy)
@@ -1058,12 +1058,23 @@
     /* Now we recreate the request, and echo it back */

     bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
+#if APR_CHARSET_EBCDIC
+    {
+        char *tmp;
+        apr_size_t len;
+        len = strlen(r->the_request);
+        tmp = apr_pmemdup(r->pool, r->the_request, len);
+        ap_xlate_proto_to_ascii(tmp, len);
+        apr_brigade_putstrs(bb, NULL, NULL, tmp, CRLF_ASCII, NULL);
+    }
+#else
     apr_brigade_putstrs(bb, NULL, NULL, r->the_request, CRLF, NULL);
+#endif
     h.pool = r->pool;
     h.bb = bb;
     apr_table_do((int (*) (void *, const char *, const char *))
                  form_header_field, (void *) &h, r->headers_in, NULL);
-    apr_brigade_puts(bb, NULL, NULL, CRLF);
+    apr_brigade_puts(bb, NULL, NULL, CRLF_ASCII);

     /* If configured to accept a body, echo the body */
     if (bodylen) {

Mime
View raw message