Handle forced no-content response codes 204, 205, and 304. Check
authorAlex Graveley <alex@ximian.com>
Thu, 21 Mar 2002 21:28:21 +0000 (21:28 +0000)
committerAlex Graveley <orph@src.gnome.org>
Thu, 21 Mar 2002 21:28:21 +0000 (21:28 +0000)
2002-03-21  Alex Graveley  <alex@ximian.com>

* src/libsoup/soup-queue.c (soup_queue_read_headers_cb): Handle
forced no-content response codes 204, 205, and 304.  Check
transfer-encoding before content-length to handle broken
Traffic-Server proxies.

ChangeLog
libsoup/soup-queue.c

index a13817f..263d64c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2002-03-21  Alex Graveley  <alex@ximian.com>
+
+       * src/libsoup/soup-queue.c (soup_queue_read_headers_cb): Handle
+       forced no-content response codes 204, 205, and 304.  Check
+       transfer-encoding before content-length to handle broken
+       Traffic-Server proxies.
+
 2002-03-20  Alex Graveley  <alex@ximian.com>
 
        * src/libsoup/soup-server.c (soup_server_get_handler): Return
index 1c7e51e..365a582 100644 (file)
@@ -119,7 +119,7 @@ soup_queue_read_headers_cb (const GString        *headers,
                                             "headers");
                goto THROW_MALFORMED_HEADER;
        }
-               
+
        meth_id   = soup_method_get_id (req->method);
        resp_hdrs = req->response_headers;
 
@@ -147,10 +147,16 @@ soup_queue_read_headers_cb (const GString        *headers,
         * Special case zero body handling for:
         *   - HEAD requests (where content-length must be ignored) 
         *   - CONNECT requests (no body expected) 
+        *   - No Content (204) responses (no message-body allowed)
+        *   - Reset Content (205) responses (no entity allowed)
+        *   - Not Modified (304) responses (no message-body allowed)
         *   - 1xx Informational responses (where no body is allowed)
         */
        if (meth_id == SOUP_METHOD_ID_HEAD ||
            meth_id == SOUP_METHOD_ID_CONNECT ||
+           req->errorcode  == SOUP_ERROR_NO_CONTENT || 
+           req->errorcode  == SOUP_ERROR_RESET_CONTENT || 
+           req->errorcode  == SOUP_ERROR_NOT_MODIFIED || 
            req->errorclass == SOUP_ERROR_CLASS_INFORMATIONAL) {
                *encoding = SOUP_TRANSFER_CONTENT_LENGTH;
                *content_len = 0;
@@ -158,23 +164,8 @@ soup_queue_read_headers_cb (const GString        *headers,
        }
 
        /* 
-        * Handle Content-Length encoding 
-        */
-       length = soup_message_get_header (resp_hdrs, "Content-Length");
-       if (length) {
-               *encoding = SOUP_TRANSFER_CONTENT_LENGTH;
-               *content_len = atoi (length);
-               if (*content_len < 0) {
-                       soup_message_set_error_full (req, 
-                                                    SOUP_ERROR_MALFORMED,
-                                                    "Invalid Content-Length");
-                       goto THROW_MALFORMED_HEADER;
-               } 
-               goto SUCCESS_CONTINUE;
-       }
-
-       /* 
-        * Handle Chunked encoding 
+        * Handle Chunked encoding.  Prefer Chunked over a Content-Length to
+        * support broken Traffic-Server proxies that supply both.  
         */
        enc = soup_message_get_header (resp_hdrs, "Transfer-Encoding");
        if (enc) {
@@ -190,6 +181,22 @@ soup_queue_read_headers_cb (const GString        *headers,
                goto SUCCESS_CONTINUE;
        }
 
+       /* 
+        * Handle Content-Length encoding 
+        */
+       length = soup_message_get_header (resp_hdrs, "Content-Length");
+       if (length) {
+               *encoding = SOUP_TRANSFER_CONTENT_LENGTH;
+               *content_len = atoi (length);
+               if (*content_len < 0) {
+                       soup_message_set_error_full (req, 
+                                                    SOUP_ERROR_MALFORMED,
+                                                    "Invalid Content-Length");
+                       goto THROW_MALFORMED_HEADER;
+               } 
+               goto SUCCESS_CONTINUE;
+       }
+
  SUCCESS_CONTINUE:
        soup_message_run_handlers (req, SOUP_HANDLER_HEADERS);
        return SOUP_TRANSFER_CONTINUE;