yahns 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33525c7e184e8f29a1667fb401ce20bcda42f30e
4
- data.tar.gz: 13d18fdee5cfbd47bb3d83046c5e388e06c08495
3
+ metadata.gz: 0a9749686719fc4ebab52f18c57c3c3b9cf00ab8
4
+ data.tar.gz: 82df4e6686e4ee97cad0462fb1d0c809d19f9a10
5
5
  SHA512:
6
- metadata.gz: c1cdd01498c6a8719efa5e246783ca00fd7dd2c31caaf4e7a345cbd3716f67ab962ecd1dd3c39819cc74cb4e58900fa08c6497554dfeefb1152c7cabf89d1b40
7
- data.tar.gz: 3b087200a116d46b7b7c4ebfc5e2c58f7315ff53c19ff02414b289258f43d40e0ecd79348ba96731bbd081d1bea6cd04695aeb18d0cfbcef96ec359db782600d
6
+ metadata.gz: f5f385fabee64576cadcea538d77065ec625e50ee6c9c40ebba09d662995f6ad9c1740a422ee219078c1f1a7c7198120927625d08632b5d16d6f96dfd8039fb3
7
+ data.tar.gz: 12080fba5d268e326f648da62708ec2927063b2de470a3590be6d55d21968ea5150e94d8b18165dba22ca9388fbb535c9f5180039926a75df372d4f602d60c76
data/GIT-VERSION-FILE CHANGED
@@ -1 +1 @@
1
- VERSION = 1.0.0
1
+ VERSION = 1.1.0
data/GIT-VERSION-GEN CHANGED
@@ -4,7 +4,7 @@
4
4
  CONSTANT = "Yahns::VERSION"
5
5
  RVF = "lib/yahns/version.rb"
6
6
  GVF = "GIT-VERSION-FILE"
7
- DEF_VER = "v1.0.0"
7
+ DEF_VER = "v1.1.0"
8
8
  vn = DEF_VER
9
9
 
10
10
  # First see if there is a version file (included in release tarballs),
data/NEWS CHANGED
@@ -1,3 +1,23 @@
1
+ yahns 1.1.0 - MOAR SLEEPY / 2014-02-04
2
+ --------------------------------------
3
+
4
+ On responses with a known, non-zero Content-Length, yahns will now
5
+ automatically use the MSG_MORE flag when sending HTTP headers. This
6
+ reduces TCP packet transmits and allows clients to wake up and read
7
+ one less time.
8
+
9
+ This is similar to the TCP_NOPUSH/TCP_CORK functionality of other
10
+ servers, but requires no additional syscalls. It is only supported
11
+ on the Linux kernel, however (but yahns is currently epoll-only
12
+ with kqueue support on the horizon).
13
+
14
+ Eric Wong (5):
15
+ quiet down EHOSTUNREACH errors
16
+ http_response: use kgio_syssend with MSG_MORE
17
+ load yahns/version file
18
+ socket_helper: remove SO_REUSEPORT define for untested arches
19
+ response: do not use MSG_MORE on empty bodies
20
+
1
21
  yahns 1.0.0 / 2014-01-02
2
22
  ------------------------
3
23
 
@@ -270,7 +270,7 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
270
270
  def handle_error(e)
271
271
  code = case e
272
272
  when EOFError,Errno::ECONNRESET,Errno::EPIPE,Errno::ENOTCONN,
273
- Errno::ETIMEDOUT
273
+ Errno::ETIMEDOUT,Errno::EHOSTUNREACH
274
274
  return # don't send response, drop the connection
275
275
  when Yahns::ClientTimeout
276
276
  408
@@ -31,6 +31,22 @@ module Yahns::HttpResponse # :nodoc:
31
31
  R100_RAW = "HTTP/1.1 100 Continue\r\n\r\n"
32
32
  R100_CCC = "100 Continue\r\n\r\nHTTP/1.1 "
33
33
  HTTP_EXPECT = "HTTP_EXPECT"
34
+ REQUEST_METHOD = "REQUEST_METHOD"
35
+ HEAD = "HEAD"
36
+
37
+ # no point in using one without the other, these have been in Linux
38
+ # for ages
39
+ if Socket.const_defined?(:MSG_MORE) && Socket.const_defined?(:MSG_DONTWAIT)
40
+ MSG_MORE = Socket::MSG_MORE
41
+ MSG_DONTWAIT = Socket::MSG_DONTWAIT
42
+ else
43
+ MSG_MORE = 0
44
+ MSG_DONTWAIT = 0
45
+
46
+ def kgio_syssend(buf, flags)
47
+ kgio_trywrite(buf)
48
+ end
49
+ end
34
50
 
