Recology

R/etc.

Dealing with multi handle errors

    R API http httr
 Source: .Rmd/.md

At rOpenSci we occasssionally hear from our users that they run into an error like:

Error in function (type, msg, asError = TRUE)  : 
  easy handled already used in multi handle

This error occurs in the httr package that we use to do http requests to sources of data on the web. It happens when e.g., you make a lot of requests to a resource, then it gets interrupted somehow - then you make another call, and you get the error above. Let’s try it with the an version of httr (v0.5):

library("httr")
# run, then esc to cause multi handle error
replicate(50, GET("http://google.com/"))
# then retry single call, which trows multi handle error
GET("http://google.com/")
#> Error in function (type, msg, asError = TRUE)  : 
#>   easy handled already used in multi handle

There are any number of reasons why your session may get interrupted, including an internet outage, the web service you are requesesting data from times out, etc. There hasn’t been a straight-forward way to handle this, until recently.

In httr version 0.6, there are two new functions handle_find() and handle_reset() to help deal with this error.

First, install newest httr from Github

install.packages("devtools")
devtools::install_github("hadley/httr")
library("httr")

Make a bunch of requests to google, interrupting part way through

replicate(50, HEAD("http://google.com/"))

Then retry single call, which trows multi handle error

HEAD("http://google.com/")
#> Error in function (type, msg, asError = TRUE)  : 
#>   easy handled already used in multi handle

Find handle

handle_find("http://google.com/")
#> Host: http://google.com/ <0x10f3d1600>

Reset handle

handle_reset("http://google.com/")

Try call again, this time it should work

HEAD("http://google.com/")
#> Response [http://www.google.com/]
#>   Date: 2014-12-08 13:37
#>   Status: 200
#>   Content-Type: text/html; charset=ISO-8859-1
#> <EMPTY BODY>

Usage in ropensci packages

We have more work to do yet to integrate this into our packages. It’s great you can reset a handle as above, but to reset the handle you need to search for the URL used in the request, which our users would have to dig into the code for the function they are using. That is easy-ish to do, but perhaps not everyone knows they can get to the code easily. So, we may try seting a parameter in functions that would let reset the handle to clear this error.

Note

Note that Hadley is planning on eliminating RCurl dependency (https://github.com/hadley/httr/issues/172), so there may be a different solution in the future.

comments powered by Disqus