/// The handler for incoming HTTP chunks.
  /// Outputs the chunk header and body to //std::cout.
  void Handlers::chunk(
    http_connection::weak_pointer weak_ptr,
    http_chunk_type const& chunk,
    std::string const& data)
  {
    if (chunk.is_last())
    {
      console->debug("Rx chunk is last, extension: {0} trailers {1} ", chunk.extension(), chunk.trailers().to_string());

      // Only send a response to the last chunk.
      respond_to_request(weak_ptr);
    }
  }
Пример #2
0
void web_child( int sockfd ){

	int			ntowrite;
	ssize_t		nread;
    char		line[ MAXLINE ], result[ MAXN ]; //, request_buffer[ REQUEST_BUFFER_SIZE ];

    char *request_buffer_tail;
    char *request_buffer;

    int first_character;

    request_buffer = malloc( 100 * sizeof(char*) );
    assert( request_buffer != NULL );


    memset( request_buffer, 0, 100 * sizeof(char*) );

    size_t buffer_size = 0;
    size_t new_buffer_size = 0;

    int flags = fcntl( sockfd, F_GETFL, 0 );
    fcntl( sockfd, F_SETFL, flags | O_NONBLOCK );

    int has_read_request = 0;
    int ready_to_close = 0;

    time_t last_request_time, current_time;

    last_request_time = time( NULL );
    current_time = time( NULL );


	for ( ; ; ) {

        nread = read( sockfd, line, MAXLINE );

        if( nread == -1 ){

            if( errno != EAGAIN ){
                printf( "Error reading from socket.\n" );
                break;
            }

            usleep( 50 );
            nread = 0;

            current_time = time( NULL );

        }else{

            last_request_time = time( NULL );
            current_time = time( NULL );

        }

        //10 second inactivity timeout before closing the tcp connection
        if( current_time - last_request_time  >= 1 ){
            ready_to_close = 1;
        }

        //printf( "Number of bytes read: %d\n", nread );
        //printf( "last_request_time: %d\n", last_request_time );
        //printf( "current_time: %d\n", current_time );
        //fflush( stdout );

        if( nread != 0 ){

            new_buffer_size += nread;
            request_buffer = (char*) realloc( request_buffer, new_buffer_size * sizeof(char*) );
            assert( request_buffer != NULL );

            request_buffer_tail = request_buffer + buffer_size;
            memcpy( request_buffer_tail, line, nread );
            buffer_size = new_buffer_size;

            first_character = (int)*line;

            //if( first_character == 13 ){
                respond_to_request( sockfd, request_buffer, buffer_size );
                memset( request_buffer, 0, buffer_size );
                buffer_size = 0;
                new_buffer_size = 0;
                has_read_request = 1;
            //}

        }else{

            //no bytes read
            if( has_read_request == 1 ){ //&& ready_to_close == 1 ){
                break;
            }

        }

	}

    free( request_buffer );

    //close( sockfd );


}