]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Do not send a Content-Length header on status 204
authorWido den Hollander <wido@42on.com>
Wed, 11 Nov 2015 18:01:15 +0000 (19:01 +0100)
committerVicente Cheng <freeze.bilsted@gmail.com>
Thu, 31 Mar 2016 09:29:14 +0000 (17:29 +0800)
RFC7230 says:
  A server MUST NOT send a Content-Length header field in any response with a
  status code of 1xx (Informational) or 204 (No Content).

Fixes: #13582
Signed-off-by: Wido den Hollander <wido@42on.com>
(cherry picked from commit 4e5921dbc7d1c51feb4cc5c03aa59a432742765e)

src/rgw/rgw_civetweb.cc
src/rgw/rgw_civetweb.h
src/rgw/rgw_fcgi.cc
src/rgw/rgw_fcgi.h

index 5c075f98a0e749230a7cedc689d8de638d8618f8..2ae3b799166ee96b75d0c424271b2b709410bae3 100644 (file)
@@ -45,9 +45,16 @@ int RGWMongoose::complete_request()
 {
   if (!sent_header) {
     if (!has_content_length) {
+
       header_done = false; /* let's go back to writing the header */
 
-      if (0 && data.length() == 0) {
+      /*
+       * Status 204 should not include a content-length header
+       * RFC7230 says so
+       */
+      if (status_num == 204) {
+        has_content_length = true;
+      } else if (0 && data.length() == 0) {
         has_content_length = true;
         print("Transfer-Enconding: %s\r\n", "chunked");
         data.append("0\r\n\r\n", sizeof("0\r\n\r\n")-1);
@@ -75,6 +82,8 @@ void RGWMongoose::init_env(CephContext *cct)
 {
   env.init(cct);
   struct mg_request_info *info = mg_get_request_info(conn);
+  status_num = 0;
+
   if (!info)
     return;
 
@@ -114,7 +123,7 @@ void RGWMongoose::init_env(CephContext *cct)
       *dest = c;
     }
     *dest = '\0';
-    
+
     env.set(buf, header->value);
   }
 
@@ -150,7 +159,7 @@ int RGWMongoose::send_status(const char *status, const char *status_name)
   bl.append(header_data);
   header_data = bl;
 
-  int status_num = atoi(status);
+  status_num = atoi(status);
   mg_set_http_status(conn, status_num);
 
   return 0;
index 1cee5c8b59f0521ce1df27a097a04443b81bde3c..8a1b4af27d247e5860feefb72dae25233863b94c 100644 (file)
@@ -19,6 +19,7 @@ class RGWMongoose : public RGWClientIO
   bufferlist data;
 
   int port;
+  int status_num;
 
   bool header_done;
   bool sent_header;
index 0006834b44970bfc28dd0ed34820d7fc904e926f..b526dddf30dc1087a4b6d9c23e09e8c65a5558e3 100644 (file)
@@ -29,10 +29,12 @@ void RGWFCGX::flush()
 void RGWFCGX::init_env(CephContext *cct)
 {
   env.init(cct, (char **)fcgx->envp);
+  status_num = 0;
 }
 
 int RGWFCGX::send_status(const char *status, const char *status_name)
 {
+  status_num = atoi(status);
   return print("Status: %s %s\r\n", status, status_name);
 }
 
@@ -47,6 +49,13 @@ int RGWFCGX::send_100_continue()
 
 int RGWFCGX::send_content_length(uint64_t len)
 {
+  /*
+   * Status 204 should not include a content-length header
+   * RFC7230 says so
+   */
+  if (status_num == 204)
+    return 0;
+
   char buf[21];
   snprintf(buf, sizeof(buf), "%" PRIu64, len);
   return print("Content-Length: %s\r\n", buf);
@@ -56,4 +65,3 @@ int RGWFCGX::complete_header()
 {
   return print("\r\n");
 }
-
index 8fc96fce18394ab3a0232301bc0b5916fdd8d6e7..a798425ec117464e0c95c22a69c9a8b66559e5fd 100644 (file)
@@ -13,6 +13,9 @@ struct FCGX_Request;
 class RGWFCGX : public RGWClientIO
 {
   FCGX_Request *fcgx;
+
+  int status_num;
+
 protected:
   void init_env(CephContext *cct);
   int write_data(const char *buf, int len);