Commit 4c78d620 authored by Joe Orton's avatar Joe Orton
Browse files

* modules/ssl/ssl_engine_io.c (ssl_io_input_getline): Document

  interface.
  (ssl_io_filter_input): For GETLINE mode, pull lines directly from
  the char_buffer if possible, to avoid unnecessarily copying the
  entire buffer once per invocation.


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@683283 13f79535-47bb-0310-9956-ffa450edef68
parent bd186512
Loading
Loading
Loading
Loading
+24 −3
Changes for modules/ssl/ssl_engine_io.c: 24 added lines, 3 removed lines.
Original line number Diff line number Diff line
@@ -714,6 +714,9 @@ static apr_status_t ssl_io_input_read(bio_filter_in_ctx_t *inctx,
    return inctx->rc;
}

/* Read a line of input from the SSL input layer into buffer BUF of
 * length *LEN; updating *len to reflect the length of the line
 * including the LF character. */
static apr_status_t ssl_io_input_getline(bio_filter_in_ctx_t *inctx,
                                         char *buf,
                                         apr_size_t *len)
@@ -1204,8 +1207,8 @@ static apr_status_t ssl_io_filter_input(ap_filter_t *f,
{
    apr_status_t status;
    bio_filter_in_ctx_t *inctx = f->ctx;

    apr_size_t len = sizeof(inctx->buffer);
    const char *start = inctx->buffer; /* start of block to return */
    apr_size_t len = sizeof(inctx->buffer); /* length of block to return */
    int is_init = (mode == AP_MODE_INIT);

    if (f->c->aborted) {
@@ -1257,8 +1260,26 @@ static apr_status_t ssl_io_filter_input(ap_filter_t *f,
        status = ssl_io_input_read(inctx, inctx->buffer, &len);
    }
    else if (inctx->mode == AP_MODE_GETLINE) {
        const char *pos;

        /* Satisfy the read directly out of the buffer if possible;
         * invoking ssl_io_input_getline will mean the entire buffer
         * is copied once (unnecessarily) for each GETLINE call. */
        if (inctx->cbuf.length 
            && (pos = memchr(inctx->cbuf.value, APR_ASCII_LF, 
                             inctx->cbuf.length)) != NULL) {
            start = inctx->cbuf.value;
            len = 1 + pos - start; /* +1 to include LF */
            /* Buffer contents now consumed. */
            inctx->cbuf.value += len;
            inctx->cbuf.length -= len;
            status = APR_SUCCESS;
        }
        else {
            /* Otherwise fall back to the hard way. */
            status = ssl_io_input_getline(inctx, inctx->buffer, &len);
        }
    }
    else {
        /* We have no idea what you are talking about, so return an error. */
        return APR_ENOTIMPL;
@@ -1271,7 +1292,7 @@ static apr_status_t ssl_io_filter_input(ap_filter_t *f,
    /* Create a transient bucket out of the decrypted data. */
    if (len > 0) {
        apr_bucket *bucket =
            apr_bucket_transient_create(inctx->buffer, len, f->c->bucket_alloc);
            apr_bucket_transient_create(start, len, f->c->bucket_alloc);
        APR_BRIGADE_INSERT_TAIL(bb, bucket);
    }