Module: HTTPX::Plugins::StreamBidi::RequestMethods

Defined in:
lib/httpx/plugins/stream_bidi.rb,
sig/plugins/stream_bidi.rbs

Overview

Adds synchronization to request operations which may buffer payloads from different threads.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#headers_sentBoolean

Returns the value of attribute headers_sent.

Returns:

  • (Boolean)


259
260
261
# File 'lib/httpx/plugins/stream_bidi.rb', line 259

def headers_sent
  @headers_sent
end

Instance Method Details

#<<(chunk) ⇒ Object



319
320
321
322
323
324
325
326
327
328
329
# File 'lib/httpx/plugins/stream_bidi.rb', line 319

def <<(chunk)
  @mutex.synchronize do
    if @drainer
      @body.clear if @body.respond_to?(:clear)
      @drainer = nil
    end
    @body << chunk

    transition(:body)
  end
end

#can_buffer?Boolean

Returns:

  • (Boolean)


279
280
281
282
283
# File 'lib/httpx/plugins/stream_bidi.rb', line 279

def can_buffer?
  return super unless @options.stream

  super && @state != :waiting_for_chunk
end

#closeObject



331
332
333
334
335
336
337
338
339
340
341
342
# File 'lib/httpx/plugins/stream_bidi.rb', line 331

def close
  return super unless @options.stream

  @mutex.synchronize do
    return if @closed

    @closed = true
  end

  # last chunk to send which ends the stream
  self << ""
end

#closed?Boolean

Returns:

  • (Boolean)


273
274
275
276
277
# File 'lib/httpx/plugins/stream_bidi.rb', line 273

def closed?
  return super unless @options.stream

  @closed
end

#flush_buffer_on_body { ... } ⇒ void

This method returns an undefined value.

Yields:

Yield Returns:

  • (void)


269
270
271
# File 'lib/httpx/plugins/stream_bidi.rb', line 269

def flush_buffer_on_body(&cb)
  @flush_buffer_on_body_cb = on(:body, &cb)
end

#initializeObject



261
262
263
264
265
266
267
# File 'lib/httpx/plugins/stream_bidi.rb', line 261

def initialize(*)
  super
  @headers_sent = false
  @closed = false
  @flush_buffer_on_body_cb = nil
  @mutex = Thread::Mutex.new
end

#transition(nextstate) ⇒ Object

overrides state management transitions to introduce an intermediate :waiting_for_chunk state, which the request transitions to once payload is buffered.



288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
# File 'lib/httpx/plugins/stream_bidi.rb', line 288

def transition(nextstate)
  return super unless @options.stream

  headers_sent = @headers_sent

  case nextstate
  when :idle
    headers_sent = false

    if @flush_buffer_on_body_cb
      callbacks(:body).delete(@flush_buffer_on_body_cb)
      @flush_buffer_on_body_cb = nil
    end
  when :waiting_for_chunk
    return unless @state == :body
  when :body
    case @state
    when :headers
      headers_sent = true
    when :waiting_for_chunk
      # HACK: to allow super to pass through
      @state = :headers
    end
  end

  super.tap do
    # delay setting this up until after the first transition to :body
    @headers_sent = headers_sent
  end
end