From: Daniel Stenberg Date: Thu, 15 Sep 2022 07:23:33 +0000 (+0200) Subject: test1948: verify PUT + POST reusing the same handle X-Git-Tag: curl-7_86_0~223 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1edb15925e350be3b891f8a8de86600b22c0bb20;p=thirdparty%2Fcurl.git test1948: verify PUT + POST reusing the same handle Reproduced #9507, verifies the fix --- diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc index a060a803a6..20cdb9c8e4 100644 --- a/tests/data/Makefile.inc +++ b/tests/data/Makefile.inc @@ -224,7 +224,7 @@ test1908 test1909 test1910 test1911 test1912 test1913 test1914 test1915 \ test1916 test1917 test1918 test1919 \ \ test1933 test1934 test1935 test1936 test1937 test1938 test1939 test1940 \ -test1941 test1942 test1943 test1944 test1945 test1946 test1947 \ +test1941 test1942 test1943 test1944 test1945 test1946 test1947 test1948 \ \ test2000 test2001 test2002 test2003 test2004 \ \ diff --git a/tests/data/test1948 b/tests/data/test1948 new file mode 100644 index 0000000000..639523d995 --- /dev/null +++ b/tests/data/test1948 @@ -0,0 +1,73 @@ + + + +HTTP +HTTP POST +HTTP PUT + + + +# Server-side + + +HTTP/1.1 200 OK +Date: Thu, 01 Nov 2001 14:49:00 GMT +Content-Type: text/html +Content-Length: 6 + +hello + + +HTTP/1.1 200 OK +Date: Thu, 01 Nov 2001 14:49:00 GMT +Content-Type: text/html +Content-Length: 6 + +hello +HTTP/1.1 200 OK +Date: Thu, 01 Nov 2001 14:49:00 GMT +Content-Type: text/html +Content-Length: 6 + +hello + + + +# Client-side + + +http + + + +CURLOPT_POST after CURLOPT_UPLOAD reusing handle + + +lib%TESTNUMBER + + + +http://%HOSTIP:%HTTPPORT/%TESTNUMBER + + + +# Verify data after the test has been "shot" + + +PUT /%TESTNUMBER HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Content-Length: 22 +Expect: 100-continue + +This is test PUT data +POST /1948 HTTP/1.1 +Host: %HOSTIP:%HTTPPORT +Accept: */* +Content-Length: 22 +Content-Type: application/x-www-form-urlencoded + +This is test PUT data + + + diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc index d6b3ab37cd..3b9cdd0069 100644 --- a/tests/libtest/Makefile.inc +++ b/tests/libtest/Makefile.inc @@ -64,7 +64,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \ lib1905 lib1906 lib1907 lib1908 lib1910 lib1911 lib1912 lib1913 \ lib1915 lib1916 lib1917 lib1918 lib1919 \ lib1933 lib1934 lib1935 lib1936 lib1937 lib1938 lib1939 lib1940 \ - lib1945 lib1946 lib1947 \ + lib1945 lib1946 lib1947 lib1948 \ lib2301 lib2302 \ lib3010 lib3025 lib3026 lib3027 @@ -753,6 +753,10 @@ lib1947_SOURCES = lib1947.c $(SUPPORTFILES) lib1947_LDADD = $(TESTUTIL_LIBS) lib1947_CPPFLAGS = $(AM_CPPFLAGS) +lib1948_SOURCES = lib1948.c $(SUPPORTFILES) +lib1948_LDADD = $(TESTUTIL_LIBS) +lib1948_CPPFLAGS = $(AM_CPPFLAGS) + lib2301_SOURCES = lib2301.c $(SUPPORTFILES) lib2301_LDADD = $(TESTUTIL_LIBS) diff --git a/tests/libtest/lib1948.c b/tests/libtest/lib1948.c new file mode 100644 index 0000000000..7c891a2ca6 --- /dev/null +++ b/tests/libtest/lib1948.c @@ -0,0 +1,79 @@ +/*************************************************************************** + * _ _ ____ _ + * Project ___| | | | _ \| | + * / __| | | | |_) | | + * | (__| |_| | _ <| |___ + * \___|\___/|_| \_\_____| + * + * Copyright (C) 1998 - 2022, Daniel Stenberg, , et al. + * + * This software is licensed as described in the file COPYING, which + * you should have received as part of this distribution. The terms + * are also available at https://curl.haxx.se/docs/copyright.html. + * + * You may opt to use, copy, modify, merge, publish, distribute and/or sell + * copies of the Software, and permit persons to whom the Software is + * furnished to do so, under the terms of the COPYING file. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + * SPDX-License-Identifier: curl + * + ***************************************************************************/ + +#include "test.h" + +typedef struct +{ + char *buf; + size_t len; +} put_buffer; + +static size_t put_callback(char *ptr, size_t size, size_t nmemb, void *stream) +{ + put_buffer *putdata = (put_buffer *)stream; + size_t totalsize = size * nmemb; + size_t tocopy = (putdata->len < totalsize) ? putdata->len : totalsize; + memcpy(ptr, putdata->buf, tocopy); + putdata->len -= tocopy; + putdata->buf += tocopy; + return tocopy; +} + +int test(char *URL) +{ + CURL *curl; + CURLcode res = CURLE_OUT_OF_MEMORY; + + curl_global_init(CURL_GLOBAL_DEFAULT); + + curl = curl_easy_init(); + if(curl) { + const char *testput = "This is test PUT data\n"; + put_buffer pbuf; + + /* PUT */ + curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); + curl_easy_setopt(curl, CURLOPT_HEADER, 1L); + curl_easy_setopt(curl, CURLOPT_READFUNCTION, put_callback); + pbuf.buf = (char *)testput; + pbuf.len = strlen(testput); + curl_easy_setopt(curl, CURLOPT_READDATA, &pbuf); + curl_easy_setopt(curl, CURLOPT_INFILESIZE, (long)strlen(testput)); + res = curl_easy_setopt(curl, CURLOPT_URL, URL); + if(!res) + res = curl_easy_perform(curl); + if(!res) { + /* POST */ + curl_easy_setopt(curl, CURLOPT_POST, 1L); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, testput); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(testput)); + res = curl_easy_perform(curl); + } + curl_easy_cleanup(curl); + } + + curl_global_cleanup(); + return (int)res; +}