static int sendHead(const ExHttp *pHttp, char *pBuf, size_t len) { size_t nLen; nLen = sprintf(pBuf + len, "Server: " SERVER "\n\n"); DBG("%s", pBuf); return ex_sock_nwrite(pHttp->sock, pBuf, len + nLen); }
int putProcess(const ExHttp * pHttp, int rType) { static const char * c100 = "HTTP/1.1 100 Continue\n\n" ; size_t size ; int code ; const char * csize = get_head_info( pHttp, "Content-Length" ) ; size = csize==NULL ? 0 : atoi( csize ) ; char buf[size] ; char *pBuf = buf ; int ret = 0 ; ex_sock_nwrite( pHttp->sock, ( char * ) c100, strlen( c100 ) ) ; ex_sock_nread( pHttp->sock, ( char * ) &buf, sizeof (buf), size ) ; switch ( rType ) { case 0: /* static file */ case 1: /* dyanamic page: '.cgi' extension */ code = 200 ; writeFileStream( pHttp->url, ( char * ) &buf, size ) ; break ; case 404: code = 201 ; writeFileStream( pHttp->url, ( char * ) &buf, size ) ; break ; default: break ; } pBuf += codeSet( pBuf, code ) ; pBuf += sprintf( pBuf, "Connection: close\n" ) ; ret = sendHead( pHttp, buf, pBuf-buf ) ; return -1 ; }
int ex_send_msg(ExHttp *pHttp, const char *type, const char *buf, size_t len) { char hBuf[BUFSIZ] ; char *pBuf = hBuf ; int ret ; pBuf += codeSet( pBuf, 200 ) ; pBuf += typeSet( pBuf, type ) ; pBuf += lengthSet( pBuf, len ) ; do { if ( (ret = sendHead( pHttp, hBuf, pBuf-hBuf ))<0 ) break ; if ( (ret = ex_sock_nwrite( pHttp->sock, ( char * ) buf, len ))<0 ) break ; } while ( 0 ) ; return ret ; }
void requestHandler(void * s) { SOCKET sock = ( SOCKET ) s ; char recvBuf[MAX_HEADER_SIZE] ; char pool[512] ; /* int recvlen ; */ ExHttp httpInfo ; ++ExContext.threadCnt ; httpInfo.sock = sock ; ex_mpool_init( &httpInfo.mp, pool, sizeof (pool) ) ; do { if ( ExContext.quitFlag ) break ; httpInfo.recvLen = ex_read_head( sock, recvBuf, MAX_HEADER_SIZE ) ; if ( httpInfo.recvLen<=0 ) break ; httpInfo.curPos = recvBuf ; recvBuf[httpInfo.recvLen] = '\0' ; printf( "%s", recvBuf ) ; // strcat(recvBuf + httpInfo.recvLen , skipBrake); /* if method is not implemented */ if ( checkmethod( &httpInfo )<0 ) { DBG( "len: %s", httpInfo.method ) ; ex_error_reply( &httpInfo, 400 ) ; errorLog( &httpInfo, "parseURL error" ) ; break ; // ex_error_reply( &httpInfo, 501 ) ; // break ; } if ( parseURL( &httpInfo )<0 ) { DBG( "url: %s protocol %s", httpInfo.url, httpInfo.protocol ) ; ex_error_reply( &httpInfo, 400 ) ; errorLog( &httpInfo, "parseURL error" ) ; break ; } if ( strcmp( httpInfo.protocol, "HTTP/1.1" )!=0 ) { ex_error_reply( &httpInfo, 505 ) ; errorLog( &httpInfo, "HTTP Version Not Supported" ) ; break ; } /* if parse head error */ if ( parseHeader( &httpInfo )<0 ) { ex_error_reply( &httpInfo, 400 ) ; /* bad Request */ errorLog( &httpInfo, "parse head error" ) ; clearHttp( &httpInfo ) ; break ; } if ( strcmp( httpInfo.url, "/index.jsp" )==0 ) { ex_error_reply( &httpInfo, 301 ) ; const char * method = httpInfo.method ; char * message = "Location: http://127.0.0.1/index.html" ; size_t size = strlen( message ) ; if ( *method=='G'|| *method=='H' ) { ex_sock_nwrite( httpInfo.sock, message, size ) ; } errorLog( &httpInfo, "Moved Permanently" ) ; break ; } /* if reply error */ if ( replyHandler( &httpInfo )<0 ) { break ; } } while ( 1 ) ; closesocket( sock ) ; --ExContext.threadCnt ; }