35
51
  def response_start
36
52
  @response_start_sent ? Z : RESPONSE_START
@@ -109,6 +125,10 @@ module Yahns::HttpResponse # :nodoc:
109
125
  end
110
126
  end
111
127
 
128
+ def have_more?(value)
129
+ value.to_i > 0 && @hs.env[REQUEST_METHOD] != HEAD
130
+ end
131
+
112
132
  # writes the rack_response to socket as an HTTP response
113
133
  # returns :wait_readable, :wait_writable, :forget, or nil
114
134
  def http_response_write(status, headers, body)
@@ -117,6 +137,7 @@ module Yahns::HttpResponse # :nodoc:
117
137
  count = hijack = nil
118
138
  k = self.class
119
139
  alive = @hs.next? && k.persistent_connections
140
+ flags = MSG_DONTWAIT
120
141
 
121
142
  if @hs.headers?
122
143
  buf = "#{response_start}#{status}\r\nDate: #{httpdate}\r\n"
@@ -133,6 +154,9 @@ module Yahns::HttpResponse # :nodoc:
133
154
  when %r{\AConnection\z}i
134
155
  # allow Rack apps to tell us they want to drop the client
135
156
  alive = false if value =~ /\bclose\b/i
157
+ when %r{\AContent-Length\z}i
158
+ flags |= MSG_MORE if have_more?(value)
159
+ buf << kv_str(key, value)
136
160
  when "rack.hijack"
137
161
  hijack = value
138
162
  body = nil # ensure we do not close body
@@ -141,10 +165,11 @@ module Yahns::HttpResponse # :nodoc:
141
165
  end
142
166
  end
143
167
  buf << (alive ? CONN_KA : CONN_CLOSE)
144
- case rv = kgio_trywrite(buf)
168
+ case rv = kgio_syssend(buf, flags)
145
169
  when nil # all done, likely
146
170
  break
147
171
  when String
172
+ flags = MSG_DONTWAIT
148
173
  buf = rv # hope the skb grows
149
174
  when :wait_writable, :wait_readable
150
175
  if k.output_buffering
@@ -9,11 +9,7 @@ module Yahns::SocketHelper # :nodoc:
9
9
  if defined?(Socket::SO_REUSEPORT)
10
10
  Socket::SO_REUSEPORT
11
11
  elsif RUBY_PLATFORM =~ /linux/
12
- if RUBY_PLATFORM =~ /(?:alpha|mips|parisc|sparc)/
13
- 0x0200 # untested
14
- else
15
- 15 # only tested on x86_64 and i686
16
- end
12
+ 15 # only tested on x86_64 and i686
17
13
  else
18
14
  nil
19
15
  end
data/lib/yahns/version.rb CHANGED
@@ -1 +1 @@
1
- Yahns::VERSION = '1.0.0' # :nodoc:
1
+ Yahns::VERSION = '1.1.0' # :nodoc:
data/lib/yahns.rb CHANGED
@@ -74,3 +74,4 @@ require_relative 'yahns/server'
74
74
  require_relative 'yahns/fdmap'
75
75
  require_relative 'yahns/acceptor'
76
76
  require_relative 'yahns/wbuf'
77
+ require_relative 'yahns/version'
data/man/yahns-rackup.1 CHANGED
@@ -12,42 +12,45 @@ It is expected to start in your application root (APP_ROOT).
12
12
  .SH RACKUP FILE
13
13
  .PP
14
14
  This defaults to "config.ru" in APP_ROOT.
15
- It should be the same file used by rackup(1) and other Rack launchers,
16
- it uses the \f[I]Rack::Builder\f[] DSL.
15
+ It should be the same file used by rackup(1) and other Rack
16
+ launchers, it uses the \f[I]Rack::Builder\f[] DSL.
17
17
  .SH YAHNS OPTIONS
18
18
  .TP
19
19
  .B -O client_timeout=SECONDS
20
20
  Defines the timeout expiring idle connections.
21
21
  .RS
22
22
  .PP
