summaryrefslogtreecommitdiff
path: root/lib/feed2imap/httpfetcher.rb
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--lib/feed2imap/httpfetcher.rb41
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