From 8a5c956a2431ebcb51b51a0c22535137e123b518 Mon Sep 17 00:00:00 2001 From: Loic Nageleisen Date: Tue, 19 Sep 2017 15:46:02 +0200 Subject: [PATCH] Implement form-urlencoded support Query and form return a Hash, folding duplicates with last-key-wins strategy. *_array methods provide the seldom-used duplicate-preserving counterparts. Keep query and form separate, but provide params, which handles both, with form having precedence over query. --- lib/nanoserve.rb | 22 ++++++++++++++++++++- test/test_nanoserve.rb | 44 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) 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}/, '') + + + An Example Page + + + Hello World, this is a very simple HTML document. + + + EOS + end + + req = r.start([]) do + Net::HTTP.post_form( + uri + "test?uuid=#{uuid}&p=query", + 'p' => 'form', + 'f' => 'foo', + ) + end + + r.stop + + assert_equal(uuid, req.first.params['uuid']) + assert_equal(uuid, req.first.query['uuid']) + assert_nil(req.first.form['uuid']) + + assert_equal('foo', req.first.params['f']) + assert_nil(req.first.query['f']) + assert_equal('foo', req.first.form['f']) + + assert_equal('form', req.first.params['p']) + assert_equal('query', req.first.query['p']) + assert_equal('form', req.first.form['p']) + end end