23
- Increase this if your application takes longer to run than the default
24
- timeout.
23
+ Increase this if your application takes longer to run than the
24
+ default timeout.
25
25
  Lower this if you run out of FDs.
26
26
  .PP
27
27
  Default: 15 (seconds)
28
28
  .RE
29
29
  .TP
30
- .B -O listen=ADDRESS[,ADDRESS...]
30
+ .B -O listen=ADDRESS[,ADDRESS\&...]
31
31
  Listens on a given ADDRESS.
32
- ADDRESS may be in the form of HOST:PORT or PATH, HOST:PORT is taken to
33
- mean a TCP socket and PATH is meant to be a path to a UNIX domain
34
- socket.
35
- Defaults to "0.0.0.0:9292" (all addresses on TCP port 9292).
32
+ ADDRESS may be in the form of HOST:PORT or PATH, HOST:PORT is taken
33
+ to mean a TCP socket and PATH is meant to be a path to a UNIX
34
+ domain socket.
35
+ Defaults to \[lq]0.0.0.0:9292\[rq] (all addresses on TCP port
36
+ 9292).
36
37
  Multiple addresses may be separated with commas.
37
38
  .RS
38
39
  .RE
39
40
  .TP
40
41
  .B -O stderr_path=PATHNAME
41
42
  Allow redirecting $stderr to a given path.
42
- Unlike doing this from the shell, this allows the yahns process to know
43
- the path its writing to and rotate the file if it is used for logging.
44
- The file will be opened with the O_APPEND flag and writes synchronized
45
- to the kernel (but not necessarily to \f[I]disk\f[]) so multiple
46
- processes can safely append to it.
43
+ Unlike doing this from the shell, this allows the yahns process to
44
+ know the path its writing to and rotate the file if it is used for
45
+ logging.
46
+ The file will be opened with the O_APPEND flag and writes
47
+ synchronized to the kernel (but not necessarily to \f[I]disk\f[])
48
+ so multiple processes can safely append to it.
47
49
  .RS
48
50
  .PP
49
- If you are daemonizing and using the default logger, it is important to
50
- specify this as errors will otherwise be lost to /dev/null.
51
+ If you are daemonizing and using the default logger, it is
52
+ important to specify this as errors will otherwise be lost to
53
+ /dev/null.
51
54
  Some applications/libraries may also triggering warnings that go to
52
55
  stderr, and they will end up here.
53
56
  .PP
@@ -56,8 +59,8 @@ Default: /dev/null if daemonized, controlling terminal if not
56
59
  .TP
57
60
  .B -O stdout_path=PATH
58
61
  Same as stderr_path, except for $stdout.
59
- Not many applications write to $stdout, but any that do will have their
60
- output written here.
62
+ Not many applications write to $stdout, but any that do will have
63
+ their output written here.
61
64
  It is safe to point this to the same location a stderr_path.
62
65
  Like stderr_path, this defaults to /dev/null when daemonized.
63
66
  .RS
@@ -68,9 +71,11 @@ Default: /dev/null if daemonized, controlling terminal if not
68
71
  .B -O worker_threads=INTEGER
69
72
  This controls the number of threads for application processing.
70
73
  Each queue has its own thread pool.
71
- Increase this number if your applications are able to use more threads
72
- effectively or if either (or both) input/output buffering are disabled.
73
- Lower this number if you do not need multi-thread concurrency at all.
74
+ Increase this number if your applications are able to use more
75
+ threads effectively or if either (or both) input/output buffering
76
+ are disabled.
77
+ Lower this number if you do not need multi-thread concurrency at
78
+ all.
74
79
  .RS
75
80
  .PP
76
81
  Default: 7
@@ -81,8 +86,8 @@ Default: 7
81
86
  Run daemonized in the background.
82
87
  The process is detached from the controlling terminal and stdin is
83
88
  redirected to /dev/null.
84
- Unless specified via stderr_path and stdout_path, stderr and stdout will
85
- also be redirected to "/dev/null".
89
+ Unless specified via stderr_path and stdout_path, stderr and stdout
90
+ will also be redirected to \[lq]/dev/null\[rq].
86
91
  .RS
87
92
  .RE
88
93
  .TP
@@ -93,28 +98,31 @@ See the RACK ENVIRONMENT section for more details.
93
98
  .RE
94
99
  .TP
95
100
  .B -o, --host HOST
