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