Author: rhuijben Date: Sun Nov 29 13:27:53 2015 New Revision: 1717064 URL: http://svn.apache.org/viewvc?rev=1717064&view=rev Log: In the mock-http server: stop reading requests when we decide that we are going to close the connection. Reading them may tell the other side that we are going to process them.
* test/MockHTTPinC/MockHTTP_server.c (sslSocketShutdown): Add prototype. (shutdown_func_t): Define. (_mhClientCtx_t): Add shutdown function. (socketShutdown): New function. (processServer): Shutdown the connection when we decide to stop processing after this request. (initClientCtx): Init functions. (sslSocketShutdown): New function. Modified: serf/trunk/test/MockHTTPinC/MockHTTP_server.c Modified: serf/trunk/test/MockHTTPinC/MockHTTP_server.c URL: http://svn.apache.org/viewvc/serf/trunk/test/MockHTTPinC/MockHTTP_server.c?rev=1717064&r1=1717063&r2=1717064&view=diff ============================================================================== --- serf/trunk/test/MockHTTPinC/MockHTTP_server.c (original) +++ serf/trunk/test/MockHTTPinC/MockHTTP_server.c Sun Nov 29 13:27:53 2015 @@ -60,6 +60,8 @@ static apr_status_t sslSocketWrite(_mhCl apr_size_t *len); static apr_status_t sslSocketRead(apr_socket_t *skt, void *baton, char *data, apr_size_t *len); +static apr_status_t sslSocketShutdown(_mhClientCtx_t *cctx, apr_shutdown_how_e how); + static apr_status_t renegotiateSSLSession(_mhClientCtx_t *cctx); typedef apr_status_t (*handshake_func_t)(_mhClientCtx_t *cctx); @@ -69,6 +71,10 @@ typedef apr_status_t (*send_func_t)(_mhC typedef apr_status_t (*receive_func_t)(apr_socket_t *skt, void *baton, char *data, apr_size_t *len); +typedef apr_status_t (*shutdown_func_t)(_mhClientCtx_t *cctx, + apr_shutdown_how_e how); + + typedef struct sslCtx_t sslCtx_t; typedef struct bucket_t bucket_t; static const apr_port_t DefaultSrvPort = 30080; @@ -100,6 +106,7 @@ struct _mhClientCtx_t { send_func_t send; receive_func_t read; + shutdown_func_t shutdown; bucket_t *stream; /* Bucket for incoming data */ @@ -188,6 +195,12 @@ static apr_status_t socketRead(apr_socke return apr_socket_recv(skt, data, len); } +static apr_status_t socketShutdown(_mhClientCtx_t *cctx, + apr_shutdown_how_e how) +{ + return apr_socket_shutdown(cctx->skt, how); +} + /** * Sets up a listener on the socket stored in CTX. */ @@ -1381,6 +1394,7 @@ static apr_status_t processServer(mhServ case mhActionCloseConnection: /* close conn after response */ resp->closeConn = YES; + cctx->shutdown(cctx, APR_SHUTDOWN_READ); break; default: break; @@ -1394,6 +1408,7 @@ static apr_status_t processServer(mhServ if (ctx->maxRequests && cctx->reqsReceived >= ctx->maxRequests) { setHeader(resp->hdrs, "Connection", "close"); resp->closeConn = YES; + cctx->shutdown(cctx, APR_SHUTDOWN_READ); } /* Link the request to the response, and push the response on the @@ -1487,6 +1502,7 @@ static apr_status_t initClientCtx(_mhCli type == mhHTTPv1Proxy || type == mhHTTPv11Proxy) { cctx->read = socketRead; cctx->send = socketWrite; + cctx->shutdown = socketShutdown; } #ifdef MOCKHTTP_OPENSSL if (type == mhHTTPSv1Server || type == mhHTTPSv11Server) { @@ -1495,6 +1511,7 @@ static apr_status_t initClientCtx(_mhCli cctx->handshake = sslHandshake; cctx->read = sslSocketRead; cctx->send = sslSocketWrite; + cctx->shutdown = sslSocketShutdown; cctx->keyFile = serv_ctx->keyFile; cctx->passphrase = serv_ctx->passphrase; cctx->certFiles = serv_ctx->certFiles; @@ -2825,6 +2842,17 @@ sslSocketRead(apr_socket_t *skt, void *b return APR_EGENERAL; } +static apr_status_t sslSocketShutdown(_mhClientCtx_t *cctx, + apr_shutdown_how_e how) +{ + if (how == APR_SHUTDOWN_READ + || how == APR_SHUTDOWN_READWRITE) { + SSL_shutdown(cctx->ssl_ctx->ssl); + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + static void appendSSLErrMessage(const MockHTTP *mh, long result) { apr_size_t startpos = strlen(mh->errmsg);