Class: Protocol::HTTP::Body::Stream

Inherits:
Object
  • Object
show all
Includes:
Reader
Defined in:
lib/protocol/http/body/stream.rb

Overview

The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be “ASCII-8BIT” and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to gets, each, read and rewind.

Defined Under Namespace

Modules: Reader

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Reader

#read, #read_nonblock, #read_partial

Constructor Details

#initialize(input = nil, output = Buffered.new) ⇒ Stream

Returns a new instance of Stream.

Raises:

  • (ArgumentError)


13
14
15
16
17
18
19
20
21
22
# File 'lib/protocol/http/body/stream.rb', line 13

def initialize(input = nil, output = Buffered.new)
	@input = input
	@output = output
	
	raise ArgumentError, "Non-writable output!" unless output.respond_to?(:write)
	
	# Will hold remaining data in `#read`.
	@buffer = nil
	@closed = false
end

Instance Attribute Details

#inputObject (readonly)

Returns the value of attribute input.



24
25
26
# File 'lib/protocol/http/body/stream.rb', line 24

def input
  @input
end

#outputObject (readonly)

Returns the value of attribute output.



25
26
27
# File 'lib/protocol/http/body/stream.rb', line 25

def output
  @output
end

Instance Method Details

#<<(buffer) ⇒ Object



141
142
143
# File 'lib/protocol/http/body/stream.rb', line 141

def <<(buffer)
	write(buffer)
end

#close(error = nil) ⇒ Object

Close the input and output bodies.



160
161
162
163
164
165
166
167
# File 'lib/protocol/http/body/stream.rb', line 160

def close(error = nil)
	self.close_read
	self.close_write

	return nil
ensure
	@closed = true
end

#close_readObject



148
149
150
151
# File 'lib/protocol/http/body/stream.rb', line 148

def close_read
	@input&.close
	@input = nil
end

#close_writeObject

close must never be called on the input stream. huh?



154
155
156
157
# File 'lib/protocol/http/body/stream.rb', line 154

def close_write
	@output&.close
	@output = nil
end

#closed?Boolean

Whether the stream has been closed.

Returns:

  • (Boolean)


170
171
172
# File 'lib/protocol/http/body/stream.rb', line 170

def closed?
	@closed
end

#empty?Boolean

Whether there are any output chunks remaining?

Returns:

  • (Boolean)


175
176
177
# File 'lib/protocol/http/body/stream.rb', line 175

def empty?
	@output.empty?
end

#flushObject



145
146
# File 'lib/protocol/http/body/stream.rb', line 145

def flush
end

#write(buffer) ⇒ Object



128
129
130
131
132
133
134
135
# File 'lib/protocol/http/body/stream.rb', line 128

def write(buffer)
	if @output
		@output.write(buffer)
		return buffer.bytesize
	else
		raise IOError, "Stream is not writable, output has been closed!"
	end
end

#write_nonblock(buffer) ⇒ Object



137
138
139
# File 'lib/protocol/http/body/stream.rb', line 137

def write_nonblock(buffer)
	write(buffer)
end