Set up a BIO socket and use the BIO_gets() function.  Below is a modified
example that I got from Eric Rescorla to solve this problem.

#define BUFSIZE 1024
BIO *bio_err;

int Http_Read(void)
{
    BIO *io;
    BIO *sbio;
    BIO *ssl_bio;
    SSL *ssl;
    SSL_CTX *ctx;

    int i;
    int c;
    int r;
    int Socket;
    char buffer[BUFSIZE];
    char *tok;

    /* Setup you Socket */
    /* Initialize SSL context */

    sbio = BIO_new_socket(Socket,BIO_NO_CLOSE);
    ssl = SSL_new(ctx);
    SSL_set_bio(ssl,sbio,sbio);

    io = BIO_new(BIO_f_buffer());
    ssl_bio = BIO_new(BIO_f_ssl());
    BIO_set_ssl(ssl_bio,ssl,BIO_CLOSE);
    BIO_push(io,ssl_bio);

    c = i?-1:0;

    while(1)
    {
        r = BIO_gets(io,buf,BUFSIZE-1);
        switch(SSL_get_error(ssl,r))
        {
            case SSL_ERROR_NONE:
                break;
            case SSL_ERROR_ZERO_RETURN:
                return(-1);
            default:
                berr_exit("SSL read problem");
        }

        // Look for the blank line that signals
        // the end of the HTTP headers
        if(!strcmp(buf,"\r\n") || !strcmp(buf,"\n"))
            break;

        if(!(tok = strtok(buf,": ")))
            err_exit("Parse error");

        if(!stricmp(tok,"Content-Length"))
        {
            tok = strtok(0,": ");
            c = atoi(tok);
        }

        if(c == -1)
            err_exit("Server HTTP message without content-length");

        while(c)
        {
            int tr = c > BUFSIZE?BUFSIZE:c;

            r = BIO_read(io,buf,tr);
            buf[r] = '\0';

            switch(SSL_get_error(ssl,r))
            {
                case SSL_ERROR_NONE:
                    c -= tr;
                    break;
                default:
                    berr_exit("SSL read problem");
            }
        }

        if((r = BIO_flush(io)) < 0)
            err_exit("Error flushing BIO");

        SSL_set_shutdown(ssl,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);

        if(io != NULL)
        {
            BIO_free_all(io);
        }
}


int berr_exit(char *string)
{
    BIO_printf(bio_err,"%s\n",string);
    ERR_print_errors(bio_err);
    return(0);
}

int err_exit(char *string)
{
    fprintf(stderr,"%s\n",string);
    return(0);
}
----- Original Message -----
From: "Asad Ali" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Friday, November 01, 2002 4:19 PM
Subject: SSL_read() fails for IE 6.0 ?


>
> Hi,
>
> I am new to OpenSSL and am running into a strange behavior
> in my web server application. The web server uses OpenSSL library
> from 0.9.6g distribution. When the web server is accessed via
> Netscape 4.76 browser, it works fine. However, the same URL
> fails when using IE 6.0.26. The problem happens because the
> first call to SSL_read(), after handshake, returns zero bytes.
> I am, therefore, unable to read the GET message from IE.
>
> Have anyone seen this kind of behavior before. I am using
> Cygwin on Windows 2000 system.
>
> thanks,
> --- asad
> ______________________________________________________________________
> OpenSSL Project                                 http://www.openssl.org
> User Support Mailing List                    [EMAIL PROTECTED]
> Automated List Manager                           [EMAIL PROTECTED]

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
User Support Mailing List                    [EMAIL PROTECTED]
Automated List Manager                           [EMAIL PROTECTED]

Reply via email to