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; }
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; }