bossan 0.4.2 → 0.4.3
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/CHANGELOG.md +6 -0
- data/README.md +8 -3
- data/examples/inifinity.rb +17 -0
- data/ext/bossan/bossan_ext.c +20 -17
- data/lib/bossan/version.rb +1 -1
- data/test/test_rack_chunk_response.rb +1 -15
- data/test/test_rack_env_simple_get.rb +2 -6
- data/test/test_rack_env_simple_query.rb +2 -5
- data/test/test_rack_err_spec.rb +1 -16
- data/test/test_rack_evil.rb +1 -15
- data/test/test_rack_spec.rb +1 -15
- data/test/util.rb +14 -0
- metadata +4 -3
- data/examples/uploads.rb +0 -55
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e969be8e7c6867dcf66c449d02c4972699230b18
|
4
|
+
data.tar.gz: 2ac87fd5dc7533b0d48ef502223c6bb3f4406033
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 09880b9fd1622640b6f1eaada5e2b6d62c1f282fa5f0e0810495bc7a7bd4cfa8362318bc753b9c679c6466f26dea164e0dd3fae5d5d5df1cf1c5c1cea929aed8
|
7
|
+
data.tar.gz: 9c042fb1d4d6593a237883af46d14bbeb72e03a4ef095295420a62ae310a4f77c5a0969f61b38b5b4e9feb5a36b65d322122d0f4f540c167ca6c1e3a43dc7dbf
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
[](http://travis-ci.org/kubo39/bossan)
|
4
4
|
|
5
|
-
Bossan is a high performance asynchronous ruby's rack
|
5
|
+
Bossan is a high performance asynchronous ruby's rack web server.
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
@@ -12,16 +12,17 @@ Bossan supports Linux, FreeBSD and MacOSX(need gcc>=4.2).
|
|
12
12
|
|
13
13
|
## Installation
|
14
14
|
|
15
|
-
from rubygems
|
15
|
+
Install from rubygems:
|
16
16
|
|
17
17
|
`gem install bossan`
|
18
18
|
|
19
|
-
from source(github)
|
19
|
+
Install from source(github):
|
20
20
|
|
21
21
|
```
|
22
22
|
git clone git://github.com/kubo39/bossan.git
|
23
23
|
cd bossan
|
24
24
|
rake
|
25
|
+
rake install
|
25
26
|
```
|
26
27
|
|
27
28
|
## Usage
|
@@ -45,6 +46,10 @@ Bossan.run(proc {|env|
|
|
45
46
|
})
|
46
47
|
```
|
47
48
|
|
49
|
+
with rackup:
|
50
|
+
|
51
|
+
`$ rackup config.ru -s bossan`
|
52
|
+
|
48
53
|
## Contributing
|
49
54
|
|
50
55
|
1. Fork it
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_relative '../lib/bossan'
|
2
|
+
|
3
|
+
|
4
|
+
app = lambda do |env|
|
5
|
+
body = (1..Float::INFINITY).lazy.map(&:to_s)
|
6
|
+
[
|
7
|
+
200, # Status code
|
8
|
+
{ # Response headers
|
9
|
+
'Content-Type' => 'text/html',
|
10
|
+
},
|
11
|
+
body # Response body
|
12
|
+
]
|
13
|
+
end
|
14
|
+
|
15
|
+
Bossan.set_keepalive(10)
|
16
|
+
Bossan.listen('127.0.0.1', 8000)
|
17
|
+
Bossan.run(app)
|
data/ext/bossan/bossan_ext.c
CHANGED
@@ -23,7 +23,7 @@
|
|
23
23
|
#define CRLF "\r\n"
|
24
24
|
#define DELIM ": "
|
25
25
|
|
26
|
-
#define SERVER "bossan/0.4.
|
26
|
+
#define SERVER "bossan/0.4.3"
|
27
27
|
|
28
28
|
#define H_MSG_500 "HTTP/1.0 500 Internal Server Error\r\nContent-Type: text/html\r\nServer: " SERVER "\r\n\r\n"
|
29
29
|
|
@@ -701,12 +701,15 @@ write_headers(client_t *client, char *data, size_t datalen)
|
|
701
701
|
}
|
702
702
|
|
703
703
|
|
704
|
-
|
704
|
+
response_status
|
705
705
|
close_response(client_t *client)
|
706
706
|
{
|
707
|
-
|
708
|
-
|
709
|
-
|
707
|
+
if (!client->response_closed) {
|
708
|
+
//send all response
|
709
|
+
//closing reponse object
|
710
|
+
client->response_closed = 1;
|
711
|
+
}
|
712
|
+
return STATUS_OK;
|
710
713
|
}
|
711
714
|
|
712
715
|
|
@@ -784,21 +787,21 @@ processs_write(client_t *client)
|
|
784
787
|
break;
|
785
788
|
}
|
786
789
|
}
|
790
|
+
}
|
787
791
|
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
}
|
795
|
-
set_last_chunked_data(bucket);
|
796
|
-
writev_bucket(bucket);
|
797
|
-
free_write_bucket(bucket);
|
792
|
+
if(client->chunked_response){
|
793
|
+
DEBUG("write last chunk");
|
794
|
+
//last packet
|
795
|
+
bucket = new_write_bucket(client->fd, 3);
|
796
|
+
if(bucket == NULL){
|
797
|
+
return STATUS_ERROR;
|
798
798
|
}
|
799
|
-
|
799
|
+
set_last_chunked_data(bucket);
|
800
|
+
writev_bucket(bucket);
|
801
|
+
free_write_bucket(bucket);
|
802
|
+
return close_response(client);
|
800
803
|
}
|
801
|
-
return
|
804
|
+
return close_response(client);
|
802
805
|
}
|
803
806
|
|
804
807
|
|
data/lib/bossan/version.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative '../lib/bossan'
|
2
|
+
require_relative './util'
|
2
3
|
require 'minitest/unit'
|
3
4
|
require 'test/unit/testcase'
|
4
5
|
require 'uri'
|
5
|
-
require 'net/http'
|
6
6
|
|
7
7
|
|
8
8
|
DEFAULT_HOST = "localhost"
|
@@ -38,20 +38,6 @@ class RackChunkResponseTest < Test::Unit::TestCase
|
|
38
38
|
end
|
39
39
|
|
40
40
|
|
41
|
-
def server_is_wake_up? n=100
|
42
|
-
n.times {
|
43
|
-
begin
|
44
|
-
Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT)
|
45
|
-
rescue
|
46
|
-
next
|
47
|
-
end
|
48
|
-
$stderr.puts "*** running success ***"
|
49
|
-
return true
|
50
|
-
}
|
51
|
-
return false
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
41
|
begin
|
56
42
|
$stderr.puts RUBY_DESCRIPTION
|
57
43
|
|
@@ -22,8 +22,7 @@ class RackEnvSimpleGetTest < Test::Unit::TestCase
|
|
22
22
|
# I have no idea how to check this two values..
|
23
23
|
@env.delete "rack.input"
|
24
24
|
@env.delete "rack.errors"
|
25
|
-
|
26
|
-
w.write @env
|
25
|
+
w.write Marshal.dump(@env)
|
27
26
|
w.close
|
28
27
|
body = RESPONSE
|
29
28
|
[200,
|
@@ -43,12 +42,9 @@ class RackEnvSimpleGetTest < Test::Unit::TestCase
|
|
43
42
|
}
|
44
43
|
|
45
44
|
w.close
|
46
|
-
env = r.read
|
45
|
+
env = Marshal.load(r.read)
|
47
46
|
r.close
|
48
47
|
|
49
|
-
env = eval "Hash[" + env + "]"
|
50
|
-
# pp env
|
51
|
-
|
52
48
|
assert_equal(env["PATH_INFO"], "/")
|
53
49
|
assert_equal(env["SCRIPT_NAME"], "")
|
54
50
|
assert_equal(env["QUERY_STRING"], "")
|
@@ -22,7 +22,7 @@ class RackEnvSimpleQueryTest < Test::Unit::TestCase
|
|
22
22
|
# I have no idea how to check this two values..
|
23
23
|
@env.delete "rack.input"
|
24
24
|
@env.delete "rack.errors"
|
25
|
-
w.write @env
|
25
|
+
w.write Marshal.dump(@env)
|
26
26
|
w.close
|
27
27
|
body = RESPONSE
|
28
28
|
[200,
|
@@ -42,12 +42,9 @@ class RackEnvSimpleQueryTest < Test::Unit::TestCase
|
|
42
42
|
}
|
43
43
|
|
44
44
|
w.close
|
45
|
-
env = r.read
|
45
|
+
env = Marshal.load(r.read)
|
46
46
|
r.close
|
47
47
|
|
48
|
-
# env = eval "Hash[" + env.gsub("\"", "'") + "]"
|
49
|
-
env = eval "Hash[" + env + "]"
|
50
|
-
|
51
48
|
assert_equal(env["PATH_INFO"], "/ABC/DEF")
|
52
49
|
assert_equal(env["QUERY_STRING"], "a=1234&bbbb=ccc")
|
53
50
|
ensure
|
data/test/test_rack_err_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require_relative '../lib/bossan'
|
2
|
+
require_relative './util'
|
2
3
|
require 'minitest/unit'
|
3
4
|
require 'test/unit/testcase'
|
4
|
-
require 'net/http'
|
5
5
|
|
6
6
|
|
7
7
|
DEFAULT_HOST = "localhost"
|
@@ -34,21 +34,6 @@ class RackErrSpecTest < Test::Unit::TestCase
|
|
34
34
|
end
|
35
35
|
|
36
36
|
|
37
|
-
def server_is_wake_up? n=100
|
38
|
-
n.times {
|
39
|
-
begin
|
40
|
-
Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT)
|
41
|
-
rescue
|
42
|
-
next
|
43
|
-
end
|
44
|
-
$stderr.puts "*** running success ***"
|
45
|
-
return true
|
46
|
-
}
|
47
|
-
return false
|
48
|
-
end
|
49
|
-
|
50
|
-
|
51
|
-
|
52
37
|
begin
|
53
38
|
$stderr.puts RUBY_DESCRIPTION
|
54
39
|
pid = fork do
|
data/test/test_rack_evil.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative '../lib/bossan'
|
2
|
+
require_relative './util'
|
2
3
|
require 'minitest/unit'
|
3
4
|
require 'test/unit/testcase'
|
4
5
|
require 'socket'
|
5
|
-
require 'net/http'
|
6
6
|
|
7
7
|
|
8
8
|
ASSERT_RESPONSE = "Hello world!"
|
@@ -93,20 +93,6 @@ class BadHttpMethodTest < Test::Unit::TestCase
|
|
93
93
|
end
|
94
94
|
|
95
95
|
|
96
|
-
def server_is_wake_up? n=100
|
97
|
-
n.times {
|
98
|
-
begin
|
99
|
-
Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT)
|
100
|
-
rescue
|
101
|
-
next
|
102
|
-
end
|
103
|
-
$stderr.puts "*** running success ***"
|
104
|
-
return true
|
105
|
-
}
|
106
|
-
return false
|
107
|
-
end
|
108
|
-
|
109
|
-
|
110
96
|
begin
|
111
97
|
$stderr.puts RUBY_DESCRIPTION
|
112
98
|
|
data/test/test_rack_spec.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
require_relative '../lib/bossan'
|
2
|
+
require_relative './util'
|
2
3
|
require 'minitest/unit'
|
3
4
|
require 'test/unit/testcase'
|
4
5
|
require 'uri'
|
5
|
-
require 'net/http'
|
6
6
|
|
7
7
|
|
8
8
|
DEFAULT_HOST = "localhost"
|
@@ -45,20 +45,6 @@ class RackSpecTest < Test::Unit::TestCase
|
|
45
45
|
end
|
46
46
|
|
47
47
|
|
48
|
-
def server_is_wake_up? n=100
|
49
|
-
n.times {
|
50
|
-
begin
|
51
|
-
Net::HTTP.start(DEFAULT_HOST, DEFAULT_PORT)
|
52
|
-
rescue
|
53
|
-
next
|
54
|
-
end
|
55
|
-
$stderr.puts "*** running success ***"
|
56
|
-
return true
|
57
|
-
}
|
58
|
-
return false
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
48
|
begin
|
63
49
|
$stderr.puts RUBY_DESCRIPTION
|
64
50
|
pid = fork do
|
data/test/util.rb
ADDED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bossan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hiroki Noda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -49,8 +49,8 @@ files:
|
|
49
49
|
- examples/config.ru
|
50
50
|
- examples/fork_sample.rb
|
51
51
|
- examples/hello.rb
|
52
|
+
- examples/inifinity.rb
|
52
53
|
- examples/sinatra_app.rb
|
53
|
-
- examples/uploads.rb
|
54
54
|
- examples/views/index.haml
|
55
55
|
- examples/views_sample.rb
|
56
56
|
- ext/bossan/bossan.h
|
@@ -78,6 +78,7 @@ files:
|
|
78
78
|
- test/test_rack_err_spec.rb
|
79
79
|
- test/test_rack_evil.rb
|
80
80
|
- test/test_rack_spec.rb
|
81
|
+
- test/util.rb
|
81
82
|
homepage: https://github.com/kubo39/bossan
|
82
83
|
licenses:
|
83
84
|
- BSD
|
data/examples/uploads.rb
DELETED
@@ -1,55 +0,0 @@
|
|
1
|
-
require_relative '../lib/bossan'
|
2
|
-
require 'rack'
|
3
|
-
require 'tempfile'
|
4
|
-
|
5
|
-
|
6
|
-
def view_file req
|
7
|
-
tempfile = Tempfile.new('raw-upload.')
|
8
|
-
req.env['rack.input'].each do |chunk|
|
9
|
-
if chunk.respond_to?(:force_encoding)
|
10
|
-
tempfile << chunk.force_encoding('UTF-8')
|
11
|
-
else
|
12
|
-
tempfile << chunk
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
req.env['rack.input'].rewind
|
17
|
-
|
18
|
-
tempfile.flush
|
19
|
-
tempfile.rewind
|
20
|
-
|
21
|
-
return Rack::Response.new(tempfile,
|
22
|
-
200,
|
23
|
-
{ "Content-Length" => req.env["CONTENT_LENGTH"],
|
24
|
-
"Content-Type" => 'image/jpeg'})
|
25
|
-
end
|
26
|
-
|
27
|
-
|
28
|
-
def upload_file req
|
29
|
-
return Rack::Response.new([<<-EOF
|
30
|
-
<h1>Upload File</h1>
|
31
|
-
<form action="" method="post" enctype="multipart/form-data">
|
32
|
-
<input type="file" name="uploaded_file"><input type="submit" value="Upload">
|
33
|
-
</form>
|
34
|
-
EOF
|
35
|
-
],
|
36
|
-
200,
|
37
|
-
)
|
38
|
-
end
|
39
|
-
|
40
|
-
|
41
|
-
app = ->(env) {
|
42
|
-
req = Rack::Request.new(env)
|
43
|
-
resp = if req.request_method == 'POST'
|
44
|
-
view_file req
|
45
|
-
else
|
46
|
-
upload_file req
|
47
|
-
end
|
48
|
-
# p resp
|
49
|
-
return resp
|
50
|
-
}
|
51
|
-
|
52
|
-
|
53
|
-
Bossan.set_max_content_length(1024 * 1024 * 1024)
|
54
|
-
Bossan.listen('localhost', 8000)
|
55
|
-
Bossan.run(app)
|