void *request_handler(void *ptr) { #ifdef DEBUG printf("enter request_handler\n"); #endif int client_fd = ((Thread_Input*)ptr)->client_fd; Request request; Response response; parse_request_header(client_fd, &request); modify_request_header(&request); if (check_cache(&request, &response)) { send_client(client_fd, &response); } else { if (forward_request(client_fd, &request, &response) < 0) { Close(client_fd); return NULL; } else { if (response.content_size <= MAX_OBJECT_SIZE) save_to_cache(&request, &response); } } free(ptr); Close(client_fd); #ifdef DEBUG printf("connection close\n\n"); printf("leave request_handler\n"); #endif return NULL; }
StatusLine FileReader::get_from_file(const std::string& full_path,Entity& saver ) { std::ifstream file_stream(full_path.c_str(),std::ios::in | std::ios::binary); if (! file_stream.is_open()) { return StatusLine(http_500,"fail to open file"); } while (!file_stream.eof() ) { saver.data().ensure_write_space(m_read_block_size); file_stream.read(saver.data().wt_ptr(),m_read_block_size) ; saver.data().has_written(file_stream.gcount()); } saver.head().get_container()[HeadFields::EntityFields::ent_content_length]= StringHelper::integer_to_string<size_t>((size_t)saver.data().readable_bytes()); save_to_cache(full_path,saver); return StatusLine(http_200,""); }
/* * request_handler - general function to handler each client request */ void *request_handler(int client_fd) { #ifdef DEBUG printf("enter request_handler\n"); #endif Request request; Response response; parse_request_header(client_fd, &request); modify_request_header(&request); if (check_cache(&request, &response)) { #ifdef DEBUG printf("in cache ! \n"); #endif send_client(client_fd, &response); } else { #ifdef DEBUG printf("not in cache !\n"); #endif if (forward_request(client_fd, &request, &response) < 0) { close(client_fd); return NULL; } else { /* save to cache if status code 2XX and < max size */ if (response.content_size <= MAX_OBJECT_SIZE && response.header[state_ofs] == '2') save_to_cache(&request, &response); } } close(client_fd); #ifdef DEBUG printf("connection close\n"); printf("leave request_handler\n"); #endif return NULL; }