1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 23:58:49 -05:00

easy: Reset all statistical session info in curl_easy_reset

Bug: https://github.com/curl/curl/issues/1017
Reported-by: Jeroen Ooms
This commit is contained in:
Jay Satiro 2016-09-17 01:48:20 -04:00
parent 6834ebaaa3
commit 22cfeac730
7 changed files with 153 additions and 7 deletions

View File

@ -995,6 +995,9 @@ void curl_easy_reset(struct Curl_easy *data)
/* zero out Progress data: */ /* zero out Progress data: */
memset(&data->progress, 0, sizeof(struct Progress)); memset(&data->progress, 0, sizeof(struct Progress));
/* zero out PureInfo data: */
Curl_initinfo(data);
data->progress.flags |= PGRS_HIDE; data->progress.flags |= PGRS_HIDE;
data->state.current_speed = -1; /* init to negative == impossible */ data->state.current_speed = -1; /* init to negative == impossible */
} }

View File

@ -36,8 +36,8 @@
#include "memdebug.h" #include "memdebug.h"
/* /*
* This is supposed to be called in the beginning of a perform() session * This is supposed to be called in the beginning of a perform() session and
* and should reset all session-info variables * in curl_easy_reset() and should reset all session-info variables.
*/ */
CURLcode Curl_initinfo(struct Curl_easy *data) CURLcode Curl_initinfo(struct Curl_easy *data)
{ {
@ -58,18 +58,27 @@ CURLcode Curl_initinfo(struct Curl_easy *data)
info->filetime = -1; /* -1 is an illegal time and thus means unknown */ info->filetime = -1; /* -1 is an illegal time and thus means unknown */
info->timecond = FALSE; info->timecond = FALSE;
info->header_size = 0;
info->request_size = 0;
info->proxyauthavail = 0;
info->httpauthavail = 0;
info->numconnects = 0;
free(info->contenttype); free(info->contenttype);
info->contenttype = NULL; info->contenttype = NULL;
info->header_size = 0; free(info->wouldredirect);
info->request_size = 0; info->wouldredirect = NULL;
info->numconnects = 0;
info->conn_primary_ip[0] = '\0'; info->conn_primary_ip[0] = '\0';
info->conn_local_ip[0] = '\0'; info->conn_local_ip[0] = '\0';
info->conn_primary_port = 0; info->conn_primary_port = 0;
info->conn_local_port = 0; info->conn_local_port = 0;
#ifdef USE_SSL
Curl_ssl_free_certinfo(data);
#endif
return CURLE_OK; return CURLE_OK;
} }

View File

@ -1104,6 +1104,7 @@ struct connectdata {
/* /*
* Struct to keep statistical and informational data. * Struct to keep statistical and informational data.
* All variables in this struct must be reset in Curl_initinfo().
*/ */
struct PureInfo { struct PureInfo {
int httpcode; /* Recent HTTP, FTP, RTSP or SMTP response code */ int httpcode; /* Recent HTTP, FTP, RTSP or SMTP response code */

View File

@ -156,7 +156,7 @@ test1516 test1517 \
\ \
test1520 \ test1520 \
\ \
test1525 test1526 test1527 test1528 test1529 test1530 test1531 \ test1525 test1526 test1527 test1528 test1529 test1530 test1531 test1532 \
\ \
test1600 test1601 test1602 test1603 test1604 test1605 \ test1600 test1601 test1602 test1603 test1604 test1605 \
\ \

49
tests/data/test1532 Normal file
View File

@ -0,0 +1,49 @@
<testcase>
<info>
<keywords>
HTTP
HTTP GET
</keywords>
</info>
#
# Server-side
<reply>
<data nocheck="yes">
HTTP/1.0 200 OK swsclose
Content-Length: 0
</data>
</reply>
# Client-side
<client>
<server>
http
</server>
# tool is what to use instead of 'curl'
<tool>
lib1532
</tool>
<name>
Test CURLINFO_RESPONSE_CODE
</name>
<command>
http://%HOSTIP:%HTTPPORT/1532
</command>
</client>
#
# Verify data after the test has been "shot"
<verify>
<protocol>
GET /1532 HTTP/1.1
Host: %HOSTIP:%HTTPPORT
Accept: */*
</protocol>
<errorcode>
0
</errorcode>
</verify>
</testcase>

View File

@ -23,7 +23,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \ lib1500 lib1501 lib1502 lib1503 lib1504 lib1505 lib1506 lib1507 lib1508 \
lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \ lib1509 lib1510 lib1511 lib1512 lib1513 lib1514 lib1515 lib1517 \
lib1520 \ lib1520 \
lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 \ lib1525 lib1526 lib1527 lib1528 lib1529 lib1530 lib1531 lib1532 \
lib1900 \ lib1900 \
lib2033 lib2033
@ -391,6 +391,10 @@ lib1531_SOURCES = lib1531.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1531_LDADD = $(TESTUTIL_LIBS) lib1531_LDADD = $(TESTUTIL_LIBS)
lib1531_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1531 lib1531_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1531
lib1532_SOURCES = lib1532.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1532_LDADD = $(TESTUTIL_LIBS)
lib1532_CPPFLAGS = $(AM_CPPFLAGS) -DLIB1532
lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS) lib1900_SOURCES = lib1900.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
lib1900_LDADD = $(TESTUTIL_LIBS) lib1900_LDADD = $(TESTUTIL_LIBS)
lib1900_CPPFLAGS = $(AM_CPPFLAGS) lib1900_CPPFLAGS = $(AM_CPPFLAGS)

80
tests/libtest/lib1532.c Normal file
View File

@ -0,0 +1,80 @@
/***************************************************************************
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, 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_RESPONSE_CODE */
int test(char *URL)
{
CURL *curl;
long httpcode;
int res = CURLE_OK;
global_init(CURL_GLOBAL_ALL);
easy_init(curl);
easy_setopt(curl, CURLOPT_URL, URL);
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;
}
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
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(httpcode != 200) {
fprintf(stderr, "%s:%d unexpected response code %ld\n",
__FILE__, __LINE__, httpcode);
res = CURLE_HTTP_RETURNED_ERROR;
goto test_cleanup;
}
/* Test for a regression of github bug 1017 (response code does not reset) */
curl_easy_reset(curl);
res = curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &httpcode);
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(httpcode != 0) {
fprintf(stderr, "%s:%d curl_easy_reset failed to zero the response code\n"
"possible regression of github bug 1017\n", __FILE__, __LINE__);
res = CURLE_HTTP_RETURNED_ERROR;
goto test_cleanup;
}
test_cleanup:
curl_easy_cleanup(curl);
curl_global_cleanup();
return res;
}