Пример #1
0
int onData(int epfd,struct epoll_event ev,http_request_r **r)
{
	char buf[1024];
	void *msg;
	int ret;
	int j;

	memset(buf,0,1024);
        ret = recv(ev.data.fd,buf,1024,0);
        if(ret==-1)
        {
              if(errno != EINTR  && errno != EAGAIN){
                    close(ev.data.fd);
                    ev.data.fd = -1;
                    perror("error");
              }else{
                    perror("recive error");
              }
        }
        else if(ret==0)
	{
              close(ev.data.fd);
              ev.data.fd = -1;
        }
        else if(ret>0)
        {
		struct http_request_r *p;
		p = find_http_request(*r,ev.data.fd);
	      	http_request_parse(p,buf);

		if(p->is_end==1)
		{
			struct http_response_r *o;
			o = (struct http_response_r *)malloc(sizeof(struct http_response_r));			
			memset(o,0,sizeof(struct http_response_r));

			static_http_response_out(*r,o);
              		
			ret = send(ev.data.fd,o->buf,o->size,0);
              		if(ret<0)
              		{
                    		perror("send error!");
                    		return -1;
              		}
	
			ret = send(ev.data.fd,o->body,o->content_length,0);
              		if(ret<0)
              		{
                    		perror("send error!");
                    		return -1;
              		}
	
			delete_http_request(r,ev.data.fd);	
		
			close(ev.data.fd);
                	ev.data.fd=-1;		
		}		
        }
	return 0;
}
struct http_request *parse_request(char *request_data, int len) {
    http_parser *parser = malloc(sizeof(http_parser));
    http_parser_init(parser, HTTP_REQUEST);
    struct http_request *request = new_http_request();
    parser->data = request;
    int res = http_parser_execute(parser, &parser_settings, request_data, len);
    if (res == len) {
        if (http_should_keep_alive(parser)) {
            request->flags |= F_HREQ_KEEPALIVE;
        }
        free(parser);
        return request;
    }
    delete_http_request(request);
    free(parser);
    return NULL;
}
Пример #3
0
int parse_http_request(http_client* client, http_request** request)
{
	if ((!client) || (!client->recvbuf) || (!request)) {
		err_log("parse_http_request: got null pointer in client, client->recvbuf or request");
		return 0;
	}

	*request = malloc(sizeof(struct http_request_t));
	if (!*request) {
		err_sys("parse_http_request: malloc() failed");
		return 0;
	}

	(*request)->path = 0;
	(*request)->version = 0;
	(*request)->variables = 0;
	(*request)->headers = 0;

	client->currpos = client->recvbuf;
	char* unparsed_recvbuf = client->currpos;

	if (!parse_http_request_uri(&unparsed_recvbuf, *request)) {
		goto cleanup;
	}

	if (!parse_http_request_header(&unparsed_recvbuf, *request)) {
		info_log("parse_http_request_header failed");
		goto cleanup;
	}

	/* ***FIXME*** */
	char* version = malloc(sizeof(char) * (strlen("HTTP/1.1")+1));
	strcpy(version, "HTTP/1.1");
	(*request)->version = version;
	return 1;

cleanup:
	delete_http_request(*request);
	return 0;
}