]> granicus.if.org Git - curl/commitdiff
Dirk Manske's fix for HTTP response code 301, that now behaves more like
authorDaniel Stenberg <daniel@haxx.se>
Wed, 17 Apr 2002 07:16:49 +0000 (07:16 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 17 Apr 2002 07:16:49 +0000 (07:16 +0000)
browsers do. Which thus *breaks* the RFC 2616...

lib/transfer.c

index dcdb4708d295fd9fecef830ab92581ecc74413e5..0a544e8d2ceb77f9ae36ad54a39c603ee7ef0e78 100644 (file)
@@ -1262,7 +1262,6 @@ CURLcode Curl_perform(struct SessionHandle *data)
          */
         switch(data->info.httpcode) {
         case 300: /* Multiple Choices */
-        case 301: /* Moved Permanently */
         case 306: /* Not used */
         case 307: /* Temporary Redirect */
         default:  /* for all unknown ones */
@@ -1270,6 +1269,27 @@ CURLcode Curl_perform(struct SessionHandle *data)
            * seem to be OK to POST to.
            */
           break;
+        case 301: /* Moved Permanently */
+          /* (quote from RFC2616, section 10.3.2):
+           * 
+           *  Note: When automatically redirecting a POST request after
+           *  receiving a 301 status code, some existing HTTP/1.0 user agents
+           *  will erroneously change it into a GET request.
+           *
+           * ----
+           * Warning: Because most of importants user agents do this clear
+           * RFC2616 violation, many webservers expect this misbehavior. So
+           * these servers often answers to a POST request with an error page.
+           * To be sure that libcurl gets the page that most user agents
+           * would get, libcurl has to force GET:
+           */
+          if( data->set.httpreq == HTTPREQ_POST
+              || data->set.httpreq == HTTPREQ_POST_FORM) {
+            infof(data,
+                  "Violate RFC 2616/10.3.2 and switch from POST to GET\n");
+            data->set.httpreq = HTTPREQ_GET;
+          }
+          break;
         case 302: /* Found */
           /* (From 10.3.3)