+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
"headers");
goto THROW_MALFORMED_HEADER;
}
-
+
meth_id = soup_method_get_id (req->method);
resp_hdrs = req->response_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;
}
/*
- * 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) {
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;