2016-05-30 64 views
1

是否可以使用BIO_read(C++)從服務器獲取HTTP響應?使用BIO_read時的部分HTTP響應

當我嘗試使用BIO_read(bio, buffer, sizeof(buff))作爲http響應 - 在緩衝區中,我只獲得一些響應,而不是全部響應。

如果有可能顯示快滿了響應的示例,請

回答

2

是否有可能使用BIO_READ

是從服務器獲取的HTTP響應。


如果有可能顯示快滿了響應的示例,請

SSL/TLS Client在OpenSS維基:

#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進行了部分閱讀。您可以確定響應頭的響應長度。然後用安全閥添加第三個條件 - 預期響應長度。您需要一個安全閥來處理破損的Web服務器和錯誤的代理,這些代理會提供錯誤的響應時間。

如果您從HTTP請求中刪除Connection: close,那麼您將需要解析HTTP響應並獲得預期的長度。上面的代碼主要起作用,因爲服務器關閉了連接,並且作爲可用於完全接收響應的帶外信號。

+0

我可以用Cout而不是BIO_write打印服務器答案嗎? –