diff --git a/lib/easy.c b/lib/easy.c
index eee1061e8..1242369d5 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -927,6 +927,8 @@ struct Curl_easy *curl_easy_duphandle(struct Curl_easy *data)
Curl_convert_setup(outcurl);
+ Curl_initinfo(outcurl);
+
outcurl->magic = CURLEASY_MAGIC_NUMBER;
/* we reach this point and thus we are OK */
diff --git a/lib/getinfo.c b/lib/getinfo.c
index 9641d79dc..3186d8ac5 100644
--- a/lib/getinfo.c
+++ b/lib/getinfo.c
@@ -36,8 +36,11 @@
#include "memdebug.h"
/*
- * This is supposed to be called in the beginning of a perform() session and
- * in curl_easy_reset() and should reset all session-info variables.
+ * Initialize statistical and informational data.
+ *
+ * This function is called in curl_easy_reset, curl_easy_duphandle and at the
+ * beginning of a perform session. It must reset the session-info variables,
+ * in particular all variables in struct PureInfo.
*/
CURLcode Curl_initinfo(struct Curl_easy *data)
{
diff --git a/lib/url.c b/lib/url.c
index b997f419b..65c2e5414 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -92,6 +92,7 @@ bool curl_win32_idn_to_ascii(const char *in, char **out);
#include "warnless.h"
#include "non-ascii.h"
#include "inet_pton.h"
+#include "getinfo.h"
/* And now for the protocols */
#include "ftp.h"
@@ -646,6 +647,8 @@ CURLcode Curl_open(struct Curl_easy **curl)
Curl_convert_init(data);
+ Curl_initinfo(data);
+
/* most recent connection is not yet defined */
data->state.lastconnect = NULL;
diff --git a/lib/urldata.h b/lib/urldata.h
index 7c7bf1ba0..938462605 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -1105,7 +1105,7 @@ struct connectdata {
/*
* Struct to keep statistical and informational data.
- * All variables in this struct must be reset in Curl_initinfo().
+ * All variables in this struct must be initialized/reset in Curl_initinfo().
*/
struct PureInfo {
int httpcode; /* Recent HTTP, FTP, RTSP or SMTP response code */
diff --git a/tests/data/Makefile.inc b/tests/data/Makefile.inc
index d82a6e656..e5a9e1fe7 100644
--- a/tests/data/Makefile.inc
+++ b/tests/data/Makefile.inc
@@ -157,7 +157,7 @@ test1516 test1517 \
test1520 \
\
test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
-test1533 \
+test1533 test1534 \
\
test1600 test1601 test1602 test1603 test1604 test1605 \
\
diff --git a/tests/data/test1534 b/tests/data/test1534
new file mode 100644
index 000000000..f3cd2f0e3
--- /dev/null
+++ b/tests/data/test1534
@@ -0,0 +1,50 @@
+
+
+
+HTTP
+HTTP GET
+
+
+
+#
+# Server-side
+
+
+HTTP/1.0 200 OK swsclose
+Last-Modified: Thu, 01 Jan 1970 00:00:30 GMT
+Content-Length: 0
+
+
+
+
+# Client-side
+
+
+http
+
+# tool is what to use instead of 'curl'
+
+lib1534
+
+
+Test CURLINFO_RESPONSE_CODE
+
+
+http://%HOSTIP:%HTTPPORT/1534
+
+
+
+#
+# Verify data after the test has been "shot"
+
+
+GET /1534 HTTP/1.1
+Host: %HOSTIP:%HTTPPORT
+Accept: */*
+
+
+
+0
+
+
+
diff --git a/tests/libtest/Makefile.inc b/tests/libtest/Makefile.inc
index da905706b..c1dc2f585 100644
--- a/tests/libtest/Makefile.inc
+++ b/tests/libtest/Makefile.inc
@@ -23,8 +23,8 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
lib1520 \
- lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 \
- lib1533 \
+ lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 lib1533 \
+ lib1534 \
lib1900 \
lib2033
@@ -400,6 +400,10 @@ lib1533_SOURCES = lib1533.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1533_LDADD = $(TESTUTIL_LIBS)
lib1533_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1533
+lib1534_SOURCES = lib1534.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
+lib1534_LDADD = $(TESTUTIL_LIBS)
+lib1534_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1534
+
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS)
diff --git a/tests/libtest/lib1534.c b/tests/libtest/lib1534.c
new file mode 100644
index 000000000..61e72abb0
--- /dev/null
+++ b/tests/libtest/lib1534.c
@@ -0,0 +1,129 @@
+/***************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * Copyright (C) 1998 - 2016, 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.
+ *
+ ***************************************************************************/
+#include "test.h"
+
+#include "memdebug.h"
+
+/* Test CURLINFO_FILETIME */
+
+int test(char *URL)
+{
+ CURL *curl, *dupe = NULL;
+ long filetime;
+ int res = CURLE_OK;
+
+ global_init(CURL_GLOBAL_ALL);
+
+ easy_init(curl);
+
+ /* Test that a filetime is properly initialized on curl_easy_init.
+ */
+
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+ if(filetime != -1) {
+ fprintf(stderr, "%s:%d filetime init failed; expected -1 but is %ld\n",
+ __FILE__, __LINE__, filetime);
+ res = CURLE_FAILED_INIT;
+ goto test_cleanup;
+ }
+
+ easy_setopt(curl, CURLOPT_URL, URL);
+ easy_setopt(curl, CURLOPT_FILETIME, 1L);
+
+ res = curl_easy_perform(curl);
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_perform() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+
+ /* Test that a filetime is properly set after receiving an HTTP resource.
+ */
+
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+ if(filetime != 30) {
+ fprintf(stderr, "%s:%d filetime of http resource is incorrect; "
+ "expected 30 but is %ld\n",
+ __FILE__, __LINE__, filetime);
+ res = CURLE_HTTP_RETURNED_ERROR;
+ goto test_cleanup;
+ }
+
+ /* Test that a filetime is properly initialized on curl_easy_duphandle.
+ */
+
+ dupe = curl_easy_duphandle(curl);
+ if(!dupe) {
+ fprintf(stderr, "%s:%d curl_easy_duphandle() failed\n",
+ __FILE__, __LINE__);
+ res = CURLE_FAILED_INIT;
+ goto test_cleanup;
+ }
+
+ res = curl_easy_getinfo(dupe, CURLINFO_FILETIME, &filetime);
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+ if(filetime != -1) {
+ fprintf(stderr, "%s:%d filetime init failed; expected -1 but is %ld\n",
+ __FILE__, __LINE__, filetime);
+ res = CURLE_FAILED_INIT;
+ goto test_cleanup;
+ }
+
+
+ /* Test that a filetime is properly initialized on curl_easy_reset.
+ */
+
+ curl_easy_reset(curl);
+
+ res = curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
+ if(res) {
+ fprintf(stderr, "%s:%d curl_easy_getinfo() failed with code %d (%s)\n",
+ __FILE__, __LINE__, res, curl_easy_strerror(res));
+ goto test_cleanup;
+ }
+ if(filetime != -1) {
+ fprintf(stderr, "%s:%d filetime init failed; expected -1 but is %ld\n",
+ __FILE__, __LINE__, filetime);
+ res = CURLE_FAILED_INIT;
+ goto test_cleanup;
+ }
+
+test_cleanup:
+ curl_easy_cleanup(curl);
+ curl_easy_cleanup(dupe);
+ curl_global_cleanup();
+ return res;
+}