yahns 1.3.1 → 1.4.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 +4 -4
- data/GIT-VERSION-GEN +1 -1
- data/README +18 -7
- data/extras/autoindex.rb +21 -3
- data/lib/yahns/daemon.rb +2 -2
- data/lib/yahns/http_client.rb +11 -3
- data/lib/yahns/http_context.rb +2 -2
- data/lib/yahns/http_response.rb +1 -1
- data/lib/yahns/queue.rb +2 -2
- data/lib/yahns/rackup_handler.rb +2 -2
- data/lib/yahns/server.rb +1 -1
- data/lib/yahns/stream_input.rb +2 -2
- data/test/test_extras_autoindex.rb +5 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 689a07f3155677900ad1b3df449a06978c2edd8c
|
4
|
+
data.tar.gz: 6741406d0b136e70745bc5aa728f6f5f7faa77bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b17db2fead5e7ff7585fdd5433f0adb43b247a46502ac99b7530bdc7b8a0d5e96b8d45a238ab7f16f8438ccac38a1cd1aaac33db1d55dcfbc1fbd034f6d2c203
|
7
|
+
data.tar.gz: 8fe3e364ff37d704d40079657d14739f9ac3fe886ffc86e6bc22bc606162ab906370279ba6a1f7d312c7acdc4f6f07269e655ab42ff55698f8a1adb5956e4ae2
|
data/GIT-VERSION-GEN
CHANGED
data/README
CHANGED
@@ -82,7 +82,7 @@ Hacking
|
|
82
82
|
We use git and follow the same development model as git itself
|
83
83
|
(mailing list-oriented, benevolent dictator).
|
84
84
|
|
85
|
-
|
85
|
+
git clone git://yhbt.net/yahns
|
86
86
|
|
87
87
|
Please use git-format-patch(1) and git-send-email(1) distributed with
|
88
88
|
the git(7) suite for generating and sending patches. Please format
|
@@ -94,7 +94,7 @@ See http://www.git-scm.com/ for more information on git.
|
|
94
94
|
Design
|
95
95
|
------
|
96
96
|
|
97
|
-
yahns is designed to
|
97
|
+
yahns is designed to optimally use multiple threads with non-blocking I/O.
|
98
98
|
The event loop is not a traditional single-threaded design with a mutex
|
99
99
|
slapped on as an afterthought, but designed from the beginning to utilize
|
100
100
|
multiple threads.
|
@@ -109,16 +109,16 @@ multiple threads.
|
|
109
109
|
The end result is clients transition freely and fairly between threads
|
110
110
|
and will always be able to find the next idle thread to run on.
|
111
111
|
|
112
|
-
This design works with kqueue, too, and we
|
113
|
-
|
114
|
-
|
112
|
+
This design works with kqueue, too, and we support kqueue. In fact, got
|
113
|
+
our design inspiration from the name "kqueue" when working on another
|
114
|
+
project. We may also support libkqueue:
|
115
115
|
|
116
116
|
http://sourceforge.net/projects/libkqueue/
|
117
117
|
|
118
118
|
In addition to multiple threads, yahns optionally supports multiple
|
119
119
|
processes to work around low FD limits as well as contention in the:
|
120
120
|
|
121
|
-
* kernel (socket (de)allocation from accept/close)
|
121
|
+
* kernel (socket (de)allocation from accept/close, mmap/sbrk locks)
|
122
122
|
* standard C library (malloc/free)
|
123
123
|
* Ruby VM (GVL, GC)
|
124
124
|
* application it hosts
|
@@ -126,7 +126,7 @@ processes to work around low FD limits as well as contention in the:
|
|
126
126
|
Copyright
|
127
127
|
---------
|
128
128
|
|
129
|
-
Copyright 2013,
|
129
|
+
Copyright 2013-2014, all contributors (see git repo).
|
130
130
|
License: GPLv3 or later <https://www.gnu.org/licenses/gpl-3.0.txt>
|
131
131
|
|
132
132
|
yahns is copyrighted Free Software by all contributors, see logs in
|
@@ -147,4 +147,15 @@ for more details.
|
|
147
147
|
You should have received a copy of the GNU General Public License along
|
148
148
|
with this program; if not, see https://www.gnu.org/licenses/gpl-3.0.txt
|
149
149
|
|
150
|
+
Additional permission under GNU GPL version 3 section 7:
|
151
|
+
|
152
|
+
If you modify this program, or any covered work, by linking or
|
153
|
+
combining it with the OpenSSL project's OpenSSL library (or a
|
154
|
+
modified version of that library), containing parts covered by the
|
155
|
+
terms of the OpenSSL or SSLeay licenses, the copyright holder(s)
|
156
|
+
grants you additional permission to convey the resulting work.
|
157
|
+
Corresponding Source for a non-source form of such a combination
|
158
|
+
shall include the source code for the parts of OpenSSL used as well
|
159
|
+
as that of the covered work.
|
160
|
+
|
150
161
|
lrg nabgure ubeevoyl-anzrq freire :>
|
data/extras/autoindex.rb
CHANGED
@@ -13,12 +13,13 @@ class Autoindex
|
|
13
13
|
FN = %{<a href="%s">%s</a>}
|
14
14
|
TFMT = "%Y-%m-%d %H:%M"
|
15
15
|
|
16
|
-
def initialize(app, index = %w(index.html))
|
16
|
+
def initialize(app, index = %w(index.html), skip_gzip_static = true)
|
17
17
|
app.respond_to?(:root) or raise ArgumentError,
|
18
18
|
"wrapped app #{app.inspect} does not respond to :root"
|
19
19
|
@app = app
|
20
20
|
@root = app.root
|
21
21
|
@index = index
|
22
|
+
@skip_gz = skip_gzip_static
|
22
23
|
end
|
23
24
|
|
24
25
|
def redirect_slash(env)
|
@@ -67,10 +68,13 @@ class Autoindex
|
|
67
68
|
# generate the index, show directories first
|
68
69
|
dirs = []
|
69
70
|
files = []
|
71
|
+
ngz_idx = {} if @skip_gz # used to avoid redundant stat()
|
70
72
|
dir.each do |base|
|
71
73
|
case base
|
72
74
|
when "."
|
73
75
|
next
|
76
|
+
when ".."
|
77
|
+
next if path_info == "/"
|
74
78
|
end
|
75
79
|
|
76
80
|
begin
|
@@ -90,8 +94,22 @@ class Autoindex
|
|
90
94
|
entry << (" " * pad) if pad > 0
|
91
95
|
entry << st.mtime.strftime(TFMT)
|
92
96
|
entry << sprintf("% 8s", human_size(st))
|
97
|
+
entry = [name, entry]
|
93
98
|
|
94
|
-
|
99
|
+
if st.directory?
|
100
|
+
dirs << entry
|
101
|
+
elsif ngz_idx
|
102
|
+
ngz_idx[name] = entry
|
103
|
+
else
|
104
|
+
files << entry
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
if ngz_idx
|
109
|
+
ngz_idx.each do |name, entry|
|
110
|
+
ngz_path = name.dup.gsub!(/\.gz\z/, '')
|
111
|
+
ngz_idx.include?(ngz_path) or files << entry
|
112
|
+
end
|
95
113
|
end
|
96
114
|
|
97
115
|
dirs.sort! { |(a,_),(b)| a <=> b }.map! { |(_,ent)| ent }
|
@@ -117,7 +135,7 @@ class Autoindex
|
|
117
135
|
dir.close if dir
|
118
136
|
end
|
119
137
|
|
120
|
-
def r(code,
|
138
|
+
def r(code, exc = nil, env = nil)
|
121
139
|
if env && exc && logger = env["rack.logger"]
|
122
140
|
msg = exc.message
|
123
141
|
msg = msg.dump if /[[:cntrl:]]/ =~ msg # prevent code injection
|
data/lib/yahns/daemon.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- encoding: binary -*-
|
2
|
-
# Copyright (C) 2013,
|
2
|
+
# Copyright (C) 2013-2014, all contributors
|
3
3
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
4
|
-
|
4
|
+
require_relative '../yahns'
|
5
5
|
|
6
6
|
module Yahns::Daemon # :nodoc:
|
7
7
|
# We don't do a lot of standard daemonization stuff:
|
data/lib/yahns/http_client.rb
CHANGED
@@ -224,9 +224,10 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
|
|
224
224
|
http_response_write(status, headers, body)
|
225
225
|
end
|
226
226
|
|
227
|
+
# this is the env["rack.hijack"] callback exposed to the Rack app
|
227
228
|
def hijack_proc(env)
|
228
229
|
proc do
|
229
|
-
|
230
|
+
hijack_cleanup
|
230
231
|
env[RACK_HIJACK_IO] = self
|
231
232
|
end
|
232
233
|
end
|
@@ -253,12 +254,19 @@ class Yahns::HttpClient < Kgio::Socket # :nodoc:
|
|
253
254
|
end while true
|
254
255
|
end
|
255
256
|
|
256
|
-
|
257
|
+
# allow releasing some memory if rack.hijack is used
|
258
|
+
def hijack_cleanup
|
257
259
|
# we must issue EPOLL_CTL_DEL before hijacking (if we issue it at all),
|
258
260
|
# because the hijacker may close use before we get back to the epoll worker
|
259
261
|
# loop. EPOLL_CTL_DEL saves about 200 bytes of unswappable kernel memory,
|
260
262
|
# so it can matter if we have lots of hijacked sockets.
|
261
|
-
self.class.queue.queue_del(self)
|
263
|
+
self.class.queue.queue_del(self) # EPOLL_CTL_DEL
|
264
|
+
@input = @input.close if @input
|
265
|
+
@hs = nil # no need for the HTTP parser anymore
|
266
|
+
end
|
267
|
+
|
268
|
+
def response_hijacked(fn)
|
269
|
+
hijack_cleanup
|
262
270
|
fn.call(self)
|
263
271
|
:ignore
|
264
272
|
end
|
data/lib/yahns/http_context.rb
CHANGED
@@ -49,11 +49,11 @@ module Yahns::HttpContext # :nodoc:
|
|
49
49
|
# input_buffering == false is handled in http_client
|
50
50
|
return app if @client_max_body_size == nil
|
51
51
|
|
52
|
-
|
52
|
+
require_relative 'cap_input'
|
53
53
|
return app if @input_buffering == true
|
54
54
|
|
55
55
|
# @input_buffering == false/:lazy
|
56
|
-
|
56
|
+
require_relative 'max_body'
|
57
57
|
Yahns::MaxBody.new(app, @client_max_body_size)
|
58
58
|
end
|
59
59
|
|
data/lib/yahns/http_response.rb
CHANGED
@@ -143,7 +143,7 @@ module Yahns::HttpResponse # :nodoc:
|
|
143
143
|
buf = "#{response_start}#{status}\r\nDate: #{httpdate}\r\n"
|
144
144
|
headers.each do |key, value|
|
145
145
|
case key
|
146
|
-
when %r{\ADate\z}
|
146
|
+
when %r{\ADate\z}i
|
147
147
|
next
|
148
148
|
when %r{\AContent-Range\z}i
|
149
149
|
if %r{\Abytes (\d+)-(\d+)/\d+\z} =~ value
|
data/lib/yahns/queue.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
# Copyright (C) 2013,
|
1
|
+
# Copyright (C) 2013-2014, all contributors
|
2
2
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
3
|
if SleepyPenguin.const_defined?(:Epoll)
|
4
4
|
require_relative 'queue_epoll'
|
5
5
|
else
|
6
|
-
require_relative 'queue_kqueue'
|
6
|
+
require_relative 'queue_kqueue'
|
7
7
|
end
|
data/lib/yahns/rackup_handler.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# Copyright (C) 2013,
|
1
|
+
# Copyright (C) 2013-2014, all contributors
|
2
2
|
# License: GPLv3 or later (https://www.gnu.org/licenses/gpl-3.0.txt)
|
3
|
-
|
3
|
+
require_relative '../yahns'
|
4
4
|
|
5
5
|
module Yahns::RackupHandler # :nodoc:
|
6
6
|
def self.default_host
|
data/lib/yahns/server.rb
CHANGED
data/lib/yahns/stream_input.rb
CHANGED
@@ -50,7 +50,7 @@ class Yahns::StreamInput # :nodoc:
|
|
50
50
|
rv << @rbuf
|
51
51
|
to_read -= @rbuf.size
|
52
52
|
end
|
53
|
-
@rbuf.
|
53
|
+
@rbuf.clear
|
54
54
|
end
|
55
55
|
rv = nil if rv.empty? && length != 0
|
56
56
|
else
|
@@ -137,7 +137,7 @@ class Yahns::StreamInput # :nodoc:
|
|
137
137
|
dst << @rbuf
|
138
138
|
end
|
139
139
|
ensure
|
140
|
-
@rbuf.
|
140
|
+
@rbuf.clear
|
141
141
|
end
|
142
142
|
|
143
143
|
def eof!
|
@@ -44,8 +44,12 @@ class TestExtrasAutoindex < Testcase
|
|
44
44
|
|
45
45
|
res = http.request(Net::HTTP::Get.new("/"))
|
46
46
|
assert_equal 200, res.code.to_i
|
47
|
+
refute_match %r{\.\./}, res.body, "top level should not link to parent"
|
47
48
|
assert_match %r{foo}, res.body
|
48
|
-
|
49
|
+
|
50
|
+
res = http.request(Net::HTTP::Get.new("/bar/"))
|
51
|
+
assert_equal 200, res.code.to_i
|
52
|
+
assert_match %r{\.\./}, res.body, "link to parent present"
|
49
53
|
end
|
50
54
|
ensure
|
51
55
|
quit_wait pid
|
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.
|
4
|
+
version: 1.4.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-
|
11
|
+
date: 2014-11-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kgio
|
@@ -225,7 +225,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
225
225
|
version: '0'
|
226
226
|
requirements: []
|
227
227
|
rubyforge_project:
|
228
|
-
rubygems_version: 2.
|
228
|
+
rubygems_version: 2.4.3
|
229
229
|
signing_key:
|
230
230
|
specification_version: 4
|
231
231
|
summary: sleepy, multi-threaded, non-blocking application server
|