mirror of
https://github.com/transmission/transmission
synced 2025-03-20 10:45:43 +00:00
update to miniupnpc-1.4.20101209
This commit is contained in:
parent
f4ee84069e
commit
78f2bff2a2
5 changed files with 274 additions and 57 deletions
16
third-party/miniupnp/Changelog.txt
vendored
16
third-party/miniupnp/Changelog.txt
vendored
|
@ -1,6 +1,20 @@
|
|||
$Id: Changelog.txt,v 1.117 2010/06/09 10:59:08 nanard Exp $
|
||||
$Id: Changelog.txt,v 1.122 2010/12/09 16:11:31 nanard Exp $
|
||||
miniUPnP client Changelog.
|
||||
|
||||
2010/12/09:
|
||||
new code for miniwget that handle Chunked transfer encoding
|
||||
using getHTTPResponse() in SOAP call code
|
||||
|
||||
2010/11/25:
|
||||
changes to minissdpc.c to compile under Win32.
|
||||
see http://miniupnp.tuxfamily.org/forum/viewtopic.php?t=729
|
||||
|
||||
2010/09/17:
|
||||
Various improvement to Makefile from Michał Górny
|
||||
|
||||
2010/08/05:
|
||||
Adding the script "external-ip.sh" from Reuben Hawkins
|
||||
|
||||
2010/06/09:
|
||||
update to python module to match modification made on 2010/04/05
|
||||
update to Java test code to match modification made on 2010/04/05
|
||||
|
|
4
third-party/miniupnp/minissdpc.c
vendored
4
third-party/miniupnp/minissdpc.c
vendored
|
@ -1,4 +1,4 @@
|
|||
/* $Id: minissdpc.c,v 1.13 2009/12/04 16:57:29 nanard Exp $ */
|
||||
/* $Id: minissdpc.c,v 1.14 2010/11/25 09:57:25 nanard Exp $ */
|
||||
/* Project : miniupnp
|
||||
* Author : Thomas BERNARD
|
||||
* copyright (c) 2005-2009 Thomas Bernard
|
||||
|
@ -15,6 +15,8 @@
|
|||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <io.h>
|
||||
#include <winsock.h>
|
||||
#include <stdint.h>
|
||||
#endif
|
||||
#if defined(__amigaos__) || defined(__amigaos4__)
|
||||
#include <sys/socket.h>
|
||||
|
|
31
third-party/miniupnp/miniupnpc.c
vendored
31
third-party/miniupnp/miniupnpc.c
vendored
|
@ -1,4 +1,4 @@
|
|||
/* $Id: miniupnpc.c,v 1.81 2010/04/17 22:07:59 nanard Exp $ */
|
||||
/* $Id: miniupnpc.c,v 1.83 2010/12/09 16:11:32 nanard Exp $ */
|
||||
/* Project : miniupnp
|
||||
* Author : Thomas BERNARD
|
||||
* copyright (c) 2005-2010 Thomas Bernard
|
||||
|
@ -99,6 +99,7 @@ LIBSPEC void parserootdesc(const char * buffer, int bufsize, struct IGDdatas * d
|
|||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
/* getcontentlenfromline() : parse the Content-Length HTTP header line.
|
||||
* Content-length: nnn */
|
||||
static int getcontentlenfromline(const char * p, int n)
|
||||
|
@ -167,6 +168,7 @@ getContentLengthAndHeaderLength(char * p, int n,
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* simpleUPnPcommand2 :
|
||||
* not so simple !
|
||||
|
@ -183,9 +185,9 @@ static int simpleUPnPcommand2(int s, const char * url, const char * service,
|
|||
char soapact[128];
|
||||
char soapbody[2048];
|
||||
char * buf;
|
||||
int buffree;
|
||||
/*int buffree;*/
|
||||
int n;
|
||||
int contentlen, headerlen; /* for the response */
|
||||
/*int contentlen, headerlen;*/ /* for the response */
|
||||
|
||||
snprintf(soapact, sizeof(soapact), "%s#%s", service, action);
|
||||
if(args==NULL)
|
||||
|
@ -272,6 +274,7 @@ static int simpleUPnPcommand2(int s, const char * url, const char * service,
|
|||
return -1;
|
||||
}
|
||||
|
||||
#if 0
|
||||
contentlen = -1;
|
||||
headerlen = -1;
|
||||
buf = buffer;
|
||||
|
@ -291,7 +294,22 @@ static int simpleUPnPcommand2(int s, const char * url, const char * service,
|
|||
if(contentlen > 0 && headerlen > 0 && *bufsize >= contentlen+headerlen)
|
||||
break;
|
||||
}
|
||||
|
||||
#endif
|
||||
buf = getHTTPResponse(s, &n);
|
||||
if(n > 0 && buf)
|
||||
{
|
||||
if(*bufsize > n)
|
||||
{
|
||||
memcpy(buffer, buf, n);
|
||||
*bufsize = n;
|
||||
}
|
||||
else
|
||||
{
|
||||
memcpy(buffer, buf, *bufsize);
|
||||
}
|
||||
free(buf);
|
||||
buf = 0;
|
||||
}
|
||||
closesocket(s);
|
||||
return 0;
|
||||
}
|
||||
|
@ -306,8 +324,10 @@ int simpleUPnPcommand(int s, const char * url, const char * service,
|
|||
char * buffer, int * bufsize)
|
||||
{
|
||||
int result;
|
||||
int origbufsize = *bufsize;
|
||||
/*int origbufsize = *bufsize;*/
|
||||
|
||||
result = simpleUPnPcommand2(s, url, service, action, args, buffer, bufsize, "1.1");
|
||||
/*
|
||||
result = simpleUPnPcommand2(s, url, service, action, args, buffer, bufsize, "1.0");
|
||||
if (result < 0 || *bufsize == 0)
|
||||
{
|
||||
|
@ -317,6 +337,7 @@ int simpleUPnPcommand(int s, const char * url, const char * service,
|
|||
*bufsize = origbufsize;
|
||||
result = simpleUPnPcommand2(s, url, service, action, args, buffer, bufsize, "1.1");
|
||||
}
|
||||
*/
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
276
third-party/miniupnp/miniwget.c
vendored
276
third-party/miniupnp/miniwget.c
vendored
|
@ -1,4 +1,4 @@
|
|||
/* $Id: miniwget.c,v 1.37 2010/04/12 20:39:42 nanard Exp $ */
|
||||
/* $Id: miniwget.c,v 1.38 2010/12/09 15:54:25 nanard Exp $ */
|
||||
/* Project : miniupnp
|
||||
* Author : Thomas Bernard
|
||||
* Copyright (c) 2005-2010 Thomas Bernard
|
||||
|
@ -8,6 +8,7 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include "miniupnpc.h"
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
|
@ -41,6 +42,227 @@
|
|||
#include "miniwget.h"
|
||||
#include "connecthostport.h"
|
||||
|
||||
/*
|
||||
* Read a HTTP response from a socket.
|
||||
* Process Content-Length and Transfer-encoding headers.
|
||||
*/
|
||||
void *
|
||||
getHTTPResponse(int s, int * size)
|
||||
{
|
||||
char buf[2048];
|
||||
int n;
|
||||
int headers = 1;
|
||||
int chunked = 0;
|
||||
int content_length = -1;
|
||||
unsigned int chunksize = 0;
|
||||
/* buffers : */
|
||||
char * header_buf;
|
||||
int header_buf_len = 2048;
|
||||
int header_buf_used = 0;
|
||||
char * content_buf;
|
||||
int content_buf_len = 2048;
|
||||
int content_buf_used = 0;
|
||||
|
||||
header_buf = malloc(header_buf_len);
|
||||
content_buf = malloc(content_buf_len);
|
||||
|
||||
while((n = ReceiveData(s, buf, 2048, 5000)) > 0)
|
||||
{
|
||||
if(headers)
|
||||
{
|
||||
int i;
|
||||
int linestart=0;
|
||||
int colon=0;
|
||||
int valuestart=0;
|
||||
if(header_buf_used + n > header_buf_len) {
|
||||
header_buf = realloc(header_buf, header_buf_used + n);
|
||||
header_buf_len = header_buf_used + n;
|
||||
}
|
||||
memcpy(header_buf + header_buf_used, buf, n);
|
||||
header_buf_used += n;
|
||||
for(i = 0; i < (header_buf_used-3); i++) {
|
||||
if(colon <= linestart && header_buf[i]==':')
|
||||
{
|
||||
colon = i;
|
||||
while(i < (n-3)
|
||||
&& (header_buf[i+1] == ' ' || header_buf[i+1] == '\t'))
|
||||
i++;
|
||||
valuestart = i + 1;
|
||||
}
|
||||
/* detecting end of line */
|
||||
else if(header_buf[i]=='\r' && header_buf[i+1]=='\n')
|
||||
{
|
||||
if(colon > linestart && valuestart > colon)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("header='%.*s', value='%.*s'\n",
|
||||
colon-linestart, header_buf+linestart,
|
||||
i-valuestart, header_buf+valuestart);
|
||||
#endif
|
||||
if(0==strncasecmp(header_buf+linestart, "content-length", colon-linestart))
|
||||
{
|
||||
content_length = atoi(header_buf+valuestart);
|
||||
#ifdef DEBUG
|
||||
printf("Content-Length: %d\n", content_length);
|
||||
#endif
|
||||
}
|
||||
else if(0==strncasecmp(header_buf+linestart, "transfer-encoding", colon-linestart)
|
||||
&& 0==strncasecmp(buf+valuestart, "chunked", 7))
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("chunked transfer-encoding!\n");
|
||||
#endif
|
||||
chunked = 1;
|
||||
}
|
||||
}
|
||||
linestart = i+2;
|
||||
colon = linestart;
|
||||
valuestart = 0;
|
||||
}
|
||||
/* searching for the end of the HTTP headers */
|
||||
if(header_buf[i]=='\r' && header_buf[i+1]=='\n'
|
||||
&& header_buf[i+2]=='\r' && header_buf[i+3]=='\n')
|
||||
{
|
||||
headers = 0; /* end */
|
||||
i += 4;
|
||||
if(i < header_buf_used)
|
||||
{
|
||||
if(chunked)
|
||||
{
|
||||
while(i<header_buf_used && isxdigit(header_buf[i]))
|
||||
{
|
||||
if(header_buf[i] >= '0' && header_buf[i] <= '9')
|
||||
chunksize = (chunksize << 4) + (header_buf[i] - '0');
|
||||
else
|
||||
chunksize = (chunksize << 4) + ((header_buf[i] | 32) - 'a' + 10);
|
||||
i++;
|
||||
}
|
||||
/* discarding chunk-extension */
|
||||
while(i < header_buf_used && header_buf[i] != '\r') i++;
|
||||
if(i < header_buf_used && header_buf[i] == '\r') i++;
|
||||
if(i < header_buf_used && header_buf[i] == '\n') i++;
|
||||
#ifdef DEBUG
|
||||
printf("chunksize = %u (%x)\n", chunksize, chunksize);
|
||||
#endif
|
||||
if(chunksize == 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("end of stream !\n");
|
||||
#endif
|
||||
goto end_of_stream;
|
||||
}
|
||||
if(header_buf_used - i <= chunksize)
|
||||
{
|
||||
if(content_buf_len < header_buf_used - i)
|
||||
{
|
||||
content_buf = realloc(content_buf, header_buf_used - i);
|
||||
content_buf_len = header_buf_used - i;
|
||||
}
|
||||
memcpy(content_buf, header_buf + i, header_buf_used - i);
|
||||
content_buf_used = header_buf_used - i;
|
||||
chunksize -= (header_buf_used - i);
|
||||
i = header_buf_used;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf("arg ! chunksize < (header_buf_used - i)\n");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(content_buf_len < header_buf_used - i)
|
||||
{
|
||||
content_buf = realloc(content_buf, header_buf_used - i);
|
||||
content_buf_len = header_buf_used - i;
|
||||
}
|
||||
memcpy(content_buf, header_buf + i, header_buf_used - i);
|
||||
content_buf_used = header_buf_used - i;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* content */
|
||||
if(chunked)
|
||||
{
|
||||
int i = 0;
|
||||
unsigned bytestocopy;
|
||||
while(i < n)
|
||||
{
|
||||
if(chunksize == 0)
|
||||
{
|
||||
/* reading chunk size */
|
||||
if(i<n && buf[i] == '\r') i++;
|
||||
if(i<n && buf[i] == '\n') i++;
|
||||
while(i<n && isxdigit(buf[i]))
|
||||
{
|
||||
if(buf[i] >= '0' && buf[i] <= '9')
|
||||
chunksize = (chunksize << 4) + (buf[i] - '0');
|
||||
else
|
||||
chunksize = (chunksize << 4) + ((buf[i] | 32) - 'a' + 10);
|
||||
i++;
|
||||
}
|
||||
while(i<n && buf[i] != '\r') i++; /* discarding chunk-extension */
|
||||
if(i<n && buf[i] == '\r') i++;
|
||||
if(i<n && buf[i] == '\n') i++;
|
||||
#ifdef DEBUG
|
||||
printf("chunksize = %u (%x)\n", chunksize, chunksize);
|
||||
#endif
|
||||
if(chunksize == 0)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("end of stream - %d %d\n", i, n);
|
||||
/*printf("'%.*s'\n", n-i, buf+i);*/
|
||||
#endif
|
||||
goto end_of_stream;
|
||||
}
|
||||
}
|
||||
bytestocopy = (chunksize < n - i)?chunksize:(n - i);
|
||||
if(content_buf_used + bytestocopy > content_buf_len)
|
||||
{
|
||||
content_buf = (char *)realloc((void *)content_buf,
|
||||
content_buf_used + bytestocopy);
|
||||
content_buf_len = content_buf_used + bytestocopy;
|
||||
}
|
||||
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);
|
||||
content_buf_used += bytestocopy;
|
||||
i += bytestocopy;
|
||||
chunksize -= bytestocopy;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(content_buf_used + n > content_buf_len)
|
||||
{
|
||||
content_buf = (char *)realloc((void *)content_buf,
|
||||
content_buf_used + n);
|
||||
content_buf_len = content_buf_used + n;
|
||||
}
|
||||
memcpy(content_buf + content_buf_used, buf, n);
|
||||
content_buf_used += n;
|
||||
}
|
||||
}
|
||||
if(content_length > 0 && content_buf_used >= content_length)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
printf("termine!\n");
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
end_of_stream:
|
||||
free(header_buf); header_buf = NULL;
|
||||
*size = content_buf_used;
|
||||
if(content_buf_used == 0)
|
||||
{
|
||||
free(content_buf);
|
||||
content_buf = NULL;
|
||||
}
|
||||
return content_buf;
|
||||
}
|
||||
|
||||
/* miniwget3() :
|
||||
* do all the work.
|
||||
* Return NULL if something failed. */
|
||||
|
@ -126,54 +348,7 @@ miniwget3(const char * url, const char * host,
|
|||
sent += n;
|
||||
}
|
||||
}
|
||||
{
|
||||
/* TODO : in order to support HTTP/1.1, chunked transfer encoding
|
||||
* must be supported. That means parsing of headers must be
|
||||
* added. */
|
||||
int headers=1;
|
||||
char * respbuffer = NULL;
|
||||
int allreadyread = 0;
|
||||
/*while((n = recv(s, buf, 2048, 0)) > 0)*/
|
||||
while((n = ReceiveData(s, buf, 2048, 5000)) > 0)
|
||||
{
|
||||
if(headers)
|
||||
{
|
||||
int i=0;
|
||||
while(i<n-3)
|
||||
{
|
||||
/* searching for the end of the HTTP headers */
|
||||
if(buf[i]=='\r' && buf[i+1]=='\n'
|
||||
&& buf[i+2]=='\r' && buf[i+3]=='\n')
|
||||
{
|
||||
headers = 0; /* end */
|
||||
if(i<n-4)
|
||||
{
|
||||
/* Copy the content into respbuffet */
|
||||
respbuffer = (char *)realloc((void *)respbuffer,
|
||||
allreadyread+(n-i-4));
|
||||
memcpy(respbuffer+allreadyread, buf + i + 4, n-i-4);
|
||||
allreadyread += (n-i-4);
|
||||
}
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
respbuffer = (char *)realloc((void *)respbuffer,
|
||||
allreadyread+n);
|
||||
memcpy(respbuffer+allreadyread, buf, n);
|
||||
allreadyread += n;
|
||||
}
|
||||
}
|
||||
*size = allreadyread;
|
||||
#ifdef DEBUG
|
||||
printf("%d bytes read\n", *size);
|
||||
#endif
|
||||
closesocket(s);
|
||||
return respbuffer;
|
||||
}
|
||||
return getHTTPResponse(s, size);
|
||||
}
|
||||
|
||||
/* miniwget2() :
|
||||
|
@ -185,6 +360,8 @@ miniwget2(const char * url, const char * host,
|
|||
{
|
||||
char * respbuffer;
|
||||
|
||||
respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1");
|
||||
/*
|
||||
respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.0");
|
||||
if (*size == 0)
|
||||
{
|
||||
|
@ -194,6 +371,7 @@ miniwget2(const char * url, const char * host,
|
|||
free(respbuffer);
|
||||
respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1");
|
||||
}
|
||||
*/
|
||||
return respbuffer;
|
||||
}
|
||||
|
||||
|
|
4
third-party/miniupnp/miniwget.h
vendored
4
third-party/miniupnp/miniwget.h
vendored
|
@ -1,4 +1,4 @@
|
|||
/* $Id: miniwget.h,v 1.5 2007/01/29 20:27:23 nanard Exp $ */
|
||||
/* $Id: miniwget.h,v 1.6 2010/12/09 16:11:33 nanard Exp $ */
|
||||
/* Project : miniupnp
|
||||
* Author : Thomas Bernard
|
||||
* Copyright (c) 2005 Thomas Bernard
|
||||
|
@ -14,6 +14,8 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
LIBSPEC void * getHTTPResponse(int s, int * size);
|
||||
|
||||
LIBSPEC void * miniwget(const char *, int *);
|
||||
|
||||
LIBSPEC void * miniwget_getaddr(const char *, int *, char *, int);
|
||||
|
|
Loading…
Add table
Reference in a new issue