2016-05-30 9 views
1

BIO_read(C++)を使用してサーバーからHTTP応答を取得できますか?BIO_readを使用した場合の部分的なHTTP応答

httpレスポンスにBIO_read(bio, buffer, sizeof(buff))を使用しようとしましたが、バッファではすべてがレスポンスの一部でしかありません。

それは完全な応答を取得する例も可能ショーである場合は、してください

答えて

2

はいBIO_read

を使用してサーバからのHTTPレスポンスを取得することが可能です。それは可能性のショーに完全な応答を得ることの一例である場合


、OpenSSのwikiにSSL/TLS Clientから

ください

#define HOST_NAME "www.random.org" 
#define HOST_PORT "443" 
#define HOST_RESOURCE "/cgi-bin/randbyte?nbytes=32&format=h" 
... 

BIO *web = NULL, *out = NULL; 
... 

BIO_puts(web, "GET " HOST_RESOURCE " HTTP/1.1\r\n" 
       "Host: " HOST_NAME "\r\n" 
       "Connection: close\r\n\r\n"); 
BIO_puts(out, "\n"); 
... 

int len = 0; 
do 
{ 
    char buff[1536] = {}; 
    len = BIO_read(web, buff, sizeof(buff)); 

    if(len > 0) 
    BIO_write(out, buff, len); 

} while (len > 0 || BIO_should_retry(web)); 

あなたは二つのことに気づくはずです。まず、戻り値BIO_readがチェックされます。次に、BIO_should_retryは、潜在的なレースのために読み込むデータがあるかどうかを検出するために使用されます。

a 完全な例。プロダクションで何が起こるべきかは、BIOで部分的に読むことです。応答ヘッダーから応答の長さを決定します。次に、予想される応答の長さである安全弁が付いた第3の条件を追加します。壊れたWebサーバーや、間違った応答時間を提供する壊れたプロキシには、安全弁が必要です。

HTTPリクエストからConnection: closeを削除した場合、HTTP応答を解析して予想される長さを取得する必要があります。上記のコードは、サーバーが接続を閉じ、レスポンスを完全に受信するために使用できる帯域外の信号として機能するため、ほとんど機能します。

+0

BIO_writeではなく、Coutでサーバーの回答を印刷できますか? –

関連する問題