[ANN] SimpleHTTP initial release

T

Tim Becker

I just got through putting together a little wrapper around Net:Http
because I keep forgetting how to handle stuff like proxies, ssl, basic
auth and redirects with it. Thought it might be useful to others as
well. Enjoy,
-Tim Becker ([email protected])



SimpleHttp - a simplified wrapper around Net::Http

SimpleHttp aims to reduce the complexity of Net::Http while providing
the most commonly used (by me) http functionality.

FEATURES / USAGE

* No fuss one line GET and POST requests:

str = SimpleHttp.get "http://www.example.com"
str = SimpleHttp.get "www.example.com"

* Can use URI or String url interchangibly

str = SimpleHttp.get URI.parse "http://www.example.com/"

* Transparent Proxy Handling. Uses the 'http_proxy' environment
variable if set, also provides a set_proxy method.

http = SimpleHttp.new "http://www.example.com"
http.set_proxy "http://proxy.example.com:8000"
http.post "query" => "example_query"

* POST sends ruby Hashes as 'application/x-www-form/urlencoded'
per default, but can send any data.

http = SimpleHttp.new "http://www.example.com/image_upload"
http.post imageData, "img/png"

* Automatically handles SSL

str = SimpleHttp.get "https://secure.example.com"

* Easy HTTP Basic Authentication

str = SimpleHttp.get URI.parse("http://usr:[email protected]")
#or
http = SimpleHttp.new "http://www.example.com"
http.basic_authentication "user", "password"
http.post "query" => "example_query"

* Access headers of the request or response

http = SimpleHttp.new "www.example.com"
http.request_header["X-Custom-Header"]="useful header"

* Automatically follows Http Redirects.

The get and post methods return a String containing the body of the
request if the request was successful (HTTP 200). In case of a
redirect, the redirect is followed and the ultimate response is
returned. Per Default, up to three redirects are followed, this
behaviour can be modified by setting follow_num_redirects.

In case of any other type of response, an exception is raised.

The default behaviour can be modified by registering handlers using
the register_response_handler method. E.g. if you'd like to retrieve
the Date header instead of the body for successful transactions:

http = SimpleHttp.new ...
http.register_response_handler(Net::HTTPSuccess) {|req,res,http|
res['date']
}

Or you'd like to print the Location and then raise an exception in
case of a redirect:

http = SimpleHttp.new ...
http.register_response_handler(Net::HTTPRedirect) {|req,res,http|
puts res['location']
raise "REDIRECT not allowed!"
}


http://simplehttp.rubyforge.org/
http://rubyforge.org/projects/simplehttp/
gem install simplehttp
 
T

Tim Becker

Can't wait ti test this soon with our enterprise's Collaboration Server
(it's a joke I wont name names, I only call it names;).

Hmm, sounds like we might have been colleagues... :)
 
T

Trans

Very nice. I think it may be almost capable enough to serve in place
of HttpAccess2 usage in many cases (which is a rather large lib by
comparison). Have you considered cookie support at all?

T.
 
T

Tim Becker

Thanks everyone for your replies!

I've made a couple of changes and will release a new version soon to
reflect your feedback (most stuff is already in subversion) I'll
upload a new gem, etc, shortly.




Cookies are supported by way of request and response headers. You have
to handle the cookie data, realms and expiry yourself, though:

ht =3D SimpleHttp.new 'www.example.com'
ht.get
cookie =3D ht.response_headers['set-cookie']

It might be possible to do something like this:

SimpleSession {
ht =3D SimpleHttp.new 'www.example.com'
ht.get
page =3D SimpleHttp.get 'www.example.com/index2.html' **
}

** this call would have cookies automatically set to the values
returned in the first call. Not sure how that would work yet, but it
may be worth pursuing.



it's require "simple_http", right?

correct, I've updated the README accordingly.
2. how about auto completion

sounds like an interesting idea, but I'm not sure how to set up the
heuristics of autocompletion. When would you try alternatives? When
DNS lookup fails for `example.com`? If you can't connect to port 80?
On a 404? I've got a bit of auto completion already in the you can
leave out the 'http://" bit if you like :) Anyhow, it sounds like a
great feature, but I have no idea how I'd implement it, I'm very open
to input, though...



I do have problems with the proxy, without a proxy simple_http works just
fine.

Could you tell me what sort of problems you were having? I just tried
it here with a proxy and it worked fine.

May I suggest that you add setup.rb into the package (root of the tarball= )
http://i.loveruby.net/en/projects/setup/

I added it to the package. Guess you learn something new every day, I
had no idea setup.rb was it's own project!



Thanks again!
-tim
 
D

Devin Mullins

Tim said:
I just got through putting together a little wrapper around Net:Http
because I keep forgetting how to handle stuff like proxies, ssl, basic
auth and redirects with it. Thought it might be useful to others as
well. Enjoy,
-Tim Becker ([email protected])
Hey, cool! Interface suggestion:
1. SimpleHttp.get "blahblah", :proxy => 'feem'

2. SimpleHttp.set_proxy 'feem'
5.times { SimpleHttp.get "blahblah" }

Devin
 
T

Tim Becker

Hey, cool! Interface suggestion:
1. SimpleHttp.get "blahblah", :proxy => 'feem

The class `get` method already takes a hash which gets escaped and
added to the end of the url as GET parameters, so that won't work
out...

2. SimpleHttp.set_proxy 'feem'
5.times { SimpleHttp.get "blahblah" }

adding a class method to set the proxy is a great idea, might also add
something along those lines to add default headers such as cookies...

Thanks for the suggestions.
-tim
 
B

Blaine Cook

I just got through putting together a little wrapper around Net:Http
because I keep forgetting how to handle stuff like proxies, ssl, basic
auth and redirects with it. Thought it might be useful to others as
well. Enjoy,

Wonderful library! Fills nicely the gap between open-uri and
Net::HTTP. To follow on with others' calls for enhancement, do you
think you'll add file upload support? It's something that's relatively
difficult to do with the existing Ruby HTTP libraries, and would be a
very welcome addition.

Also, I noticed that you're using a separate webrick server to perform
the tests - you might consider using FakeWeb (http://
fakeweb.rubyforge.org/) to build some of the tests. It might be that
SimpleHTTP is sufficiently low-level that mocking the responses isn't
ideal, but it might help speed up the tests and test development.

b.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,020
Latest member
GenesisGai

Latest Threads

Top