/** @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; } }