textからhrefを見つける方法
- httpとhttpsを含むurlを取得
text.scan(URI.regexp(['http', 'https'])) do
p URI.parse($&).to_s
end
UserAgentをつける方法
uri = URI.parse(url)
res = Net::HTTP.start(uri.host, uri.port) do |http|
http.get(uri.path, {'User-Agent' => UrlConcern::USER_AGENT})
end
イレギュラーなURIのパースについて
-
http:/
をopenするとTypeErrorが起きる
URI.parse("http:/").open
-> TypeError: no implicit conversion of nil into String
-
http:
やhttp://
だとInvalidURIErrorが起きる
URI.parse("http:").open
-> URI::InvalidURIError: bad URI(absolute but no path)
URI.parse("http://").open
-> URI::InvalidURIError: bad URI(absolute but no path)
- 存在しないパスの場合
URI.parse("http://example.com").open
-> SocketError: getaddrinfo: nodename nor servname provided, or not known
httpからhttpsにredirectする際のエラー
- httpからhttpsへのredirectは禁止されている
- open_uri_redirectionsを利用すると、セキュアでなくなるが、redirectができるようになる
- https://github.com/jaimeiniesta/open_uri_redirections
- http://stackoverflow.com/questions/10013293/open-uri-is-not-redirecing-http-to-https
- https://bugs.ruby-lang.org/issues/859
- https://gist.github.com/zaius/1271420
RuntimeError: redirection forbidden: http://**** -> https://****
httpsのデータを取得するとき
- use_sslのオプションをつける必要がある
- http://stackoverflow.com/questions/5244887/eoferror-end-of-file-reached-issue-with-nethttp
uri = URI.parse(url)
res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
http.get(uri.path)
end
uriがparseできるかどうか
if url =~ URI::regexp
# Correct URL
end