int http_response_body(http_client_ptr_t http_client)/*获取http响应的消息体字节流*/ { char tempbuf[RECVSIZE]; int recvlen; int totallen = 0; /* if(http_client->content_length == -1) { if((http_client->content_text = (char *)malloc(sizeof(char)*400000)) == NULL) { fprintf(stderr,"Error in http_response_body(). content_text malloc failed.\n"); return -1; } } else { if((http_client->content_text = (char *)malloc(sizeof(char)*(http_client->content_length) + 1))==NULL) { fprintf(stderr,"Error in http_response_body(). content_text malloc failed.\n"); return -1; } } */ http_client->content_text[0] = '\0'; // printf("malloc in 0x%08x. http_client->content_text malloc in http_client.\n", http_client->content_text); while((recvlen = nrecv(tempbuf, RECVSIZE, &http_client->network)) > 0) { totallen += recvlen; if(totallen >= 400000) { strncat(http_client->content_text, tempbuf,400000 - (totallen - recvlen)); totallen = 400000; break; } else { strncat(http_client->content_text, tempbuf,recvlen); // memcpy(http_client->content_text+totallen, tempbuf, recvlen); totallen += recvlen; } } http_client->content_text[totallen] = '\0'; if(recvlen <= -1) return -1; //fprintf(stderr,"http get body success!\n"); return totallen; }
int recv_line(network_t *network, char *buf, int limit) { char *p_delm = NULL, *s_offset = NULL; /* size: a line total bytes b_size: network->buffer now contain character rest: length belongs to next line but recv in this nrecv offset: first \n pointer in this recv */ int size = 0, b_size = network->len, rest, offset; int i; bzero(buf, limit); do { /* copy network->buffer data to buf, if a line enough return */ p_delm = strchr(network->buffer, '\n'); offset = p_delm != NULL ? (p_delm - network->buffer + 1 > limit - size ? limit - size : p_delm - network->buffer + 1) : (network->len > limit - size ? limit - size : network->len); rest = network->len - offset; if(size > limit) { return -1; } memcpy(buf + size, network->buffer, offset); s_offset = network->buffer + offset; memmove(network->buffer, s_offset, rest); network->buffer[rest] = '\0'; network->len = rest; size += offset; assert(size <= limit); if(size == limit || rest > 0) { return size; } bzero(network->buffer, BUFFER_SIZE); /* if a line not enough, go on read */ b_size = nrecv(network, network->buffer, BUFFER_SIZE); network->len = b_size > 0 ? b_size : 0; } while(b_size > 0); return b_size < 0 ? b_size : size; }
int http_do_get(http_client_t *http_client, char *path) { char http_request[REQ_SIZE]; bzero(http_request, REQ_SIZE); int size; /* send or recv timeout more than 3 times will stop */ sprintf(http_request, "GET %s HTTP/1.0\r\n" "Host: %s\r\n" "User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.11 " "(KH| TML, like Gecko) Ubuntu/11.10 Chromium/17.0.963.79 Chrome/17.0.963.79 Saf " "| ari/535.11\r\n" "Content-Type: application/x-www-form-urlencoded\r\n\r\n", path, http_client->connection.host); size = nsend(&http_client->connection, http_request, strlen(http_request)); if(size < 0) { fprintf(stderr, "Http Request failed, error code: %d\n", size); return REQUEST_FAILED; } char buf[BUFFER_SIZE]; http_res_t *response = &http_client->response; int entity_body_size, recv_body_length = 0; entity_body_size = ENTITY_BODY_SIZE_DEFAULT; /* recv http response */ response->enti_body.buffer = (char *) malloc(ENTITY_BODY_SIZE_DEFAULT); if(response->enti_body.buffer == NULL) { response->enti_body.len = 0; fprintf(stderr, "Error: allocate memory failed in func 'do_get'.\n"); return RESPONSE_FAILED; } else { response->enti_body.len = entity_body_size; bzero(response->enti_body.buffer, entity_body_size); do { bzero(buf, BUFFER_SIZE); size = nrecv(&http_client->connection, buf, LIMIT); if(size > 0) { if(recv_body_length + size > entity_body_size) { entity_body_size *= 2; response->enti_body.buffer = (char *)realloc(response->enti_body.buffer, entity_body_size); if(response->enti_body.buffer == NULL) { response->enti_body.len = 0; return RESPONSE_FAILED; } else { response->enti_body.len =entity_body_size; } } memcpy(response->enti_body.buffer + recv_body_length, buf, size); recv_body_length += size; } else if(size == 0) { response->enti_body.buffer[recv_body_length] = '\0'; return RESPONSE_OK; }else { return RESPONSE_FAILED; } } while(1); } return RESPONSE_FAILED; }