------------------------------------------------------------ revno: 2344 committer: poy <p...@123gen.com> branch nick: trunk timestamp: Sun 2010-12-12 22:16:33 +0100 message: Update MiniUPnPc added: miniupnpc/Changelog.txt miniupnpc/VERSION modified: changelog.txt miniupnpc/miniupnpc.c miniupnpc/miniwget.c miniupnpc/miniwget.h
-- lp:dcplusplus https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk Your team Dcplusplus-team is subscribed to branch lp:dcplusplus. To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dcplusplus/trunk/+edit-subscription
=== modified file 'changelog.txt' --- changelog.txt 2010-12-11 23:50:40 +0000 +++ changelog.txt 2010-12-12 21:16:33 +0000 @@ -56,6 +56,7 @@ * Display full country names rather than abbreviations (poy) * Select a better default font (poy) * [L#681754] Fonts and dialogs respect DPI settings - mark DC++ as DPI aware (poy) +* Update MiniUPnPc (poy) -- 0.770 2010-07-05 -- * [L#550300] Catch more potential file corruptions (thanks bigmuscle) === added file 'miniupnpc/Changelog.txt' --- miniupnpc/Changelog.txt 1970-01-01 00:00:00 +0000 +++ miniupnpc/Changelog.txt 2010-12-12 21:16:33 +0000 @@ -0,0 +1,364 @@ +$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 + all UPNP_* function now return an error if the SOAP request failed + at HTTP level. + +2010/04/17: + Using GetBestRoute() under win32 in order to find the + right interface to use. + +2010/04/12: + Retrying with HTTP/1.1 if HTTP/1.0 failed. see + http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1703 + +2010/04/07: + avoid returning duplicates in upnpDiscover() + +2010/04/05: + Create a connecthostport.h/.c with connecthostport() function + and use it in miniwget and miniupnpc. + Use getnameinfo() instead of inet_ntop or inet_ntoa + Work to make miniupnpc IPV6 compatible... + Add java test code. + Big changes in order to support device having both WANIPConnection + and WANPPPConnection. + +2010/04/04: + Use getaddrinfo() instead of gethostbyname() in miniwget. + +2010/01/06: + #define _DARWIN_C_SOURCE for Mac OS X + +2009/12/19: + Improve MinGW32 build + +2009/12/11: + adding a MSVC9 project to build the static library and executable + +2009/12/10: + Fixing some compilation stuff for Windows/MinGW + +2009/12/07: + adaptations in Makefile and updateminiupnpcstring.sh for AmigaOS + some fixes for Windows when using virtual ethernet adapters (it is the + case with VMWare installed). + +2009/12/04: + some fixes for AmigaOS compilation + Changed HTTP version to HTTP/1.0 for Soap too (to prevent chunked + transfer encoding) + +2009/12/03: + updating printIDG and testigddescparse.c for debug. + modifications to compile under AmigaOS + adding a testminiwget program + Changed miniwget to advertise itself as HTTP/1.0 to prevent chunked + transfer encoding + +2009/11/26: + fixing updateminiupnpcstrings.sh to take into account + which command that does not return an error code. + +VERSION 1.4 : released 2009/10/30 + +2009/10/16: + using Py_BEGIN_ALLOW_THREADS and Py_END_ALLOW_THREADS in python module. + +2009/10/10: + Some fixes for compilation under Solaris + compilation fixes : http://miniupnp.tuxfamily.org/forum/viewtopic.php?p=1464 + +2009/09/21: + fixing the code to ignore EINTR during connect() calls. + +2009/08/07: + Set socket timeout for connect() + Some cleanup in miniwget.c + +2009/08/04: + remove multiple redirections with -d in upnpc.c + Print textual error code in upnpc.c + Ignore EINTR during the connect() and poll() calls. + +2009/07/29: + fix in updateminiupnpcstrings.sh if OS name contains "/" + Sending a correct value for MX: field in SSDP request + +2009/07/20: + Change the Makefile to compile under Mac OS X + Fixed a stackoverflow in getDevicesFromMiniSSDPD() + +2009/07/09: + Compile under Haiku + generate miniupnpcstrings.h.in from miniupnpcstrings.h + +2009/06/04: + patching to compile under CygWin and cross compile for minGW + +VERSION 1.3 : + +2009/04/17: + updating python module + Use strtoull() when using C99 + +2009/02/28: + Fixed miniwget.c for compiling under sun + +2008/12/18: + cleanup in Makefile (thanks to Paul de Weerd) + minissdpc.c : win32 compatibility + miniupnpc.c : changed xmlns prefix from 'm' to 'u' + Removed NDEBUG (using DEBUG) + +2008/10/14: + Added the ExternalHost argument to DeletePortMapping() + +2008/10/11: + Added the ExternalHost argument to AddPortMapping() + Put a correct User-Agent: header in HTTP requests. + +VERSION 1.2 : + +2008/10/07: + Update docs + +2008/09/25: + Integrated sameport patch from Dario Meloni : Added a "sameport" + argument to upnpDiscover(). + +2008/07/18: + small modif to make Clang happy :) + +2008/07/17: + #define SOAPPREFIX "s" in miniupnpc.c in order to remove SOAP-ENV... + +2008/07/14: + include declspec.h in installation (to /usr/include/miniupnpc) + +VERSION 1.1 : + +2008/07/04: + standard options for install/ln instead of gnu-specific stuff. + +2008/07/03: + now builds a .dll and .lib with win32. (mingw32) + +2008/04/28: + make install now install the binary of the upnpc tool + +2008/04/27: + added testupnpigd.py + added error strings for miniupnpc "internal" errors + improved python module error/exception reporting. + +2008/04/23: + Completely rewrite igd_desc_parse.c in order to be compatible with + Linksys WAG200G + Added testigddescparse + updated python module + +VERSION 1.0 : + +2008/02/21: + put some #ifdef DEBUG around DisplayNameValueList() + +2008/02/18: + Improved error reporting in upnpcommands.c + UPNP_GetStatusInfo() returns LastConnectionError + +2008/02/16: + better error handling in minisoap.c + improving display of "valid IGD found" in upnpc.c + +2008/02/03: + Fixing UPNP_GetValidIGD() + improved make install :) + +2007/12/22: + Adding upnperrors.c/h to provide a strupnperror() function + used to translate UPnP error codes to string. + +2007/12/19: + Fixing getDevicesFromMiniSSDPD() + improved error reporting of UPnP functions + +2007/12/18: + It is now possible to specify a different location for MiniSSDPd socket. + working with MiniSSDPd is now more efficient. + python module improved. + +2007/12/16: + improving error reporting + +2007/12/13: + Try to improve compatibility by using HTTP/1.0 instead of 1.1 and + XML a bit different for SOAP. + +2007/11/25: + fixed select() call for linux + +2007/11/15: + Added -fPIC to CFLAG for better shared library code. + +2007/11/02: + Fixed a potential socket leak in miniwget2() + +2007/10/16: + added a parameter to upnpDiscover() in order to allow the use of another + interface than the default multicast interface. + +2007/10/12: + Fixed the creation of symbolic link in Makefile + +2007/10/08: + Added man page + +2007/10/02: + fixed memory bug in GetUPNPUrls() + +2007/10/01: + fixes in the Makefile + Added UPNP_GetIGDFromUrl() and adapted the sample program accordingly. + Added SONAME in the shared library to please debian :) + fixed MS Windows compilation (minissdpd is not available under MS Windows). + +2007/09/25: + small change to Makefile to be able to install in a different location + (default is /usr) + +2007/09/24: + now compiling both shared and static library + +2007/09/19: + Cosmetic changes on upnpc.c + +2007/09/02: + adapting to new miniSSDPd (release version ?) + +2007/08/31: + Usage of miniSSDPd to skip discovery process. + +2007/08/27: + fixed python module to allow compilation with Python older than Python 2.4 + +2007/06/12: + Added a python module. + +2007/05/19: + Fixed compilation under MinGW + +2007/05/15: + fixed a memory leak in AddPortMapping() + Added testupnpreplyparse executable to check the parsing of + upnp soap messages + minixml now ignore namespace prefixes. + +2007/04/26: + upnpc now displays external ip address with -s or -l + +2007/04/11: + changed MINIUPNPC_URL_MAXSIZE to 128 to accomodate the "BT Voyager 210" + +2007/03/19: + cleanup in miniwget.c + +2007/03/01: + Small typo fix... + +2007/01/30: + Now parsing the HTTP header from SOAP responses in order to + get content-length value. + +2007/01/29: + Fixed the Soap Query to speedup the HTTP request. + added some Win32 DLL stuff... + +2007/01/27: + Fixed some WIN32 compatibility issues + +2006/12/14: + Added UPNPIGD_IsConnected() function in miniupnp.c/.h + Added UPNP_GetValidIGD() in miniupnp.c/.h + cleaned upnpc.c main(). now using UPNP_GetValidIGD() + +2006/12/07: + Version 1.0-RC1 released + +2006/12/03: + Minor changes to compile under SunOS/Solaris + +2006/11/30: + made a minixml parser validator program + updated minixml to handle attributes correctly + +2006/11/22: + Added a -r option to the upnpc sample thanks to Alexander Hubmann. + +2006/11/19: + Cleanup code to make it more ANSI C compliant + +2006/11/10: + detect and display local lan address. + +2006/11/04: + Packets and Bytes Sent/Received are now unsigned int. + +2006/11/01: + Bug fix thanks to Giuseppe D'Angelo + +2006/10/31: + C++ compatibility for .h files. + Added a way to get ip Address on the LAN used to reach the IGD. + +2006/10/25: + Added M-SEARCH to the services in the discovery process. + +2006/10/22: + updated the Makefile to use makedepend, added a "make install" + update Makefile + +2006/10/20: + fixing the description url parsing thanks to patch sent by + Wayne Dawe. + Fixed/translated some comments. + Implemented a better discover process, first looking + for IGD then for root devices (as some devices only reply to + M-SEARCH for root devices). + +2006/09/02: + added freeUPNPDevlist() function. + +2006/08/04: + More command line arguments checking + +2006/08/01: + Added the .bat file to compile under Win32 with minGW32 + +2006/07/31: + Fixed the rootdesc parser (igd_desc_parse.c) + +2006/07/20: + parseMSEARCHReply() is now returning the ST: line as well + starting changes to detect several UPnP devices on the network + +2006/07/19: + using GetCommonLinkProperties to get down/upload bitrate + === added file 'miniupnpc/VERSION' --- miniupnpc/VERSION 1970-01-01 00:00:00 +0000 +++ miniupnpc/VERSION 2010-12-12 21:16:33 +0000 @@ -0,0 +1,1 @@ +1.4 === modified file 'miniupnpc/miniupnpc.c' --- miniupnpc/miniupnpc.c 2010-10-05 21:48:07 +0000 +++ miniupnpc/miniupnpc.c 2010-12-12 21:16:33 +0000 @@ -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 @@ -26,6 +26,9 @@ #include <io.h> #include <iphlpapi.h> #define snprintf _snprintf +#ifdef strncasecmp +#undef strncasecmp +#endif #if defined(_MSC_VER) && (_MSC_VER >= 1400) #define strncasecmp _memicmp #else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ @@ -99,6 +102,7 @@ #endif } +#if 0 /* getcontentlenfromline() : parse the Content-Length HTTP header line. * Content-length: nnn */ static int getcontentlenfromline(const char * p, int n) @@ -167,6 +171,7 @@ } } } +#endif /* simpleUPnPcommand2 : * not so simple ! @@ -183,9 +188,9 @@ 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 +277,7 @@ return -1; } +#if 0 contentlen = -1; headerlen = -1; buf = buffer; @@ -291,7 +297,22 @@ 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 +327,10 @@ 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 +340,7 @@ *bufsize = origbufsize; result = simpleUPnPcommand2(s, url, service, action, args, buffer, bufsize, "1.1"); } +*/ return result; } === modified file 'miniupnpc/miniwget.c' --- miniupnpc/miniwget.c 2010-06-18 12:09:55 +0000 +++ miniupnpc/miniwget.c 2010-12-12 21:16:33 +0000 @@ -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> @@ -16,6 +17,14 @@ #define MAXHOSTNAMELEN 64 #define MIN(x,y) (((x)<(y))?(x):(y)) #define snprintf _snprintf +#ifdef strncasecmp +#undef strncasecmp +#endif +#if defined(_MSC_VER) && (_MSC_VER >= 1400) +#define strncasecmp _memicmp +#else /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ +#define strncasecmp memicmp +#endif /* defined(_MSC_VER) && (_MSC_VER >= 1400) */ #define socklen_t int #else /* #ifdef WIN32 */ #include <unistd.h> @@ -41,6 +50,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 +356,7 @@ 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 +368,8 @@ { 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 +379,7 @@ free(respbuffer); respbuffer = miniwget3(url, host, port, path, size, addr_str, addr_str_len, "1.1"); } +*/ return respbuffer; } === modified file 'miniupnpc/miniwget.h' --- miniupnpc/miniwget.h 2009-12-06 18:07:44 +0000 +++ miniupnpc/miniwget.h 2010-12-12 21:16:33 +0000 @@ -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);
_______________________________________________ Mailing list: https://launchpad.net/~linuxdcpp-team Post to : linuxdcpp-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~linuxdcpp-team More help : https://help.launchpad.net/ListHelp