Пример #1
0
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);
}
Пример #2
0
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 ;
}
Пример #3
0
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 ;
}
Пример #4
0
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 ;
}