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' => '/',
next prev 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).