http
http copied to clipboard
Refactor `HTTP::URI` to be more consistent.
Right now some of the methods are returning unexpected results:
HTTP::URI.new("https://example.com").join("/foo")
I expect the above to result in a HTTP::URI
instance, but it returns Addresable::URI
. That came as a surprise for me as I had some HTTP::URI
inherited class which started to act weirdly after I have upgraded http gem. :D
So far I am using following kludge (monkey-patch) in my code:
module HTTP
class URI
def join(uri)
self.class.new(@uri.join(uri))
end
def normalize
self.class.new(@uri.normalize)
end
def omit(*components)
self.class.new(@uri.omit(*components))
end
def freeze
@uri.freeze
hash
super
end
end
end
Notice that this kludge reveals one more problem wiht our HTTP::URI
:
HTTP::URI.new("https://example.com").freeze.hash
The above will fail without monkey-patching shown above.
Oof, yeah HTTP::URI
's goal was to encapsulate Addressable
so as to ensure it isn't part of the public API. I'll admit it was a bit of a rush/hack job and not particularly well thought out, and if it's leaking Addressable
in places that's definitely a bug.