httr和TLS - 有时它可以工作,有时它不会

时间:2014-09-04 15:55:20

标签: r ssl httr

我已经使用httr将数据从REDCap数据库导出到R中几个月了。我们最近将R Studio服务器升级到最新版本(v0.98.1049)并同时升级到R 3.1.1。升级后,我的httr::POST调用有时会停止工作。我一直得到的错误是

Error in function (type, msg, asError = TRUE)  : 
GnuTLS recv error (-9): A TLS packet with unexpected length was received.

起初我认为这可能是一个SSL问题,但错误只发生在某些数据库中,在这些数据库中,我仍然可以使用RCurl下载数据。也就是说,此代码将起作用

RCurl::postForm(uri=[URL],
                .params=list(token=[TOKEN],
                             content='record',
                             format='csv'))

但是这段代码不会

httr::POST(url=[URL],
           body=list(token=[TOKEN],
                     content='record',
                     format='csv'))

进一步引起我的困惑,即使我无法在发生此错误的项目中导出数据,我也可以导入数据。

我没有关于从哪里开始的想法。我很欣赏这里可能出现问题的任何想法。

(我想提供一个可重现的例子,但我担心我会使用医疗保健数据。抱歉)

根据要求,这里是verbose()输出。这是一个稍微不同的调用,但会产生相同的错误。 (我使用的呼叫不会暴露机密信息)

  > httr::POST(url=whi$url,  
  +            body=list(token=whi$token,  
  +                      content='metadata',  
  +                      format='csv'),   
  +            httr::verbose(data_in=TRUE, info=TRUE))  
  *  Hostname was found in DNS cache  
  *  Hostname in DNS cache was stale, zapped  
  *      Trying 172.26.30.4...  
  *  Connected to [URL] (172.26.30.4) port 443 (#7)  
  *  found 153 certificates in /home/nutterb/R/x86_64-unknown-linux-gnu-library/3.1/httr/cacert.pem  
  *  SSL re-using session ID  
  *      server certificate verification OK  
  *      common name: [URL] (matched)  
  *      server certificate expiration date OK  
  *      server certificate activation date OK  
  *      certificate public key: RSA  
  *      certificate version: #3  
  *      subject: OU=Domain Control Validated,CN=[URL]  
  *      start date: Thu, 10 Apr 2014 17:06:17 GMT  
  *    
  *      expire date: Sat, 21 Mar 2015 16:35:07 GMT  
  *    
  *      issuer: C=US,ST=Arizona,L=Scottsdale,O=Starfield Technologies\, Inc.,OU=http://certs.starfieldtech.com/repository/,CN=Starfield Secure Certificate Authority - G2  
  *      compression: NULL  
  *      cipher: AES-128-CBC  
  *      MAC: SHA1  
  -> POST /redcap/api/ HTTP/1.1  
  -> User-Agent: curl/7.35.0 Rcurl/1.95.4.1 httr/0.5.0.9000  
  -> Host: [URL]  
  -> Accept-Encoding: gzip  
  -> accept: application/json, text/xml, */*  
  -> Content-Length: 374  
  -> Expect: 100-continue  
  -> Content-Type: multipart/form-data; boundary=------------------------05c968969cc362a9  
  ->   
  <- HTTP/1.1 100 Continue  
  >> --------------------------05c968969cc362a9  
  >> Content-Disposition: form-data; name="token"  
  >>   
  >> [TOKEN]  
  >> --------------------------05c968969cc362a9  
  >> Content-Disposition: form-data; name="content"  
  >>   
  >> metadata  
  >> --------------------------05c968969cc362a9  
  >> Content-Disposition: form-data; name="format"  
  >>   
  >> csv  
  >> --------------------------05c968969cc362a9--  
  <- HTTP/1.1 200 OK  
  <- Date: Sat, 06 Sep 2014 09:55:43 GMT  
  <- Expires: 0  
  <- cache-control: no-store, no-cache, must-revalidate  
  <- Pragma: no-cache  
  <- Access-Control-Allow-Origin: *  
  <- Vary: Accept-Encoding  
  <- Content-Type: text/html; charset=utf-8  
  <- Connection: close  
  <- Content-Encoding: gzip  
  <-   
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  <<  NA  
  *  GnuTLS recv error (-9): A TLS packet with unexpected length was received.  
  *  Closing connection 7  
  Error in function (type, msg, asError = TRUE)  :   
    GnuTLS recv error (-9): A TLS packet with unexpected length was received.  
  In addition: There were 11 warnings (use warnings() to see them)  
  > warnings()  
  Warning messages:  
  1: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  2: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  3: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  4: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  5: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  6: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  7: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  8: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  9: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  10: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  11: In strsplit(x, "\n", fixed = TRUE) : input string 1 is invalid in this locale  
  > 

0 个答案:

没有答案