Пример #1
0
//response static resource
void http_response_static_proc( httpHeader* reqHeader )
{
	int len, cllen , ctlen ;
	char path[1024] = {0};
	header_out_t  header_out;
	memset( &header_out , 0 , sizeof( header_out ));
	header_out.req = reqHeader;

	get_file_path( reqHeader->uri , path );
	struct stat stat_file;
	int ret =  stat( path , &stat_file );

	if ( ret < 0 )
	{
		//printf( "not found page=%s \n" , path );
		resp_error_page( &header_out , 404 );
		return;
	}

	create_common_header( &header_out , 200 );
	header_append_length( &header_out , stat_file.st_size );
	resp_append_header( &header_out , HEADER_END_LINE );

	int nwritten = write( reqHeader->connfd , header_out.data , header_out.length );
	if (nwritten <= 0)
	{
		printf( "I/O error writing to client connfd=%d,len=%d: %s \n", reqHeader->connfd , header_out.length , strerror(errno));
		return;
	}

	int fd = open( path , O_RDONLY );
	if ( fd < 0 )
	{
		printf( "Open file Error:%s,errno=%d \n" , strerror(errno) , errno );
		return;
	}
    //优化
	//setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on));
	off_t offset = 0;
	int force_close = 0;
	while ( offset < stat_file.st_size  )
	{
		int sendn = sendfile( reqHeader->connfd , fd , &offset , stat_file.st_size - offset );
		if ( sendn < 0 )
		{
			//如果socket缓冲区不可用,则挂起等待可用
			if (errno == EAGAIN || errno == EINTR  )
			{
				if( anetHandup(  reqHeader->connfd , 1000 , AE_WRITABLE ) < 0 )
				{
					//如果超时,退出
					printf( "Sendfile anetHandup timeout.......\n" );
					force_close = 1;
					break;
				}
				else
				{
					//否则继续发送
					continue;
				}
			}
			else
			{
				break;
			}
		}
		//printf( "Response uri=%s, connfd=%d,len=%d,send=%d \n", reqHeader->uri , reqHeader->connfd ,stat_file.st_size  , sendn );
	}
	close( fd );
	http_close( reqHeader , force_close );
}
Пример #2
0
void httpResponseStaticProc( httpHeader *req_header )
{
	
	int len,cllen,ctlen;
	char path[1024] =
			{0};
	headerOut header_out;
	memset( &header_out , 0 , sizeof( header_out ) );
	header_out.req = req_header;
	
	getFilePath( req_header->uri , path );
	struct stat stat_file;
	int ret = stat( path , &stat_file );
	
	if (ret < 0)
	{
		respErrorPage( &header_out , 404 );
		return;
	}
	
	createCommonHeader( &header_out , 200 );
	headerAppendLength( &header_out , stat_file.st_size );
	appendRespHeader( &header_out , HEADER_END_LINE );
	
	int nwritten = write( req_header->connfd , header_out.data , header_out.length );
	if (nwritten <= 0)
	{
		printf( "I/O error writing to client connfd=%d,len=%d: %s \n" ,
				req_header->connfd , header_out.length , strerror( errno ) );
		return;
	}
	
	if (req_header->nobody == AE_TRUE)
	{
		httpClose( req_header , 1 );
		return;
	}
	
	int fd = open( path , O_RDONLY );
	if (fd < 0)
	{
		printf( "Open file Error:%s,errno=%d \n" , strerror( errno ) , errno );
		return;
	}
	
	// setsockopt (fd, SOL_TCP, TCP_CORK, &on, sizeof (on));
	off_t offset = 0;
	int force_close = 0;
	while (offset < stat_file.st_size)
	{
		int sendn =
				sendfile( req_header->connfd , fd , &offset , stat_file.st_size - offset );
		
		if (sendn < 0)
		{
			//如果socket缓冲区不可用,则挂起等待可用
			if (errno == EAGAIN || errno == EINTR)
			{
				if (anetHandup( req_header->connfd , 5000 , AE_WRITABLE ) < 0)
				{
					//如果超时,退出
					printf( "Sendfile anetHandup timeout.......\n" );
					force_close = 1;
					break;
				}
				else
				{
					//否则继续发送
					continue;
				}
			}
			else
			{
				break;
			}
		}
	}
	close( fd );
	httpClose( req_header , force_close );
}