96
- Listen on a TCP socket belonging to HOST, default is "0.0.0.0" (all
97
- addresses).
98
- If specified multiple times on the command-line, only the last-specified
99
- value takes effect.
100
- This option only exists for compatibility with the rackup(1) command,
101
- use of "-l"/"--listen" switch is recommended instead.
101
+ Listen on a TCP socket belonging to HOST, default is
102
+ \[lq]0.0.0.0\[rq] (all addresses).
103
+ If specified multiple times on the command-line, only the
104
+ last-specified value takes effect.
105
+ This option only exists for compatibility with the rackup(1)
106
+ command, use of \[lq]-l\[rq]/\[lq]--listen\[rq] switch is
107
+ recommended instead.
102
108
  .RS
103
109
  .RE
104
110
  .TP
105
111
  .B -p, --port PORT
106
112
  Listen on the specified TCP PORT, default is 9292.
107
- If specified multiple times on the command-line, only the last-specified
108
- value takes effect.
109
- This option only exists for compatibility with the rackup(1) command,
110
- use of "-l"/"--listen" switch is recommended instead.
113
+ If specified multiple times on the command-line, only the
114
+ last-specified value takes effect.
115
+ This option only exists for compatibility with the rackup(1)
116
+ command, use of \[lq]-l\[rq]/\[lq]--listen\[rq] switch is
117
+ recommended instead.
111
118
  .RS
112
119
  .RE
113
120
  .SH RUBY OPTIONS
114
121
  .TP
115
122
  .B -e, --eval LINE
116
123
  Evaluate a LINE of Ruby code.
117
- This evaluation happens immediately as the command-line is being parsed.
124
+ This evaluation happens immediately as the command-line is being
125
+ parsed.
118
126
  .RS
119
127
  .RE
120
128
  .TP
@@ -131,17 +139,18 @@ Turn on verbose warnings, the $VERBOSE variable is set to true.
131
139
  .B -I, --include PATH
132
140
  specify $LOAD_PATH.
133
141
  PATH will be prepended to $LOAD_PATH.
134
- The \[aq]:\[aq] character may be used to delimit multiple directories.
142
+ The \[aq]:\[aq] character may be used to delimit multiple
143
+ directories.
135
144
  This directive may be used more than once.
136
- Modifications to $LOAD_PATH take place immediately and in the order they
137
- were specified on the command-line.
145
+ Modifications to $LOAD_PATH take place immediately and in the order
146
+ they were specified on the command-line.
138
147
  .RS
139
148
  .RE
140
149
  .TP
141
150
  .B -r, --require LIBRARY
142
151
  require a specified LIBRARY before executing the application.
143
- The "require" statement will be executed immediately and in the order
144
- they were specified on the command-line.
152
+ The "require" statement will be executed immediately and in the
153
+ order they were specified on the command-line.
145
154
  .RS
146
155
  .RE
147
156
  .SH SIGNALS
@@ -157,18 +166,22 @@ If RACK_ENV is already set, it will be used unless -E is used.
157
166
  See rackup documentation for more details.
158
167
  .SH CONTACT
159
168
  .PP
160
- All feedback welcome via plain-text mail to <yahns-public@rubyforge.org>
169
+ All feedback welcome via plain-text mail to
170
+ <yahns-public@rubyforge.org>
161
171
  .PD 0
162
172
  .P
163
173
  .PD
164
- No subscription is necessary to post to the mailing list.
174
+ No subscription is
175
+ necessary to post to the mailing list.
165
176
  .SH COPYRIGHT
166
177
  .PP
167
- Copyright 2013, Eric Wong <normalperson@yhbt.net> and all contributors.
178
+ Copyright 2013, Eric Wong <normalperson@yhbt.net> and all
179
+ contributors.
168
180
  .PD 0
169
181
  .P
170
182
  .PD
171
- License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
183
+ License: GPLv3 or later
184
+ <http://www.gnu.org/licenses/gpl-3.0.txt>
172
185
  .SH SEE ALSO
173
186
  .PP
174
187
  yahns(1), yahns_config(5)
