--On Tuesday, November 05, 2002 20:47:01 +0000 [EMAIL PROTECTED] wrote:

  Index: ssl_engine_io.c
  ===================================================================
  RCS file: /home/cvs/httpd-2.0/modules/ssl/ssl_engine_io.c,v
  retrieving revision 1.95
  retrieving revision 1.96
  diff -u -r1.95 -r1.96
  --- ssl_engine_io.c	5 Nov 2002 06:38:41 -0000	1.95
  +++ ssl_engine_io.c	5 Nov 2002 20:47:01 -0000	1.96
  @@ -73,15 +73,15 @@
    * remember what is in this file.  So, first, a quick overview.
    *
    * In this file, you will find:
  - * - ssl_io_filter_Input    (Apache input filter)
  - * - ssl_io_filter_Output   (Apache output filter)
  + * - ssl_io_filter_input    (Apache input filter)
  + * - ssl_io_filter_output   (Apache output filter)
Woo-hoo!

  @@ -129,7 +129,15 @@
    */

   typedef struct {
  -    SSLFilterRec *filter_ctx;
  +    SSL                *pssl;
  +    BIO                *pbioRead;
  +    BIO                *pbioWrite;
  +    ap_filter_t        *pInputFilter;
  +    ap_filter_t        *pOutputFilter;
  +} ssl_filter_ctx_t;
  +
  +typedef struct {
  +    ssl_filter_ctx_t *filter_ctx;
       conn_rec *c;
       apr_bucket_brigade *bb;
       apr_size_t length;
  @@ -138,7 +146,7 @@
       apr_status_t rc;
   } bio_filter_out_ctx_t;

  -static bio_filter_out_ctx_t *bio_filter_out_ctx_new(SSLFilterRec
*filter_ctx,   +static bio_filter_out_ctx_t
*bio_filter_out_ctx_new(ssl_filter_ctx_t *filter_ctx,
conn_rec *c)    {
       bio_filter_out_ctx_t *outctx = apr_palloc(c->pool,
sizeof(*outctx));   @@ -348,7 +356,7 @@
       char_buffer_t cbuf;
       apr_pool_t *pool;
       char buffer[AP_IOBUFSIZE];
  -    SSLFilterRec *filter_ctx;
  +    ssl_filter_ctx_t *filter_ctx;
   } bio_filter_in_ctx_t;

   /*
  @@ -887,6 +754,74 @@
       return APR_SUCCESS;
   }

  +
  +static apr_status_t ssl_filter_write(ap_filter_t *f,
  +                                     const char *data,
  +                                     apr_size_t len)
  +{
  +    ssl_filter_ctx_t *filter_ctx = f->ctx;
  +    bio_filter_out_ctx_t *outctx =
  +           (bio_filter_out_ctx_t *)(filter_ctx->pbioWrite->ptr);
  +    int res;
  +
  +    /* write SSL */
  +    if (filter_ctx->pssl == NULL) {
  +        return APR_EGENERAL;
  +    }
  +
  +    res = SSL_write(filter_ctx->pssl, (unsigned char *)data, len);
  +
  +    if (res < 0) {
  +        int ssl_err = SSL_get_error(filter_ctx->pssl, res);
  +
  +        if (ssl_err == SSL_ERROR_WANT_WRITE) {
  +            /*
  +             * If OpenSSL wants to write more, and we were nonblocking,
  +             * report as an EAGAIN.  Otherwise loop, pushing more
  +             * data at the network filter.
  +             *
  +             * (This is usually the case when the client forces an SSL
  +             * renegotation which is handled implicitly by OpenSSL.)
  +             */
  +            outctx->rc = APR_EAGAIN;
  +        }
  +        else if (ssl_err == SSL_ERROR_SYSCALL) {
  +            conn_rec *c =
(conn_rec*)SSL_get_app_data(outctx->filter_ctx->pssl);
  +    ap_log_error(APLOG_MARK, APLOG_ERR, outctx->rc, c->base_server,
  +    "SSL filter out error writing data");
Can't we get the conn_rec from outctx->filter_ctx->pOutputFilter->c rather than trying to be cute and calling SSL_get_app_data? This pattern seems to be happening a lot in this code and this seems like a better and much faster approach.

  +        }
  +        else /* if (ssl_err == SSL_ERROR_SSL) */ {
  +            /*
  +             * Log SSL errors
  +             */
  +            conn_rec *c = (conn_rec
*)SSL_get_app_data(filter_ctx->pssl);   +
ap_log_error(APLOG_MARK, APLOG_ERR, outctx->rc, c->base_server,   +
"SSL library out error writing data");
  +            ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, c->base_server);
  +
  +        }
  +        if (outctx->rc == APR_SUCCESS) {
  +            outctx->rc = APR_EGENERAL;
  +        }
  +    }
  +    else if ((apr_size_t)res != len) {
Just as a note that might want to enable partial write support in OpenSSL. Not sure, but it might perform better? So, we may want to remove the res != len check at some point. -- justin

Reply via email to