예제 #1
0
파일: proxy.c 프로젝트: fxiang/proxylab
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; 
}
예제 #2
0
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,"");
	

}
예제 #3
0
파일: proxy.c 프로젝트: yuguess/ProxyLabNew
/* 
 * 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; 
}