diff options
Diffstat (limited to '')
-rw-r--r-- | lib/feed2imap/httpfetcher.rb | 41 |
1 files changed, 17 insertions, 24 deletions
diff --git a/lib/feed2imap/httpfetcher.rb b/lib/feed2imap/httpfetcher.rb index 6c72bf3..6041845 100644 --- a/lib/feed2imap/httpfetcher.rb +++ b/lib/feed2imap/httpfetcher.rb @@ -17,32 +17,34 @@ along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA =end +require 'feed2imap' require 'net/http' # get openssl if available begin - require 'openssl' + require 'net/https' rescue end require 'uri' -# Class used to retrieve the feed over HTTP -# TODO non standard port, authentification -# TODO don't use If-Mod-Since if = 0 - if defined?(F2I_VERSION) USERAGENT = 'Feed2Imap v#{F2I_VERSION} http://home.gna.org/feed2imap/' else USERAGENT = 'Feed2Imap http://home.gna.org/feed2imap/' end +# max number of redirections +MAXREDIR = 5 + +# Class used to retrieve the feed over HTTP class HTTPFetcher def HTTPFetcher::fetcher(baseuri, uri, lastcheck, recursion) - if uri.scheme == 'http' - http = Net::HTTP::new(uri.host, uri.port) + http = Net::HTTP::new(uri.host, uri.port) + http.use_ssl = true if uri.scheme == 'https' + if lastcheck == Time::at(0) + req = Net::HTTP::Get::new(uri.request_uri, {'User-Agent' => USERAGENT }) else - http = Net::HTTPS::new(uri.host, uri.port) + req = Net::HTTP::Get::new(uri.request_uri, {'User-Agent' => USERAGENT, 'If-Modified-Since' => lastcheck.httpdate}) end - req = Net::HTTP::Get::new(uri.request_uri, {'User-Agent' => USERAGENT, 'If-Modified-Since' => lastcheck.httpdate}) if uri.userinfo login, pw = uri.userinfo.split(':') req.basic_auth(login, pw) @@ -54,7 +56,7 @@ class HTTPFetcher begin response = http.request(req) rescue Timeout::Error - raise "Timeout while fetching #{uri.to_s}" + raise "Timeout while fetching #{baseuri.to_s}" end case response when Net::HTTPSuccess @@ -65,25 +67,16 @@ class HTTPFetcher if recursion > 0 redir = URI::join(uri.to_s, response['location']) return fetcher(baseuri, redir, lastcheck, recursion - 1) + else + raise "Too many redirections while fetching #{baseuri.to_s}" end + else + raise "#{response.code}: #{response.message} while fetching #{baseuri.to_s}" end - # or raise en exception - response.error! end def HTTPFetcher::fetch(url, lastcheck) uri = URI::parse(url) - return HTTPFetcher::fetcher(uri, uri, lastcheck, 5) - http = Net::HTTP::new(uri.host) - response = http.get(uri.path, {'User-Agent' => USERAGENT, 'If-Modified-Since' => lastcheck.httpdate}) - if response.class == Net::HTTPOK - return response.body - elsif response.class == Net::HTTPNotModified - return nil - elsif response.class == Net::HTTPNotFound - raise "Page not found (404)" - else - raise "Unknown response #{response.class}" - end + return HTTPFetcher::fetcher(uri, uri, lastcheck, MAXREDIR) end end |