Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby/Rails 3.1: Given a URL string, remove path

Given any valid HTTP/HTTPS string, I would like to parse/transform it such that the end result is exactly the root of the string.

So given URLs:

http://foo.example.com:8080/whatsit/foo.bar?x=y
https://example.net/

I would like the results:

http://foo.example.com:8080/
https://example.net/

I found the documentation for URI::Parser not super approachable.

My initial, naïve solution would be a simple regex like:

/\A(https?:\/\/[^\/]+\/)/

(That is: Match up to the first slash after the protocol.)

Thoughts & solutions welcome. And apologies if this is a duplicate, but my search results weren't relevant.

like image 555
Alan H. Avatar asked Jul 20 '11 01:07

Alan H.


Video Answer


2 Answers

With URI::join:

require 'uri'
url = "http://foo.example.com:8080/whatsit/foo.bar?x=y"
baseurl = URI.join(url, "/").to_s
#=> "http://foo.example.com:8080/"
like image 68
tokland Avatar answered Nov 15 '22 18:11

tokland


Use URI.parse and then set the path to an empty string and the query to nil:

require 'uri'
uri     = URI.parse('http://foo.example.com:8080/whatsit/foo.bar?x=y')
uri.path  = ''
uri.query = nil
cleaned   = uri.to_s # http://foo.example.com:8080

Now you have your cleaned up version in cleaned. Taking out what you don't want is sometimes easier than only grabbing what you need.

If you only do uri.query = '' you'll end up with http://foo.example.com:8080? which probably isn't what you want.

like image 24
mu is too short Avatar answered Nov 15 '22 18:11

mu is too short