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