05c4bf3374
Example of absolute path to local file. ```html:/home``` Example of relative path to local file. ```html:home``` 1.8.7 string fix. 's'[0..0] instead of 's'[0] Fix regex. Add absolute and relative tests.
48 lines
1.4 KiB
Ruby
48 lines
1.4 KiB
Ruby
require 'net/http'
|
|
require 'net/https' # ruby 1.8.7 fix, remove at upgrade
|
|
require 'uri'
|
|
require 'open-uri'
|
|
|
|
module Gollum
|
|
class Gitcode
|
|
def initialize path
|
|
raise(ArgumentError, 'path is nil or empty') if path.nil? or path.empty?
|
|
|
|
@uri = URI::HTTP.build({
|
|
:path => self.unchomp(path),
|
|
:host => 'raw.github.com',
|
|
:scheme => 'https',
|
|
:port => 443 })
|
|
end
|
|
|
|
def contents
|
|
@contents ||= self.req @uri
|
|
end
|
|
|
|
def unchomp p
|
|
return p if p.nil?
|
|
p[0] == '/' ? p : ('/' + p)
|
|
end
|
|
|
|
def req uri, cut = 1
|
|
return "Too many redirects or retries" if cut >= 10
|
|
http = Net::HTTP.new uri.host, uri.port
|
|
http.use_ssl = true
|
|
resp = http.get uri.path, {
|
|
'Accept' => 'text/plain',
|
|
'Cache-Control' => 'no-cache',
|
|
'Connection' => 'keep-alive',
|
|
'Host' => uri.host,
|
|
'User-Agent' => 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0'
|
|
}
|
|
code = resp.code.to_i
|
|
return resp.body if code == 200
|
|
return "Not Found" if code == 404
|
|
return "Unhandled Response Code #{code}" unless code == 304 or not resp.header['location'].nil?
|
|
loc = URI.parse resp.header['location']
|
|
uri2 = loc.relative?() ? (uri + loc) : loc # overloads (+)
|
|
return req uri2, (cut + 1)
|
|
end
|
|
end
|
|
end
|