void httpsession_read(struct event *ev,int what, void *d) { size_t len=0; size_t conten_len=0; char *line=NULL; char *ptr=NULL; //ptr=buff_tail_ptr() HttpSession *session = (HttpSession *)d; len=buff_read(session->fd, session->request.buff, buff_tail_left(session->request.buff)); if(len<=0 ) goto fail; while( (line=buff_get_line( session->request.buff,EOL_CRLF)) !=NULL ) { if(session->request.prase_status==HPARSE_HEAD ) { if( strlen(line)==0 ) { session->request.prase_status=HPARSE_CONTENT; break; } if(http_parse_head(&session->request, line) == -1) { TraceErr("http_parse_head fail\n"); goto fail; } continue; } if(session->request.prase_status==HPARSE_FIRST_LINE) { if(http_parse_first_line(&session->request,line)==-1) goto fail; session->request.prase_status=HPARSE_HEAD; continue; } } if(session->request.prase_status== HPARSE_CONTENT ) { if(buff_len(session->request.buff) >= session->request.content_len) { session->request.prase_status = HPARSE_DONE; if(httpserver_route_request(session)!=200)goto fail; //if(session->server->request_callback(session,session->server->arg) != 0 ) // goto fail; //event_fd_setflags(session->ev,EPOLLIN|EPOLLOUT); //event_fd_setcallback(session->ev,httpsession_write); event_fd_setcallback(session->ev,httpsession_file_write); event_fd_setflags(session->ev,EPOLLOUT); } } return; fail: TraceErr("httpsession_read fail\n"); httpserver_session_free(session); return; }
void httpsession_write(struct event *ev,int what, void *d) { HttpSession *session = (HttpSession *)d; Buff *buff=session->response; int len=0; if(buff_len(buff)>0 ) { len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { if(errno == EAGAIN) { return; } } if(buff_len(buff)==0 ) httpserver_session_free( session); } }
bool clIndexerProtocol::ReadReply(clNamedPipe* conn, clIndexerReply& reply) { // first we read sizeof(size_t) to get the actual data size size_t buff_len(0); size_t actual_read(0); if ( !conn->read((void*)&buff_len, sizeof(buff_len), &actual_read, 10000) ) { fprintf(stderr, "ERROR: ReadReply: Failed to read from the pipe, reason: %d\n", conn->getLastError()); return false; } if (actual_read != sizeof(buff_len)) { fprintf(stderr, "ERROR: ReadReply: Protocol error: expected %lu bytes, got %u. reason: %d\n", sizeof(buff_len), (unsigned int)actual_read, conn->getLastError()); return false; } if ((buff_len / (1024*1024)) > 15) { // Dont read buffers larger than 15MB... return false; } char *data = new char[buff_len]; CharDeleter deleter(data); int bytes_left(buff_len); size_t bytes_read(0); while (bytes_left > 0) { if ( !conn->read(data+bytes_read, bytes_left, &actual_read, 10000) ) { fprintf(stderr, "ERROR: Protocol error: expected %u bytes, got %u\n", (unsigned int)buff_len, (unsigned int)actual_read); return false; } bytes_left -= actual_read; bytes_read += actual_read; } reply.fromBinary(data); return true; }
bool clIndexerProtocol::ReadRequest(clNamedPipe* conn, clIndexerRequest& req) { // first we read sizeof(size_t) to get the actual data size size_t buff_len(0); size_t actual_read(0); if ( !conn->read((void*)&buff_len, sizeof(buff_len), &actual_read, -1) ) { fprintf(stderr, "ERROR: Failed to read from the pipe, reason: %d\n", conn->getLastError()); return false; } if (actual_read != sizeof(buff_len)) { fprintf(stderr, "ERROR: Protocol error: expected %lu bytes, got %u\n", sizeof(buff_len), (unsigned int)actual_read); return false; } if(buff_len == 0) return false; char *data = new char[buff_len]; CharDeleter deleter(data); int bytes_left(buff_len); size_t bytes_read(0); while (bytes_left > 0) { if ( !conn->read(data+bytes_read, bytes_left, &actual_read, -1) ) { fprintf(stderr, "ERROR: [%s] Protocol error: expected %u bytes, got %u\n", __PRETTY_FUNCTION__, (unsigned int)buff_len, (unsigned int)actual_read); return false; } bytes_left -= actual_read; bytes_read += actual_read; } req.fromBinary(data); return true; }
void httpsession_file_write(struct event *ev,int what, void *d) { HttpSession *session = (HttpSession *)d; Buff *buff=session->response; int file_fd=session->file_fd; int len=0; /*here is most send http head or fail with EAGAIN*/ if(buff_len(buff)>0 ) { len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { if(errno == EAGAIN) { return; } } } while(1) { buff_set_startpos( buff,0); /*read file*/ do { len=buff_read(file_fd,buff,buff_tail_left(buff)); if(len == 0 ) { httpserver_session_free( session); return; } if(len == -1) { if(errno == EAGAIN) { continue; } TraceErr("read file fail:%s\n",strerror(errno)); httpserver_session_free( session); return ; } }while(0); session->total_read+=len; /*send out*/ len=buff_write(session->fd,buff,buff_len(buff)); if(len<0) { /*socket buff full,try again*/ if(errno == EAGAIN) { return; } /*error free session*/ TraceErr("session write:FAIL\n"); httpserver_session_free( session); break; } //printf("session write:%u\n",len); } }