@@ -178,3 +191,4 @@ yahns(1), yahns_config(5)
178
191
  Rack RDoc (http://rack.rubyforge.org/doc/)
179
192
  .IP \[bu] 2
180
193
  Rackup HowTo (http://wiki.github.com/rack/rack/tutorial-rackup-howto)
194
+
data/man/yahns.1 CHANGED
@@ -4,19 +4,20 @@
4
4
  yahns - multi-threaded, non-blocking application server for Ruby
5
5
  .SH SYNOPSYS
6
6
  .PP
7
- yahns -c CONFIG_FILE [-D|--daemonize]
7
+ yahns -c CONFIG_FILE [-D|\[em]daemonize]
8
8
  .SH DESCRIPTION
9
9
  .PP
10
10
  yahns(1) is the primary interface for launching a yahns application
11
11
  server.
12
12
  The configuration file is documented in yahns_config(5).
13
- yahns hosts Rack HTTP applications, but may support others in the future
14
- such as DRb.
13
+ yahns hosts Rack HTTP applications, but may support others in the
14
+ future such as DRb.
15
15
  .SH SIGNALS
16
16
  .PP
17
- The following UNIX signals may be sent to the running yahns process.
18
- If yahns is configured for worker_processes (optional), signals should
19
- only be sent to the master process.
17
+ The following UNIX signals may be sent to the running yahns
18
+ process.
19
+ If yahns is configured for worker_processes (optional), signals
20
+ should only be sent to the master process.
20
21
  .IP \[bu] 2
21
22
  INT/TERM/QUIT - graceful shutdown.
22
23
  If repeated (any of these signals is sent twice), shutdown occurs
@@ -29,10 +30,10 @@ O_APPEND file flag and buffering disabled (IO#sync==false)
29
30
  USR2 - reexecute the running binary.
30
31
  A separate QUIT should be sent to
31
32
  .IP \[bu] 2
32
- HUP - if worker_processes are not used, this will reexecute the running
33
- binary and gracefully exit the running process.
34
- If worker_processes are used, this will reload config file, app, and
35
- gracefully restart all workers
33
+ HUP - if worker_processes are not used, this will reexecute the
34
+ running binary and gracefully exit the running process.
35
+ If worker_processes are used, this will reload config file, app,
36
+ and gracefully restart all workers
36
37
  .IP \[bu] 2
37
38
  WINCH - gracefully stops workers but keep the master running.
38
39
  This will only work for daemonized processes and only if the
@@ -46,30 +47,36 @@ worker_processes directive is used)
46
47
  .SH ENVIRONMENT
47
48
  .PP
48
49
  yahns(1) itself requires no special environment variables.
49
- However, environment variables such as RACK_ENV and RAILS_ENV can affect
50
- Rack and Rails applications it hosts.
51
- Ruby and C library implementation-specific environment variables will
52
- also affect it.
50
+ However, environment variables such as RACK_ENV and RAILS_ENV can
51
+ affect Rack and Rails applications it hosts.
52
+ Ruby and C library implementation-specific environment variables
53
+ will also affect it.
53
54
  .PP
54
55
  yahns will update the PWD (current working directory) env if the
55
56
  working_directory directive is set (see yahns_config(5)).
56
57
  .SH FILES
57
58
  .PP
58
- See yahns_config(5) for documentation on the configuration file format.
59
+ See yahns_config(5) for documentation on the configuration file
60
+ format.
59
61
  .SH CONTACT
60
62
  .PP
61
- All feedback welcome via plain-text mail to <yahns-public@rubyforge.org>
63
+ All feedback welcome via plain-text mail to
64
+ <yahns-public@rubyforge.org>
62
65
  .PD 0
63
66
  .P
64
67
  .PD
65
- No subscription is necessary to post to the mailing list.
68
+ No subscription is
69
+ necessary to post to the mailing list.
66
70
  .SH COPYRIGHT
67
71
  .PP
68
- Copyright 2013, Eric Wong <normalperson@yhbt.net> and all contributors.
72
+ Copyright 2013, Eric Wong <normalperson@yhbt.net> and all
73
+ contributors.
69
74
  .PD 0
70
75
  .P
71
76
  .PD
72
- License: GPLv3 or later <http://www.gnu.org/licenses/gpl-3.0.txt>
77
+ License: GPLv3 or later
78
+ <http://www.gnu.org/licenses/gpl-3.0.txt>
73
79
  .SH SEE ALSO
74
80
  .PP
75
81
  yahns-rackup(1), yahns_config(5)
82
+
@@ -100,4 +100,9 @@ module TrywriteBlocked
100
100
  return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1)
101
101
  super
102
102
  end
103
+
104
+ def kgio_syssend(*args)
105
+ return :wait_writable if $_tw_block_on.include?($_tw_blocked += 1)
106
+ super
107
+ end
103
108
  end
@@ -0,0 +1,84 @@
1
+ # Copyright (C) 2013, Eric Wong <normalperson@yhbt.net> and all contributors
2
+ # License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
3
+ require_relative 'server_helper'
4
+
5
+ class TestResponse < Testcase
6
+ ENV["N"].to_i > 1 and parallelize_me!
7
+ include ServerHelper
8
+ alias setup server_helper_setup
9
+ alias teardown server_helper_teardown
10
+
11
+ def test_response_time_empty_body
12
+ err = @err
13
+ cfg = Yahns::Config.new
14
+ host, port = @srv.addr[3], @srv.addr[1]
15
+ cfg.instance_eval do
16
+ GTL.synchronize do
17
+ app = Rack::Builder.new do
18
+ use Rack::ContentLength
19
+ use Rack::ContentType, "text/plain"
20
+ run lambda { |_| [ 200, {}, [] ] }
21
+ end
22
+ app(:rack, app) do
23
+ listen "#{host}:#{port}"
24
+ end
25
+ end
26
+ logger(Logger.new(err.path))
27
+ end
28
+ pid = mkserver(cfg)
29
+ Net::HTTP.start(host, port) { |h|
30
+ # warmup request
31
+ res = h.get("/")
32
+ assert_empty res.body
33
+
34
+ t0 = Time.now
35
+ nr = 10
36
+ nr.times do
37
+ res = h.get("/")
38
+ assert_empty res.body
39
+ end
40
+ diff = Time.now - t0
41
+ assert_operator diff, :<, (0.200 * nr)
42
+ }
43
+ ensure
44
+ quit_wait(pid)
45
+ end
46
+
47
+ def test_response_time_head
48
+ err = @err
49
+ cfg = Yahns::Config.new
50
+ host, port = @srv.addr[3], @srv.addr[1]
51
+ cfg.instance_eval do
52
+ GTL.synchronize do
53
+ require 'rack/lobster'
54
+ app = Rack::Builder.new do
55
+ use Rack::Head
56
+ use Rack::ContentLength
57
+ use Rack::ContentType, "text/plain"
58
+ run Rack::Lobster.new
59
+ end
60
+ app(:rack, app) do
61
+ listen "#{host}:#{port}"
62
+ end
63
+ end
64
+ logger(Logger.new(err.path))
65
+ end
66
+ pid = mkserver(cfg)
67
+ Net::HTTP.start(host, port) { |h|
68
+ # warmup request
69
+ res = h.head("/")
70
+ assert_equal 200, res.code.to_i
71
+
72
+ t0 = Time.now
73
+ nr = 10
74
+ nr.times do
75
+ res = h.head("/")
76
+ assert_equal 200, res.code.to_i
77
+ end
78
+ diff = Time.now - t0
79
+ assert_operator diff, :<, (0.200 * nr)
80
+ }
81
+ ensure
82
+ quit_wait(pid)
83
+ end
84
+ end
data/yahns.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
10
10
  s.email = %q{yahns@yhbt.net}
11
11
  s.executables = manifest.grep(%r{\Abin/}).map { |s| s.sub(%r{\Abin/}, "") }
12
12
  s.files = manifest
13
- s.add_dependency(%q<kgio>, '~> 2.8')
13
+ s.add_dependency(%q<kgio>, '~> 2.9')
14
14
  s.add_dependency(%q<sleepy_penguin>, '~> 3.2')
15
15
  s.add_dependency(%q<sendfile>, '~> 1.2.1')
16
16
  s.add_dependency(%q<unicorn>, '~> 4.6', '>= 4.6.3')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yahns
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - yahns hackers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-02 00:00:00.000000000 Z
11
+ date: 2014-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: kgio
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '2.8'
19
+ version: '2.9'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '2.8'
26
+ version: '2.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: sleepy_penguin
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -196,6 +196,7 @@ files:
196
196
  - test/test_rack.rb
197
197
  - test/test_rack_hijack.rb
198
198
  - test/test_reopen_logs.rb
199
+ - test/test_response.rb
199
200
  - test/test_serve_static.rb
200
201
  - test/test_server.rb
201
202
  - test/test_stream_file.rb