kcar RubyGem user+dev discussion/patches/pulls/bugs/help
 help / color / mirror / code / Atom feed
From: Eric Wong <e@80x24.org>
To: kcar-public@bogomips.org
Subject: [PATCH 08/11] do not assume SERVER_PORT
Date: Sat,  1 Dec 2018 13:31:22 +0000	[thread overview]
Message-ID: <20181201133125.5524-9-e@80x24.org> (raw)
In-Reply-To: <20181201133125.5524-1-e@80x24.org>

Without X-Forwarded-{Proto,Ssl} or Forwarded header parsing,
it is impossible for us to know to know which default port
was specified for non-absolute-URI requests.

We will only set SERVER_PORT for the rare absolute-URI requests
and when we can parse the Host header.
---
 ext/kcar/kcar.rl            |  5 +++--
 test/test_request_parser.rb | 11 +++++------
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/ext/kcar/kcar.rl b/ext/kcar/kcar.rl
index 6330910..e1445aa 100644
--- a/ext/kcar/kcar.rl
+++ b/ext/kcar/kcar.rl
@@ -160,7 +160,7 @@ static void set_server_vars(struct http_parser *hp, VALUE env, VALUE host)
   long host_len = RSTRING_LEN(host);
   char *colon;
   VALUE server_name = host;
-  VALUE server_port = hp->is_https ? g_443 : g_80;
+  VALUE server_port = hp->has_scheme ? (hp->is_https ? g_443 : g_80) : Qfalse;
 
   if (*host_ptr == '[') { /* ipv6 address format */
     char *rbracket = memchr(host_ptr + 1, ']', host_len - 1);
@@ -185,7 +185,8 @@ static void set_server_vars(struct http_parser *hp, VALUE env, VALUE host)
     }
   }
   rb_hash_aset(env, g_SERVER_NAME, server_name);
-  rb_hash_aset(env, g_SERVER_PORT, server_port);
+  if (server_port != Qfalse)
+    rb_hash_aset(env, g_SERVER_PORT, server_port);
 }
 
 static void http_09_request(VALUE env)
diff --git a/test/test_request_parser.rb b/test/test_request_parser.rb
index 7654e62..c4fefc8 100644
--- a/test/test_request_parser.rb
+++ b/test/test_request_parser.rb
@@ -96,7 +96,7 @@ class TestRequestParser < Test::Unit::TestCase
     buf = "GET / HTTP/1.1\r\nHost: foo\r\n\r\n"
     assert_same @env, @hp.request(@env, buf)
     assert_equal 'foo', @env['SERVER_NAME']
-    assert_equal '80', @env['SERVER_PORT']
+    assert_nil @env['SERVER_PORT']
     assert_equal '', buf
     assert @hp.keepalive?
   end
@@ -113,14 +113,14 @@ class TestRequestParser < Test::Unit::TestCase
   def test_parse_server_host_empty_port
     @hp.request(@env, "GET / HTTP/1.1\r\nHost: foo:\r\n\r\n")
     assert_equal 'foo', @env['SERVER_NAME']
-    assert_equal '80', @env['SERVER_PORT']
+    assert_nil @env['SERVER_PORT']
     assert @hp.keepalive?
   end
 
   def test_parse_host_cont
     @hp.request(@env, "GET / HTTP/1.1\r\nHost:\r\n foo\r\n\r\n")
     assert_equal 'foo', @env['SERVER_NAME']
-    assert_equal '80', @env['SERVER_PORT']
+    assert_nil @env['SERVER_PORT']
     assert @hp.keepalive?
   end
 
@@ -541,7 +541,7 @@ class TestRequestParser < Test::Unit::TestCase
     req = @hp.request(@env, buf)
     assert_equal "[::1]", req['HTTP_HOST']
     assert_equal "[::1]", req['SERVER_NAME']
-    assert_equal '80', req['SERVER_PORT']
+    assert_nil req['SERVER_PORT']
   end
 
   def test_ipv6_host_header_with_port
@@ -555,7 +555,7 @@ class TestRequestParser < Test::Unit::TestCase
   def test_ipv6_host_header_with_empty_port
     req = @hp.request(@env, "GET / HTTP/1.1\r\nHost: [::1]:\r\n\r\n")
     assert_equal "[::1]", req['SERVER_NAME']
-    assert_equal '80', req['SERVER_PORT']
+    assert_nil req['SERVER_PORT']
     assert_equal "[::1]:", req['HTTP_HOST']
   end
 
@@ -836,7 +836,6 @@ class TestRequestParser < Test::Unit::TestCase
     expect = {
       'HTTP_HOST' => 'example.com',
       'SERVER_NAME' => 'example.com',
-      'SERVER_PORT' => '80',
       'REQUEST_PATH' => '/',
       'SERVER_PROTOCOL' => 'HTTP/1.1',
       'PATH_INFO' => '/',

  parent reply	other threads:[~2018-12-01 13:31 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-12-01 13:31 [PATCH v2] request parsing bits Eric Wong
2018-12-01 13:31 ` [PATCH 01/11] introduce new str_new_dd_freeze internal function Eric Wong
2018-12-01 13:31 ` [PATCH 02/11] begin implementing request parsing Eric Wong
2018-12-01 13:31 ` [PATCH 03/11] favor bitfields instead flags + macros Eric Wong
2018-12-01 13:31 ` [PATCH 04/11] implement request parsing with tests Eric Wong
2018-12-01 13:31 ` [PATCH 05/11] pkg.mk: enable warnings by default for tests Eric Wong
2018-12-01 13:31 ` [PATCH 06/11] filter_body: rename variables to be like memcpy(3) Eric Wong
2018-12-01 13:31 ` [PATCH 07/11] flesh out filter_body for request parsing Eric Wong
2018-12-01 13:31 ` Eric Wong [this message]
2018-12-01 13:31 ` [PATCH 09/11] do not set "HTTP/0.9" for pre-1.0 requests Eric Wong
2018-12-01 13:31 ` [PATCH 10/11] always set non-negative Content-Length for requests Eric Wong
2018-12-01 13:31 ` [PATCH 11/11] avoid String#-@ call on request parsing under Ruby 2.6 Eric Wong

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://yhbt.net/kcar/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181201133125.5524-9-e@80x24.org \
    --to=e@80x24.org \
    --cc=kcar-public@bogomips.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhbt.net/kcar.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).