parent
ef94635100
commit
8945a6ee15
|
@ -1,8 +1,8 @@
|
||||||
/* $Id: miniwget.c,v 1.75 2016/01/24 17:24:36 nanard Exp $ */
|
/* $Id: miniwget.c,v 1.78 2018/03/13 23:22:18 nanard Exp $ */
|
||||||
/* Project : miniupnp
|
/* Project : miniupnp
|
||||||
* Website : http://miniupnp.free.fr/
|
* Website : http://miniupnp.free.fr/
|
||||||
* Author : Thomas Bernard
|
* Author : Thomas Bernard
|
||||||
* Copyright (c) 2005-2017 Thomas Bernard
|
* Copyright (c) 2005-2018 Thomas Bernard
|
||||||
* This software is subject to the conditions detailed in the
|
* This software is subject to the conditions detailed in the
|
||||||
* LICENCE file provided in this distribution. */
|
* LICENCE file provided in this distribution. */
|
||||||
|
|
||||||
|
@ -230,102 +230,69 @@ getHTTPResponse(int s, int * size, int * status_code)
|
||||||
memcpy(buf, header_buf + endofheaders, n);
|
memcpy(buf, header_buf + endofheaders, n);
|
||||||
/* if(headers) */
|
/* if(headers) */
|
||||||
}
|
}
|
||||||
if(endofheaders)
|
/* if we get there, endofheaders != 0.
|
||||||
|
* In the other case, there was a continue above */
|
||||||
|
/* content */
|
||||||
|
if(chunked)
|
||||||
{
|
{
|
||||||
/* content */
|
int i = 0;
|
||||||
if(chunked)
|
while(i < n)
|
||||||
{
|
{
|
||||||
int i = 0;
|
if(chunksize == 0)
|
||||||
while(i < n)
|
|
||||||
{
|
{
|
||||||
|
/* reading chunk size */
|
||||||
|
if(chunksize_buf_index == 0) {
|
||||||
|
/* skipping any leading CR LF */
|
||||||
|
if(i<n && buf[i] == '\r') i++;
|
||||||
|
if(i<n && buf[i] == '\n') i++;
|
||||||
|
}
|
||||||
|
while(i<n && isxdigit(buf[i])
|
||||||
|
&& chunksize_buf_index < (sizeof(chunksize_buf)-1))
|
||||||
|
{
|
||||||
|
chunksize_buf[chunksize_buf_index++] = buf[i];
|
||||||
|
chunksize_buf[chunksize_buf_index] = '\0';
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
while(i<n && buf[i] != '\r' && buf[i] != '\n')
|
||||||
|
i++; /* discarding chunk-extension */
|
||||||
|
if(i<n && buf[i] == '\r') i++;
|
||||||
|
if(i<n && buf[i] == '\n') {
|
||||||
|
unsigned int j;
|
||||||
|
for(j = 0; j < chunksize_buf_index; j++) {
|
||||||
|
if(chunksize_buf[j] >= '0'
|
||||||
|
&& chunksize_buf[j] <= '9')
|
||||||
|
chunksize = (chunksize << 4) + (chunksize_buf[j] - '0');
|
||||||
|
else
|
||||||
|
chunksize = (chunksize << 4) + ((chunksize_buf[j] | 32) - 'a' + 10);
|
||||||
|
}
|
||||||
|
chunksize_buf[0] = '\0';
|
||||||
|
chunksize_buf_index = 0;
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
/* not finished to get chunksize */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("chunksize = %u (%x)\n", chunksize, chunksize);
|
||||||
|
#endif
|
||||||
if(chunksize == 0)
|
if(chunksize == 0)
|
||||||
{
|
{
|
||||||
/* reading chunk size */
|
|
||||||
if(chunksize_buf_index == 0) {
|
|
||||||
/* skipping any leading CR LF */
|
|
||||||
if(i<n && buf[i] == '\r') i++;
|
|
||||||
if(i<n && buf[i] == '\n') i++;
|
|
||||||
}
|
|
||||||
while(i<n && isxdigit(buf[i])
|
|
||||||
&& chunksize_buf_index < (sizeof(chunksize_buf)-1))
|
|
||||||
{
|
|
||||||
chunksize_buf[chunksize_buf_index++] = buf[i];
|
|
||||||
chunksize_buf[chunksize_buf_index] = '\0';
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
while(i<n && buf[i] != '\r' && buf[i] != '\n')
|
|
||||||
i++; /* discarding chunk-extension */
|
|
||||||
if(i<n && buf[i] == '\r') i++;
|
|
||||||
if(i<n && buf[i] == '\n') {
|
|
||||||
unsigned int j;
|
|
||||||
for(j = 0; j < chunksize_buf_index; j++) {
|
|
||||||
if(chunksize_buf[j] >= '0'
|
|
||||||
&& chunksize_buf[j] <= '9')
|
|
||||||
chunksize = (chunksize << 4) + (chunksize_buf[j] - '0');
|
|
||||||
else
|
|
||||||
chunksize = (chunksize << 4) + ((chunksize_buf[j] | 32) - 'a' + 10);
|
|
||||||
}
|
|
||||||
chunksize_buf[0] = '\0';
|
|
||||||
chunksize_buf_index = 0;
|
|
||||||
i++;
|
|
||||||
} else {
|
|
||||||
/* not finished to get chunksize */
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
printf("chunksize = %u (%x)\n", chunksize, chunksize);
|
printf("end of HTTP content - %d %d\n", i, n);
|
||||||
|
/*printf("'%.*s'\n", n-i, buf+i);*/
|
||||||
#endif
|
#endif
|
||||||
if(chunksize == 0)
|
goto end_of_stream;
|
||||||
{
|
|
||||||
#ifdef DEBUG
|
|
||||||
printf("end of HTTP content - %d %d\n", i, n);
|
|
||||||
/*printf("'%.*s'\n", n-i, buf+i);*/
|
|
||||||
#endif
|
|
||||||
goto end_of_stream;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* it is guaranteed that (n >= i) */
|
|
||||||
bytestocopy = (chunksize < (unsigned int)(n - i))?chunksize:(unsigned int)(n - i);
|
|
||||||
if((content_buf_used + bytestocopy) > content_buf_len)
|
|
||||||
{
|
|
||||||
char * tmp;
|
|
||||||
if((content_length >= 0) && ((unsigned int)content_length >= (content_buf_used + bytestocopy))) {
|
|
||||||
content_buf_len = content_length;
|
|
||||||
} else {
|
|
||||||
content_buf_len = content_buf_used + bytestocopy;
|
|
||||||
}
|
|
||||||
tmp = realloc(content_buf, content_buf_len);
|
|
||||||
if(tmp == NULL) {
|
|
||||||
/* memory allocation error */
|
|
||||||
free(content_buf);
|
|
||||||
free(header_buf);
|
|
||||||
*size = -1;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
content_buf = tmp;
|
|
||||||
}
|
|
||||||
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);
|
|
||||||
content_buf_used += bytestocopy;
|
|
||||||
i += bytestocopy;
|
|
||||||
chunksize -= bytestocopy;
|
|
||||||
}
|
}
|
||||||
}
|
/* it is guaranteed that (n >= i) */
|
||||||
else
|
bytestocopy = (chunksize < (unsigned int)(n - i))?chunksize:(unsigned int)(n - i);
|
||||||
{
|
if((content_buf_used + bytestocopy) > content_buf_len)
|
||||||
/* not chunked */
|
|
||||||
if(content_length > 0
|
|
||||||
&& (content_buf_used + n) > (unsigned int)content_length) {
|
|
||||||
/* skipping additional bytes */
|
|
||||||
n = content_length - content_buf_used;
|
|
||||||
}
|
|
||||||
if(content_buf_used + n > content_buf_len)
|
|
||||||
{
|
{
|
||||||
char * tmp;
|
char * tmp;
|
||||||
if(content_length >= 0
|
if((content_length >= 0) && ((unsigned int)content_length >= (content_buf_used + bytestocopy))) {
|
||||||
&& (unsigned int)content_length >= (content_buf_used + n)) {
|
|
||||||
content_buf_len = content_length;
|
content_buf_len = content_length;
|
||||||
} else {
|
} else {
|
||||||
content_buf_len = content_buf_used + n;
|
content_buf_len = content_buf_used + bytestocopy;
|
||||||
}
|
}
|
||||||
tmp = realloc(content_buf, content_buf_len);
|
tmp = realloc(content_buf, content_buf_len);
|
||||||
if(tmp == NULL) {
|
if(tmp == NULL) {
|
||||||
|
@ -337,10 +304,42 @@ getHTTPResponse(int s, int * size, int * status_code)
|
||||||
}
|
}
|
||||||
content_buf = tmp;
|
content_buf = tmp;
|
||||||
}
|
}
|
||||||
memcpy(content_buf + content_buf_used, buf, n);
|
memcpy(content_buf + content_buf_used, buf + i, bytestocopy);
|
||||||
content_buf_used += n;
|
content_buf_used += bytestocopy;
|
||||||
|
i += bytestocopy;
|
||||||
|
chunksize -= bytestocopy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* not chunked */
|
||||||
|
if(content_length > 0
|
||||||
|
&& (content_buf_used + n) > (unsigned int)content_length) {
|
||||||
|
/* skipping additional bytes */
|
||||||
|
n = content_length - content_buf_used;
|
||||||
|
}
|
||||||
|
if(content_buf_used + n > content_buf_len)
|
||||||
|
{
|
||||||
|
char * tmp;
|
||||||
|
if(content_length >= 0
|
||||||
|
&& (unsigned int)content_length >= (content_buf_used + n)) {
|
||||||
|
content_buf_len = content_length;
|
||||||
|
} else {
|
||||||
|
content_buf_len = content_buf_used + n;
|
||||||
|
}
|
||||||
|
tmp = realloc(content_buf, content_buf_len);
|
||||||
|
if(tmp == NULL) {
|
||||||
|
/* memory allocation error */
|
||||||
|
free(content_buf);
|
||||||
|
free(header_buf);
|
||||||
|
*size = -1;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
content_buf = tmp;
|
||||||
|
}
|
||||||
|
memcpy(content_buf + content_buf_used, buf, n);
|
||||||
|
content_buf_used += n;
|
||||||
|
}
|
||||||
/* use the Content-Length header value if available */
|
/* use the Content-Length header value if available */
|
||||||
if(content_length > 0 && content_buf_used >= (unsigned int)content_length)
|
if(content_length > 0 && content_buf_used >= (unsigned int)content_length)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue