about summary refs log tree commit homepage
path: root/test/benchmark/readinput.ru
blob: c91bec3c1f6bc6d422bcf27a095e59d894929bd7 (plain)
1
2
3
4
5
6
7
8
9
10
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
40
# This app is intended to test large HTTP requests with or without
# a fully-buffering reverse proxy such as nginx. Without a fully-buffering
# reverse proxy, unicorn will be unresponsive when client count exceeds
# worker_processes.

DOC = <<DOC
To demonstrate how bad unicorn is at slowly uploading clients:

  # in one terminal, start unicorn with one worker:
  unicorn -E none -l 127.0.0.1:8080 test/benchmark/readinput.ru

  # in a different terminal, upload 45M from multiple curl processes:
  dd if=/dev/zero bs=45M count=1 | curl -T- -HExpect: --limit-rate 1M \
     --trace-time -v http://127.0.0.1:8080/ &
  dd if=/dev/zero bs=45M count=1 | curl -T- -HExpect: --limit-rate 1M \
     --trace-time -v http://127.0.0.1:8080/ &
  wait

# The last client won't see a response until the first one is done uploading
# You also won't be able to make GET requests to view this documentation
# while clients are uploading.  You can also view the stderr debug output
# of unicorn (see logging code in #{__FILE__}).
DOC

run(lambda do |env|
  input = env['rack.input']
  buf = ''.b

  # default logger contains timestamps, rely on that so users can
  # see what the server is doing
  l = env['rack.logger']

  l.debug('BEGIN reading input ...') if l
  :nop while input.read(16384, buf)
  l.debug('DONE reading input ...') if l

  buf.clear
  [ 200, [ %W(Content-Length #{DOC.size}), %w(Content-Type text/plain) ],
    [ DOC ] ]
end)