--- embedaddon/miniupnpc/minihttptestserver.c 2012/02/21 23:16:22 1.1.1.1 +++ embedaddon/miniupnpc/minihttptestserver.c 2013/07/22 00:36:10 1.1.1.2 @@ -1,7 +1,7 @@ -/* $Id: minihttptestserver.c,v 1.1.1.1 2012/02/21 23:16:22 misho Exp $ */ +/* $Id: minihttptestserver.c,v 1.1.1.2 2013/07/22 00:36:10 misho Exp $ */ /* Project : miniUPnP * Author : Thomas Bernard - * Copyright (c) 2011 Thomas Bernard + * Copyright (c) 2011-2012 Thomas Bernard * This software is subject to the conditions detailed in the * LICENCE file provided in this distribution. * */ @@ -16,11 +16,12 @@ #include #include #include +#include #define CRAP_LENGTH (2048) -volatile int quit = 0; -volatile int child_to_wait_for = 0; +volatile sig_atomic_t quit = 0; +volatile sig_atomic_t child_to_wait_for = 0; /** * signal handler for SIGCHLD (child status has changed) @@ -129,8 +130,10 @@ char * build_chunked_response(int content_length, int response_buffer[(*response_len)++] = '\r'; response_buffer[(*response_len)++] = '\n'; } - memcpy(response_buffer + *response_len, "0\r\n", 3); - *response_len += 3; + /* the last chunk : "0\r\n" a empty body and then + * the final "\r\n" */ + memcpy(response_buffer + *response_len, "0\r\n\r\n", 5); + *response_len += 5; free(content_buffer); printf("resp_length=%d buffer_length=%d content_length=%d\n", @@ -161,8 +164,11 @@ void send_response(int c, const char * buffer, int len n = len; n = write(c, buffer, n); if(n < 0) { - perror("write"); - return; + if(errno != EINTR) { + perror("write"); + return; + } + /* if errno == EINTR, try again */ } else { len -= n; buffer += n; @@ -190,7 +196,7 @@ void handle_http_connection(int c) int content_length = 16*1024; /* read the request */ - while(request_len < sizeof(request_buffer) && !headers_found) { + while(request_len < (int)sizeof(request_buffer) && !headers_found) { n = read(c, request_buffer + request_len, sizeof(request_buffer) - request_len); @@ -218,7 +224,7 @@ void handle_http_connection(int c) printf("headers :\n%.*s", request_len, request_buffer); /* the request have been received, now parse the request line */ p = request_buffer; - for(i = 0; i < sizeof(request_method) - 1; i++) { + for(i = 0; i < (int)sizeof(request_method) - 1; i++) { if(*p == ' ' || *p == '\r') break; request_method[i] = *p; @@ -227,7 +233,7 @@ void handle_http_connection(int c) request_method[i] = '\0'; while(*p == ' ') p++; - for(i = 0; i < sizeof(request_uri) - 1; i++) { + for(i = 0; i < (int)sizeof(request_uri) - 1; i++) { if(*p == ' ' || *p == '\r') break; request_uri[i] = *p; @@ -236,7 +242,7 @@ void handle_http_connection(int c) request_uri[i] = '\0'; while(*p == ' ') p++; - for(i = 0; i < sizeof(http_version) - 1; i++) { + for(i = 0; i < (int)sizeof(http_version) - 1; i++) { if(*p == ' ' || *p == '\r') break; http_version[i] = *p; @@ -249,10 +255,24 @@ void handle_http_connection(int c) if(0 != strcmp(request_method, "GET")) { const char response405[] = "HTTP/1.1 405 Method Not Allowed\r\n" "Allow: GET\r\n\r\n"; + const char * pc; /* 405 Method Not Allowed */ /* The response MUST include an Allow header containing a list * of valid methods for the requested resource. */ - write(c, response405, sizeof(response405) - 1); + n = sizeof(response405) - 1; + pc = response405; + while(n > 0) { + i = write(c, pc, n); + if(i<0) { + if(errno != EINTR) { + perror("write"); + return; + } + } else { + n -= i; + pc += i; + } + } return; } @@ -360,12 +380,12 @@ int main(int argc, char * * argv) { struct sockaddr_in6 * addr = (struct sockaddr_in6 *)&server_addr; addr->sin6_family = AF_INET6; addr->sin6_port = htons(port); - addr->sin6_addr = in6addr_any; + addr->sin6_addr = in6addr_loopback; } else { struct sockaddr_in * addr = (struct sockaddr_in *)&server_addr; addr->sin_family = AF_INET; addr->sin_port = htons(port); - addr->sin_addr.s_addr = htonl(INADDR_ANY); + addr->sin_addr.s_addr = htonl(INADDR_LOOPBACK); } if(bind(s, (struct sockaddr *)&server_addr, ipv6 ? sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)) < 0) { @@ -400,9 +420,14 @@ int main(int argc, char * * argv) { char * buffer; buffer = malloc(16*1024); build_content(buffer, 16*1024); - fwrite(buffer, 1, 16*1024, f); + i = fwrite(buffer, 1, 16*1024, f); + if(i != 16*1024) { + fprintf(stderr, "error writing to file %s : %dbytes written (out of %d)\n", expected_file_name, i, 16*1024); + } free(buffer); fclose(f); + } else { + fprintf(stderr, "error opening file %s for writing\n", expected_file_name); } }