From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS201848 85.143.208.0/20 X-Spam-Status: No, score=-3.3 required=3.0 tests=AWL,BAYES_00, RCVD_IN_MSPIKE_BL,RCVD_IN_MSPIKE_ZBI,RCVD_IN_XBL,SPF_FAIL,SPF_HELO_FAIL shortcircuit=no autolearn=no autolearn_force=no version=3.4.0 Received: from 80x24.org (tor-exit.demfloro.ru [85.143.219.211]) by dcvr.yhbt.net (Postfix) with ESMTP id 81D6F2022A for ; Tue, 8 Nov 2016 23:21:44 +0000 (UTC) From: Eric Wong To: yahns-public@yhbt.net Subject: [PATCH] response: only stream "file" responses on known length Date: Tue, 8 Nov 2016 23:21:40 +0000 Message-Id: <20161108232140.21752-1-e@80x24.org> List-Id: This means we need to check Content-Length and use it properly (unless Content-Range is set). --- lib/yahns/http_response.rb | 9 ++++++--- lib/yahns/stream_file.rb | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/yahns/http_response.rb b/lib/yahns/http_response.rb index 32d1a45..ca28bbf 100644 --- a/lib/yahns/http_response.rb +++ b/lib/yahns/http_response.rb @@ -60,7 +60,7 @@ def err_response(code) end def response_header_blocked(header, body, alive, offset, count) - if body.respond_to?(:to_path) + if body.respond_to?(:to_path) && count alive = Yahns::StreamFile.new(body, alive, offset, count) body = nil end @@ -152,7 +152,8 @@ def http_response_write(res, opt) alive = false if value =~ /\bclose\b/i when %r{\AContent-Length\z}i term = true - flags |= MSG_MORE if value.to_i > 0 && !hdr_only + clen = value.to_i + flags |= MSG_MORE if clen > 0 && !hdr_only kv_str(buf, key, value) when %r{\ATransfer-Encoding\z}i term = true if value =~ /\bchunked\b/i @@ -163,6 +164,8 @@ def http_response_write(res, opt) kv_str(buf, key, value) end end + count ||= clen + if !term && chunk_ok term = true body = Yahns::ChunkBody.new(body, opt) @@ -194,7 +197,7 @@ def http_response_write(res, opt) return response_hijacked(hijack) if hijack return http_response_done(alive) if hdr_only - if body.respond_to?(:to_path) + if body.respond_to?(:to_path) && count @state = body = Yahns::StreamFile.new(body, alive, offset, count) return step_write end diff --git a/lib/yahns/stream_file.rb b/lib/yahns/stream_file.rb index fdba5bf..6cce7a0 100644 --- a/lib/yahns/stream_file.rb +++ b/lib/yahns/stream_file.rb @@ -27,8 +27,8 @@ def initialize(body, persist, offset, count) retry end end - @sf_offset = offset - @sf_count = count || @tmpio.size + @sf_offset = offset || 0 + @sf_count = count @wbuf_persist = persist # whether or not we keep the connection alive @body = body end -- EW