コード例 #1
0
ファイル: http.c プロジェクト: whtc123/mysource
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;
}
コード例 #2
0
ファイル: http.c プロジェクト: whtc123/mysource
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);
	}
}
コード例 #3
0
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;
}
コード例 #4
0
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;
}
コード例 #5
0
ファイル: http.c プロジェクト: whtc123/mysource
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);
	}
	
}