diff --git a/lib/nanoserve.rb b/lib/nanoserve.rb index 36b3dbc..d6573fa 100644 --- a/lib/nanoserve.rb +++ b/lib/nanoserve.rb @@ -106,8 +106,28 @@ module NanoServe @uri.path end + def query_array + URI.decode_www_form(@uri.query || '') + end + + def form_array + form? ? URI.decode_www_form(body) : [] + end + + def query + Hash[*query_array.flatten] + end + + def form + Hash[*form_array.flatten] + end + def params - Hash[*@uri.query.split('&').map { |kv| kv.split('=') }.flatten] + query.merge(form) + end + + def form? + content_type == 'application/x-www-form-urlencoded' end def body diff --git a/test/test_nanoserve.rb b/test/test_nanoserve.rb index 9bbded2..29dd919 100644 --- a/test/test_nanoserve.rb +++ b/test/test_nanoserve.rb @@ -29,7 +29,7 @@ class TestNanoServe < MiniTest::Test assert_equal(uuid, buf) end - def test_http_responder + def test_http_responder_get uuid = SecureRandom.uuid.encode('UTF-8') uri = URI('http://localhost:2000') @@ -56,4 +56,46 @@ class TestNanoServe < MiniTest::Test assert_equal(uuid, req.first.params['uuid']) end + + def test_http_responder_post + uuid = SecureRandom.uuid.encode('UTF-8') + uri = URI('http://localhost:2000') + + r = NanoServe::HTTPResponder.new(uri.host, uri.port) do |res, req, y| + y << req + + res.body = <<-EOS.gsub(/^ {8}/, '') + +
+