Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
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;
}