diff --git a/lib/nanoserve.rb b/lib/nanoserve.rb index 0b761eb..d6573fa 100644 --- a/lib/nanoserve.rb +++ b/lib/nanoserve.rb @@ -98,8 +98,44 @@ module NanoServe @body = +''.encode('ASCII-8BIT') end + def host + @headers['host'] + end + + def path + @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 + @body + end + + def [](key) + @headers[key.downcase] end def <<(line) @@ -124,6 +160,10 @@ module NanoServe @headers.key?('content-length') end + def content_type + @headers['content-type'] + end + private REQ_RE = %r{(?[A-Z]+)\s+(?\S+)\s+(?HTTP/\d+.\d+)$} @@ -139,7 +179,7 @@ module NanoServe end def parse_method(str) - str + str.upcase end def parse_path(str) diff --git a/nanoserve.gemspec b/nanoserve.gemspec index 04d67f1..81c28a2 100644 --- a/nanoserve.gemspec +++ b/nanoserve.gemspec @@ -2,7 +2,7 @@ Gem::Specification.new do |s| s.name = 'nanoserve' - s.version = '0.2.0' + s.version = '0.3.0' s.licenses = ['3BSD'] s.summary = 'Listen to one-shot connections' s.authors = ['Loic Nageleisen'] 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