ruby error-handling open-uri

ruby - ¿Cómo puedo manejar los errores 503 con open-uri?



error-handling (1)

Si un sitio web devuelve un error ''503 servicio no disponible'', open-uri lanza una excepción. Por ejemplo:

require ''open-uri'' open(''http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8'') # OpenURI::HTTPError: 503 Service Unavailable # ...

Sin embargo, si luego lo visita en un navegador web, en realidad muestra una página con un CAPTCHA y no un error.

¿Cómo puedo asegurarme de que open-uri no solo lance esto como una excepción sino que realmente maneje la respuesta y me proporcione el contenido de la página?


OpenURI::HTTPError tiene un atributo io que puede inspeccionar para obtener lo que desea. io es un objeto StringIO con varios métodos singleton definidos en él ( status por ejemplo):

require ''open-uri'' begin open(''http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8'') rescue OpenURI::HTTPError => error response = error.io response.status # => ["503", "Service Unavailable"] response.string # => <!DOCTYPE html PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">/n<html DIR=/"LTR/">/n<head><meta http-equiv=/"content-type/" content=/"text/html; charset=utf-8/"><meta name=/"viewport/" content=/"initial-scale=1/">... end

Sin embargo, para esta tarea, el módulo Net::HTTP es probablemente una mejor alternativa:

require ''net/http'' response = Net::HTTP.get_response(URI.parse(''http://www.google.co.uk/sorry/?continue=http://www.google.co.uk/search%3Fq%3Dhello%26oq%3Dhello%26ie%3DUTF-8'')) response.code # => "503" response.body # => "<!DOCTYPE html PUBLIC /"-//W3C//DTD HTML 4.01 Transitional//EN/">/n<html DIR=/"LTR/">/n<head><meta http-equiv=/"content-type/" content=/"text/html; ...