Ejemplo n.º 1
0
/** @brief read handler
 *  @return void
 */
void SelPool::readHandler(ClientConnection *client)
{
    if (client->isFull()) {
        return;
    }

    ssize_t size;
    int retSize = 0;
    char* buf = client->getReadBuffer_ForWrite(&size);
    int connFd = client->getFd();
    //printf("reading client %d\n", connFd);

    if(client->isHTTP()) {
        printf( "HTTP client ...\n");
        retSize = read(connFd, buf, size);
    }
    else if(client->isHTTPS()) {
        printf( "HTTPS client ...\n");
        //retSize = SSL_read(connPtr->connSSL, buf, size);
    }
    else {
        retSize = -1;
    }

    if (retSize > 0)
    {
        printf("Successfully Read %d Bytes from client %d\n", retSize, client->getFd());
        client->addReadSize(retSize);
        
        /* get read buffer */
        ssize_t size;
        char* parse_buf = client->getReadBuffer_ForRead(&size);
        
        /* try to parse the request from buffer */
        HTTPRequest *req = client->getRequest();
        req->httpParse(parse_buf, &size);
        client->removeReadSize(size);

        // TODO: to add a status "Request_Parsing"
        if (client->getRequest()->getState() == HTTPRequest::ParsedCorrect
         || client->getRequest()->getState() == HTTPRequest::ParsedError) {
            client->setState(ClientConnection::Request_Parsed);
        }
    }
    /** EOF incurred, connection closed by client */
    else if (retSize == 0)
    {
        printf("set Client [%d] closed\n", connFd);
        client->setClosed();
        client->setState(ClientConnection::Request_Parsed);
        return;
    }
    else /* Read error: retSize < 0 */ 
    {
        printf("Error reading from client.\n");
        if(client->isHTTPS())
        {
            // int err = SSL_get_error(connPtr->connSSL, retSize);
            // switch(err) 
            // {
            //     case SSL_ERROR_WANT_READ:
            //     case SSL_ERROR_WANT_WRITE:
            //         printf("SSL WANT MORE.\n");
            //         return;
            //     default:
            //         ERR_print_errors_fp(getLogger());
            //         break;
            // }
        }
        else 
        {
            if(errno == EINTR) {
                printf("RECV EINTR. Try later again.\n");
                return;
            }
        }
        client->setClosed();
        return;
    }

}