libfetch: merge some features from FreeBSD:
- Supports HTTP/1.1 308 redirect. - SSLv[23] HTTPS connections are forbidden by default. - TLS client certificate validation thru OpenSSL. - Fixes for user/password encoding, misc.
This commit is contained in:
@ -1,3 +1,4 @@
|
||||
/* $FreeBSD: rev 252375 $ */
|
||||
/* $NetBSD: fetch.c,v 1.19 2009/08/11 20:48:06 joerg Exp $ */
|
||||
/*-
|
||||
* Copyright (c) 1998-2004 Dag-Erling Coïdan Smørav
|
||||
@ -26,8 +27,6 @@
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $FreeBSD: fetch.c,v 1.41 2007/12/19 00:26:36 des Exp $
|
||||
*/
|
||||
|
||||
#include "compat.h"
|
||||
@ -292,6 +291,48 @@ fetchMakeURL(const char *scheme, const char *host, int port, const char *doc,
|
||||
return (u);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return value of the given hex digit.
|
||||
*/
|
||||
static int
|
||||
fetch_hexval(char ch)
|
||||
{
|
||||
if (ch >= '0' && ch <= '9')
|
||||
return (ch - '0');
|
||||
else if (ch >= 'a' && ch <= 'f')
|
||||
return (ch - 'a' + 10);
|
||||
else if (ch >= 'A' && ch <= 'F')
|
||||
return (ch - 'A' + 10);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Decode percent-encoded URL component from src into dst, stopping at end
|
||||
* of string, or at @ or : separators. Returns a pointer to the unhandled
|
||||
* part of the input string (null terminator, @, or :). No terminator is
|
||||
* written to dst (it is the caller's responsibility).
|
||||
*/
|
||||
static const char *
|
||||
fetch_pctdecode(char *dst, const char *src, size_t dlen)
|
||||
{
|
||||
int d1, d2;
|
||||
char c;
|
||||
const char *s;
|
||||
|
||||
for (s = src; *s != '\0' && *s != '@' && *s != ':'; s++) {
|
||||
if (s[0] == '%' && (d1 = fetch_hexval(s[1])) >= 0 &&
|
||||
(d2 = fetch_hexval(s[2])) >= 0 && (d1 > 0 || d2 > 0)) {
|
||||
c = d1 << 4 | d2;
|
||||
s += 2;
|
||||
} else {
|
||||
c = *s;
|
||||
}
|
||||
if (dlen-- > 0)
|
||||
*dst++ = c;
|
||||
}
|
||||
return (s);
|
||||
}
|
||||
|
||||
int
|
||||
fetch_urlpath_safe(char x)
|
||||
{
|
||||
@ -426,17 +467,10 @@ find_user:
|
||||
p = strpbrk(URL, "/@");
|
||||
if (p != NULL && *p == '@') {
|
||||
/* username */
|
||||
for (q = URL, i = 0; (*q != ':') && (*q != '@'); q++) {
|
||||
if (i < URL_USERLEN)
|
||||
u->user[i++] = *q;
|
||||
}
|
||||
|
||||
q = fetch_pctdecode(u->user, URL, URL_USERLEN);
|
||||
/* password */
|
||||
if (*q == ':') {
|
||||
for (q++, i = 0; (*q != '@'); q++)
|
||||
if (i < URL_PWDLEN)
|
||||
u->pwd[i++] = *q;
|
||||
}
|
||||
if (*q == ':')
|
||||
q = fetch_pctdecode(u->pwd, q + 1, URL_PWDLEN);
|
||||
|
||||
p++;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user