* [ANN] yahns 1.14.1 -_- sleepy app server for Ruby
@ 2016-12-14 19:23 6% ` Eric Wong
0 siblings, 0 replies; 3+ results
From: Eric Wong @ 2016-12-14 19:23 UTC (permalink / raw)
To: ruby-talk; +Cc: yahns-public
A Free Software, multi-threaded, non-blocking network
application server designed for low _idle_ power consumption.
It is primarily optimized for applications with occasional users
which see little or no traffic. yahns currently hosts Rack/HTTP
applications, but may eventually support other application
types. Unlike some existing servers, yahns is extremely
sensitive to fatal bugs in the applications it hosts.
* git clone git://yhbt.net/yahns
* https://yhbt.net/yahns/README
* https://yhbt.net/yahns/NEWS.atom.xml (supported by most "RSS" readers)
* we only accept plain-text email yahns-public@yhbt.net
* and archive all the mail we receive: https://yhbt.net/yahns-public/
* nntp://news.public-inbox.org/inbox.comp.lang.ruby.yahns
lrg nabgure ubeevoyl-anzrq freire :>
Changes:
yahns 1.14.1 - bugfixes only
This release avoids confusing HTTP/1.1 clients with a
"Transfer-Encoding: chunked" header on bodyless responses.
The header was causing "curl -T" to wait indefinitely for
a response body after the server sent a 204.
This regression was introduced with autochunk introduced
with yahns 1.13(*).
rack.hijack was also broken for ancient "HTTP/0.9" requests,
and now fixed.
4 changes since 1.14.0:
queue_*: fix outdated comments
http_response: support rack.hijack on HTTP/0.9 responses
response: do not set chunked header on bodyless responses
proxy_pass: do not chunk on bodyless upstream responses
(*) https://yhbt.net/yahns-public/20160805-yahns-1.13.0-released@lucky13/
Please note the disclaimer:
yahns is extremely sensitive to fatal bugs in the apps it hosts. There
is no (and never will be) any built-in "watchdog"-type feature to kill
stuck processes/threads. Each yahns process may be handling thousands
of clients; unexpectedly killing the process will abort _all_ of those
connections. Lives may be lost!
yahns hackers are not responsible for your application/library bugs.
Use an application server which is tolerant of buggy applications
if you cannot be bothered to fix all your fatal bugs.
--
EW
^ permalink raw reply [relevance 6%]
* [PATCH 2/2] proxy_pass: do not chunk on bodyless upstream responses
2016-12-14 6:59 6% [PATCH 0/2] revenge of the body-less responses Eric Wong
@ 2016-12-14 6:59 7% ` Eric Wong
0 siblings, 0 replies; 3+ results
From: Eric Wong @ 2016-12-14 6:59 UTC (permalink / raw)
To: yahns-public
As with the previous commit
("response: do not set chunked header on bodyless responses"),
blindly setting "Transfer-Encoding: chunked" is wrong and
confuses "curl -T" on 204 responses, at least.
---
lib/yahns/proxy_http_response.rb | 2 +-
test/test_proxy_pass.rb | 33 +++++++++++++++++++++++++++++++++
2 files changed, 34 insertions(+), 1 deletion(-)
diff --git a/lib/yahns/proxy_http_response.rb b/lib/yahns/proxy_http_response.rb
index 74f5ce5..1776291 100644
--- a/lib/yahns/proxy_http_response.rb
+++ b/lib/yahns/proxy_http_response.rb
@@ -120,7 +120,7 @@ def proxy_res_headers(res, req_res)
# chunk the response ourselves if the client supports it,
# but the backend does not terminate properly
- if alive && ! term
+ if alive && ! term && have_body
if env['HTTP_VERSION'] == 'HTTP/1.1'.freeze
res << "Transfer-Encoding: chunked\r\n".freeze
else # we can't persist HTTP/1.0 and HTTP/0.9 w/o Content-Length
diff --git a/test/test_proxy_pass.rb b/test/test_proxy_pass.rb
index 4c4b53a..22f1802 100644
--- a/test/test_proxy_pass.rb
+++ b/test/test_proxy_pass.rb
@@ -154,6 +154,9 @@ def chunky.each
env['rack.hijack'].call.close
# should not be seen:
[ 123, [ %w(Content-Type text/html), %w(Content-Length 0) ], [] ]
+ when '/204'
+ buf = env['rack.input'].read # drain
+ [ 204, {}, [] ]
else
buf = env['rack.input'].read
[ 201, {
@@ -271,6 +274,7 @@ def test_proxy_pass
end
end
+ check_204_on_put(host, port)
check_forbidden_put(host, port)
check_eof_body(host, port)
check_pipelining(host, port)
@@ -639,4 +643,33 @@ def check_forbidden_put(host, port)
ensure
to_close.each(&:close)
end
+
+ def check_204_on_put(host, port)
+ s = TCPSocket.new(host, port)
+ s.write("PUT /204 HTTP/1.1\r\nHost: example.com\r\n" \
+ "Content-Length: 11\r\n" \
+ "Content-Type: application/octet-stream\r\n" \
+ "\r\nhello worldPUT")
+ buf = s.readpartial(1024)
+ assert_match %r{\AHTTP/1\.1 204}, buf
+ assert_match %r{\r\n\r\n\z}, buf
+ refute_match %r{^Transfer-Encoding}i, buf
+ refute_match %r{^Content-Length}i, buf
+ assert_match %r{^Connection: keep-alive\r\n}, buf
+ assert_nil IO.select([s], nil, nil, 1), 'connection persists..'
+
+ # make sure another on the same connection works
+ s.write(" / HTTP/1.1\r\nHost: example.com\r\n" \
+ "Content-Length: 11\r\n" \
+ "Content-Type: application/octet-stream\r\n" \
+ "\r\nhello world")
+ buf = s.readpartial(1024)
+ assert_match %r{\r\n\r\nhello world\z}, buf
+ assert_match %r{\AHTTP/1\.1 201}, buf
+ assert_match(%r{^Content-Length: 11\r\n}, buf)
+ assert_match %r{^Connection: keep-alive\r\n}, buf
+ assert_nil IO.select([s], nil, nil, 1), 'connection persists..'
+ ensure
+ s.close if s
+ end
end
--
EW
^ permalink raw reply related [relevance 7%]
* [PATCH 0/2] revenge of the body-less responses
@ 2016-12-14 6:59 6% Eric Wong
2016-12-14 6:59 7% ` [PATCH 2/2] proxy_pass: do not chunk on bodyless upstream responses Eric Wong
0 siblings, 1 reply; 3+ results
From: Eric Wong @ 2016-12-14 6:59 UTC (permalink / raw)
To: yahns-public
It's wrong to set "Transfer-Encoding: chunked" on any response
without an entity body. This confused curl -T- when I triggered
a rare 204 response... Fortunately, yahns is not used in a
capacity where it's failure would start World War III.
Eric Wong (2):
response: do not set chunked header on bodyless responses
proxy_pass: do not chunk on bodyless upstream responses
lib/yahns/http_response.rb | 4 ++--
lib/yahns/proxy_http_response.rb | 2 +-
test/test_auto_chunk.rb | 22 +++++++++++++++++++++-
test/test_proxy_pass.rb | 33 +++++++++++++++++++++++++++++++++
4 files changed, 57 insertions(+), 4 deletions(-)
^ permalink raw reply [relevance 6%]
Results 1-3 of 3 | reverse | options above
-- pct% links below jump to the message on this page, permalinks otherwise --
2016-11-14 21:22 [ANN] yahns 1.14.0 -_- sleepy app server for Ruby Eric Wong
2016-12-14 19:23 6% ` [ANN] yahns 1.14.1 " Eric Wong
2016-12-14 6:59 6% [PATCH 0/2] revenge of the body-less responses Eric Wong
2016-12-14 6:59 7% ` [PATCH 2/2] proxy_pass: do not chunk on bodyless upstream responses Eric Wong
Code repositories for project(s) associated with this public inbox
https://yhbt.net/yahns.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).