Module: Yahns::WbufCommon

Included in:
StreamFile, Wbuf, WbufLite, WbufStr
Defined in:
lib/yahns/wbuf_common.rb

Overview

Copyright © 2013-2016 all contributors <[email protected]> License: GPL-3.0+ (www.gnu.org/licenses/gpl-3.0.txt) frozen_string_literal: true

Instance Method Summary collapse

Instance Method Details

#wbuf_close_common(client) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/yahns/wbuf_common.rb', line 41

def wbuf_close_common(client)
  @body.close if @body.respond_to?(:close)
  if @wbuf_persist.respond_to?(:call) # hijack
    client.response_hijacked(@wbuf_persist) # :ignore
  else
    @wbuf_persist # true, false, :ignore, or Yahns::StreamFile
  end
end

#wbuf_flush(client) ⇒ Object

returns true / false for persistent/non-persistent connections returns :wait_*able when blocked returns :ignore if hijacked currently, we rely on each thread having exclusive access to the client socket, so this is never called concurrently with wbuf_write



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/yahns/wbuf_common.rb', line 11

def wbuf_flush(client)
  case rv = client.trysendfile(@tmpio, @sf_offset, @sf_count)
  when Integer
    if (@sf_count -= rv) == 0 # all sent!
      @sf_offset = 0
      return wbuf_close(client)
    end

    @sf_offset += rv # keep going otherwise
  when :wait_writable, :wait_readable
    return rv
  when nil
    # response got truncated, drop the connection
    # this may happens when using Rack::File or similar, we can't
    # keep the connection alive because we already sent our Content-Length
    # header the client would be confused.
    @wbuf_persist = false
    return wbuf_close(client)
  else
    raise "BUG: rv=#{rv.inspect} " \
          "on tmpio=#{@tmpio.inspect} " \
          "sf_offset=#@sf_offset sf_count=#@sf_count"
  end while @sf_count > 0
  wbuf_close(client)
rescue
  @wbuf_persist = false # ensure a hijack response is not called
  wbuf_close(client)
  raise
end