mirror of
https://github.com/moparisthebest/curl
synced 2024-08-13 17:03:50 -04:00
altsvc: keep a copy of the file name to survive handle reset
The alt-svc cache survives a call to curl_easy_reset fine, but the file name to use for saving the cache was cleared. Now the alt-svc cache has a copy of the file name to survive handle resets. Added test 1908 to verify. Reported-by: Craig Andrews Fixes #4898 Closes #4902
This commit is contained in:
parent
f8f4a94465
commit
02f8de6516
@ -5,7 +5,7 @@
|
|||||||
.\" * | (__| |_| | _ <| |___
|
.\" * | (__| |_| | _ <| |___
|
||||||
.\" * \___|\___/|_| \_\_____|
|
.\" * \___|\___/|_| \_\_____|
|
||||||
.\" *
|
.\" *
|
||||||
.\" * Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
|
.\" * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||||
.\" *
|
.\" *
|
||||||
.\" * This software is licensed as described in the file COPYING, which
|
.\" * This software is licensed as described in the file COPYING, which
|
||||||
.\" * you should have received as part of this distribution. The terms
|
.\" * you should have received as part of this distribution. The terms
|
||||||
@ -33,7 +33,8 @@ default values. This puts back the handle to the same state as it was in when
|
|||||||
it was just created with \fIcurl_easy_init(3)\fP.
|
it was just created with \fIcurl_easy_init(3)\fP.
|
||||||
|
|
||||||
It does not change the following information kept in the handle: live
|
It does not change the following information kept in the handle: live
|
||||||
connections, the Session ID cache, the DNS cache, the cookies and shares.
|
connections, the Session ID cache, the DNS cache, the cookies, the shares or
|
||||||
|
the alt-svc cache.
|
||||||
.SH AVAILABILITY
|
.SH AVAILABILITY
|
||||||
This function was added in libcurl 7.12.1
|
This function was added in libcurl 7.12.1
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
|
17
lib/altsvc.c
17
lib/altsvc.c
@ -185,7 +185,16 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
|
|||||||
{
|
{
|
||||||
CURLcode result = CURLE_OK;
|
CURLcode result = CURLE_OK;
|
||||||
char *line = NULL;
|
char *line = NULL;
|
||||||
FILE *fp = fopen(file, FOPEN_READTEXT);
|
FILE *fp;
|
||||||
|
|
||||||
|
/* we need a private copy of the file name so that the altsvc cache file
|
||||||
|
name survives an easy handle reset */
|
||||||
|
free(asi->filename);
|
||||||
|
asi->filename = strdup(file);
|
||||||
|
if(!asi->filename)
|
||||||
|
return CURLE_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
fp = fopen(file, FOPEN_READTEXT);
|
||||||
if(fp) {
|
if(fp) {
|
||||||
line = malloc(MAX_ALTSVC_LINE);
|
line = malloc(MAX_ALTSVC_LINE);
|
||||||
if(!line)
|
if(!line)
|
||||||
@ -206,6 +215,7 @@ static CURLcode altsvc_load(struct altsvcinfo *asi, const char *file)
|
|||||||
return result;
|
return result;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
Curl_safefree(asi->filename);
|
||||||
free(line);
|
free(line);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@ -299,6 +309,7 @@ void Curl_altsvc_cleanup(struct altsvcinfo *altsvc)
|
|||||||
n = e->next;
|
n = e->next;
|
||||||
altsvc_free(as);
|
altsvc_free(as);
|
||||||
}
|
}
|
||||||
|
free(altsvc->filename);
|
||||||
free(altsvc);
|
free(altsvc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -317,6 +328,10 @@ CURLcode Curl_altsvc_save(struct altsvcinfo *altsvc, const char *file)
|
|||||||
/* no cache activated */
|
/* no cache activated */
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
|
/* if not new name is given, use the one we stored from the load */
|
||||||
|
if(!file && altsvc->filename)
|
||||||
|
file = altsvc->filename;
|
||||||
|
|
||||||
if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file || !file[0])
|
if((altsvc->flags & CURLALTSVC_READONLYFILE) || !file || !file[0])
|
||||||
/* marked as read-only, no file or zero length file name */
|
/* marked as read-only, no file or zero length file name */
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
@ -192,6 +192,7 @@ test1700 test1701 test1702 \
|
|||||||
test1800 test1801 \
|
test1800 test1801 \
|
||||||
\
|
\
|
||||||
test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
|
test1900 test1901 test1902 test1903 test1904 test1905 test1906 test1907 \
|
||||||
|
test1908 \
|
||||||
\
|
\
|
||||||
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
|
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
|
||||||
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
|
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
|
||||||
|
71
tests/data/test1908
Normal file
71
tests/data/test1908
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<testcase>
|
||||||
|
<info>
|
||||||
|
<keywords>
|
||||||
|
CURLINFO_EFFECTIVE_URL
|
||||||
|
</keywords>
|
||||||
|
</info>
|
||||||
|
|
||||||
|
# Server-side
|
||||||
|
<reply>
|
||||||
|
<data nocheck="yes">
|
||||||
|
HTTP/1.1 200 OK
|
||||||
|
Date: Thu, 09 Nov 2010 14:49:00 GMT
|
||||||
|
Server: test-server/fake
|
||||||
|
Content-Type: text/html
|
||||||
|
Funny-head: yesyes swsclose
|
||||||
|
Content-Length: 0
|
||||||
|
alt-svc: h2="3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example:443"; ma=315360000; persist=1
|
||||||
|
|
||||||
|
</data>
|
||||||
|
</reply>
|
||||||
|
|
||||||
|
# Client-side
|
||||||
|
<client>
|
||||||
|
<server>
|
||||||
|
http
|
||||||
|
</server>
|
||||||
|
|
||||||
|
# require debug so that alt-svc can work over plain old HTTP
|
||||||
|
<features>
|
||||||
|
alt-svc
|
||||||
|
debug
|
||||||
|
</features>
|
||||||
|
<name>
|
||||||
|
alt-svc cache save after resetting the handle
|
||||||
|
</name>
|
||||||
|
<setenv>
|
||||||
|
# make debug-curl accept Alt-Svc over plain HTTP
|
||||||
|
CURL_ALTSVC_HTTP="yeah"
|
||||||
|
</setenv>
|
||||||
|
<tool>
|
||||||
|
lib1908
|
||||||
|
</tool>
|
||||||
|
|
||||||
|
<command>
|
||||||
|
%HOSTIP:%HTTPPORT/1908
|
||||||
|
</command>
|
||||||
|
</client>
|
||||||
|
|
||||||
|
# Verify data after the test has been "shot"
|
||||||
|
<verify>
|
||||||
|
<strip>
|
||||||
|
^User-Agent:.*
|
||||||
|
</strip>
|
||||||
|
<protocol>
|
||||||
|
GET /1908 HTTP/1.1
|
||||||
|
Host: %HOSTIP:%HTTPPORT
|
||||||
|
Accept: */*
|
||||||
|
|
||||||
|
</protocol>
|
||||||
|
<stripfile>
|
||||||
|
# strip out the (dynamic) expire date from the file so that the rest
|
||||||
|
# matches
|
||||||
|
s/\"([^\"]*)\"/TIMESTAMP/
|
||||||
|
</stripfile>
|
||||||
|
<file name="log/altsvc-1908">
|
||||||
|
# Your alt-svc cache. https://curl.haxx.se/docs/alt-svc.html
|
||||||
|
# This file was generated by libcurl! Edit at your own risk.
|
||||||
|
h1 127.0.0.1 8990 h2 3dbbdetxoyw4nsp6c3cc456oj2ays6s43ezxzsfxxri3h5xqd.example 443 TIMESTAMP 1 0
|
||||||
|
</file>
|
||||||
|
</verify>
|
||||||
|
</testcase>
|
@ -33,7 +33,7 @@ noinst_PROGRAMS = chkhostname libauthretry libntlmconnect \
|
|||||||
lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
|
lib1550 lib1551 lib1552 lib1553 lib1554 lib1555 lib1556 lib1557 \
|
||||||
lib1558 lib1559 lib1560 lib1564 lib1565 \
|
lib1558 lib1559 lib1560 lib1564 lib1565 \
|
||||||
lib1591 lib1592 lib1593 lib1594 lib1596 \
|
lib1591 lib1592 lib1593 lib1594 lib1596 \
|
||||||
lib1900 lib1905 lib1906 lib1907 \
|
lib1900 lib1905 lib1906 lib1907 lib1908 \
|
||||||
lib2033
|
lib2033
|
||||||
|
|
||||||
chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
|
chkdecimalpoint_SOURCES = chkdecimalpoint.c ../../lib/mprintf.c \
|
||||||
@ -578,6 +578,10 @@ lib1907_SOURCES = lib1907.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
|
|||||||
lib1907_LDADD = $(TESTUTIL_LIBS)
|
lib1907_LDADD = $(TESTUTIL_LIBS)
|
||||||
lib1907_CPPFLAGS = $(AM_CPPFLAGS)
|
lib1907_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
|
||||||
|
lib1908_SOURCES = lib1908.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
|
||||||
|
lib1908_LDADD = $(TESTUTIL_LIBS)
|
||||||
|
lib1908_CPPFLAGS = $(AM_CPPFLAGS)
|
||||||
|
|
||||||
lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
|
lib2033_SOURCES = libntlmconnect.c $(SUPPORTFILES) $(TESTUTIL) $(WARNLESS)
|
||||||
lib2033_LDADD = $(TESTUTIL_LIBS)
|
lib2033_LDADD = $(TESTUTIL_LIBS)
|
||||||
lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
|
lib2033_CPPFLAGS = $(AM_CPPFLAGS) -DUSE_PIPELINING
|
||||||
|
47
tests/libtest/lib1908.c
Normal file
47
tests/libtest/lib1908.c
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 - 2020, Linus Nielsen Feltzing, <linus@haxx.se>
|
||||||
|
*
|
||||||
|
* 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 "testutil.h"
|
||||||
|
#include "warnless.h"
|
||||||
|
#include "memdebug.h"
|
||||||
|
|
||||||
|
int test(char *URL)
|
||||||
|
{
|
||||||
|
CURLcode ret = CURLE_OK;
|
||||||
|
CURL *hnd;
|
||||||
|
start_test_timing();
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
|
hnd = curl_easy_init();
|
||||||
|
if(hnd) {
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_URL, URL);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_NOPROGRESS, 1L);
|
||||||
|
curl_easy_setopt(hnd, CURLOPT_ALTSVC, "log/altsvc-1908");
|
||||||
|
ret = curl_easy_perform(hnd);
|
||||||
|
curl_easy_reset(hnd);
|
||||||
|
curl_easy_cleanup(hnd);
|
||||||
|
}
|
||||||
|
curl_global_cleanup();
|
||||||
|
return (int)ret;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user