From f0826974f225b71a9b95f76f8ac68ea0d72706d5 Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Tue, 1 Dec 2009 12:04:54 +0000
Subject: [PATCH] - If the Expect: 100-continue header has been set by the
 application through   curl_easy_setopt with CURLOPT_HTTPHEADER, the library
 should set   data->state.expect100header accordingly - the current code (in
 7.19.7 at   least) doesn't handle this properly. Martin Storsjo provided the
 fix!

---
 CHANGES       |  6 ++++++
 RELEASE-NOTES |  3 ++-
 lib/http.c    | 30 +++++++++++++++++++++---------
 3 files changed, 29 insertions(+), 10 deletions(-)

diff --git a/CHANGES b/CHANGES
index 2560b7f07b..92b7375895 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,12 @@
                                   Changelog
 
 
+Daniel Stenberg (1 Dec 2009)
+- If the Expect: 100-continue header has been set by the application through
+  curl_easy_setopt with CURLOPT_HTTPHEADER, the library should set
+  data->state.expect100header accordingly - the current code (in 7.19.7 at
+  least) doesn't handle this properly. Martin Storsjo provided the fix!
+
 Yang Tse (28 Nov 2009)
 - Added Diffie-Hellman parameters to several test harness certificate files in
   PEM format. Required by several stunnel versions used by our test harness.
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index c62c11f2d4..f6b38ce450 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -28,6 +28,7 @@ This release includes the following bugfixes:
  o SSL lib post-close write
  o curl failed to report write errors for tiny failed downloads
  o TFTP BLKSIZE
+ o Expect: 100-continue handling when set by the application
 
 This release includes the following known bugs:
 
@@ -39,6 +40,6 @@ advice from friends like these:
  Yang Tse, Kamil Dudka, Christian Schmitz, Constantine Sapuntzakis,
  Marco Maggi, Camille Moncelier, Claes Jakobsson, Kevin Baughman,
  Marc Kleine-Budde, Jad Chamcham, Bjorn Augustsson, David Byron,
- Markus Koetter, Chad Monroe
+ Markus Koetter, Chad Monroe, Martin Storsjo
 
         Thanks! (and sorry if I forgot to mention someone)
diff --git a/lib/http.c b/lib/http.c
index 7e4e587959..d67a001b26 100644
--- a/lib/http.c
+++ b/lib/http.c
@@ -1981,17 +1981,24 @@ static CURLcode expect100(struct SessionHandle *data,
                           send_buffer *req_buffer)
 {
   CURLcode result = CURLE_OK;
+  const char *ptr;
   data->state.expect100header = FALSE; /* default to false unless it is set
                                           to TRUE below */
-  if(use_http_1_1(data, conn) && !checkheaders(data, "Expect:")) {
+  if(use_http_1_1(data, conn)) {
     /* if not doing HTTP 1.0 or disabled explicitly, we add a Expect:
-       100-continue to the headers which actually speeds up post
-       operations (as there is one packet coming back from the web
-       server) */
-    result = add_bufferf(req_buffer,
-                         "Expect: 100-continue\r\n");
-    if(result == CURLE_OK)
-      data->state.expect100header = TRUE;
+       100-continue to the headers which actually speeds up post operations
+       (as there is one packet coming back from the web server) */
+    ptr = checkheaders(data, "Expect:");
+    if (ptr) {
+      data->state.expect100header =
+        Curl_compareheader(ptr, "Expect:", "100-continue");
+    }
+    else {
+      result = add_bufferf(req_buffer,
+                           "Expect: 100-continue\r\n");
+      if(result == CURLE_OK)
+        data->state.expect100header = TRUE;
+    }
   }
   return result;
 }
@@ -2837,7 +2844,12 @@ CURLcode Curl_http(struct connectdata *conn, bool *done)
        the somewhat bigger ones we allow the app to disable it. Just make
        sure that the expect100header is always set to the preferred value
        here. */
-    if(postsize > TINY_INITIAL_POST_SIZE) {
+    ptr = checkheaders(data, "Expect:");
+    if(ptr) {
+      data->state.expect100header =
+        Curl_compareheader(ptr, "Expect:", "100-continue");
+    }
+    else if(postsize > TINY_INITIAL_POST_SIZE) {
       result = expect100(data, conn, req_buffer);
       if(result)
         return result;
-- 
GitLab