jubilee 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.travis.yml +5 -0
- data/CHANGELOG +5 -0
- data/Gemfile +4 -2
- data/Gemfile.lock +47 -8
- data/README.md +2 -0
- data/VERSION +1 -1
- data/java/src/jubilee/JubileeService.java +1 -2
- data/java/src/org/jruby/jubilee/Const.java +135 -131
- data/java/src/org/jruby/jubilee/RackApplication.java +12 -8
- data/java/src/org/jruby/jubilee/RackResponse.java +0 -2
- data/java/src/org/jruby/jubilee/Server.java +15 -7
- data/java/src/org/jruby/jubilee/impl/DefaultRackEnvironment.java +71 -71
- data/java/src/org/jruby/jubilee/impl/RubyIORackInput.java +171 -135
- data/jubilee.gemspec +100 -0
- data/lib/jubilee/configuration.rb +25 -14
- data/lib/jubilee/jubilee.jar +0 -0
- data/lib/jubilee/server.rb +1 -2
- data/test/jubilee/{test_persistent.rb → test_response.rb} +28 -2
- data/test/jubilee/test_server.rb +1 -1
- data/test/jubilee/test_upload.rb +298 -0
- data/test/test_helper.rb +32 -0
- metadata +12 -9
data/.travis.yml
ADDED
data/CHANGELOG
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,21 @@
|
|
1
1
|
GEM
|
2
|
+
remote: https://rubygems.org/
|
2
3
|
specs:
|
4
|
+
addressable (2.3.5)
|
5
|
+
builder (3.2.2)
|
3
6
|
coderay (1.0.8)
|
4
|
-
|
7
|
+
faraday (0.8.7)
|
8
|
+
multipart-post (~> 1.1)
|
9
|
+
ffi (1.9.0)
|
10
|
+
ffi (1.9.0-java)
|
11
|
+
git (1.2.6)
|
12
|
+
github_api (0.10.1)
|
13
|
+
addressable
|
14
|
+
faraday (~> 0.8.1)
|
15
|
+
hashie (>= 1.2)
|
16
|
+
multi_json (~> 1.4)
|
17
|
+
nokogiri (~> 1.5.2)
|
18
|
+
oauth2
|
5
19
|
guard (1.5.4)
|
6
20
|
listen (>= 0.4.2)
|
7
21
|
lumberjack (>= 1.0.2)
|
@@ -9,28 +23,53 @@ GEM
|
|
9
23
|
thor (>= 0.14.6)
|
10
24
|
guard-minitest (0.5.0)
|
11
25
|
guard (>= 0.4)
|
12
|
-
|
26
|
+
hashie (2.0.5)
|
27
|
+
highline (1.6.19)
|
28
|
+
httpauth (0.2.0)
|
29
|
+
jeweler (1.8.7)
|
30
|
+
builder
|
13
31
|
bundler (~> 1.0)
|
14
32
|
git (>= 1.2.5)
|
33
|
+
github_api (= 0.10.1)
|
34
|
+
highline (>= 1.6.15)
|
35
|
+
nokogiri (= 1.5.10)
|
15
36
|
rake
|
16
37
|
rdoc
|
17
|
-
json (1.
|
38
|
+
json (1.8.0-java)
|
39
|
+
jwt (0.1.8)
|
40
|
+
multi_json (>= 1.5)
|
18
41
|
listen (0.5.3)
|
19
42
|
lumberjack (1.0.2)
|
20
43
|
method_source (0.8.1)
|
44
|
+
multi_json (1.8.0)
|
45
|
+
multi_xml (0.5.5)
|
21
46
|
multipart-post (1.1.5)
|
47
|
+
nokogiri (1.5.10-java)
|
48
|
+
oauth2 (0.9.2)
|
49
|
+
faraday (~> 0.8)
|
50
|
+
httpauth (~> 0.2)
|
51
|
+
jwt (~> 0.1.4)
|
52
|
+
multi_json (~> 1.0)
|
53
|
+
multi_xml (~> 0.5)
|
54
|
+
rack (~> 1.2)
|
55
|
+
pry (0.9.10)
|
56
|
+
coderay (~> 1.0.5)
|
57
|
+
method_source (~> 0.8)
|
58
|
+
slop (~> 3.3.1)
|
22
59
|
pry (0.9.10-java)
|
23
60
|
coderay (~> 1.0.5)
|
24
61
|
method_source (~> 0.8)
|
25
62
|
slop (~> 3.3.1)
|
26
63
|
spoon (~> 0.0)
|
27
64
|
rack (1.4.5)
|
28
|
-
rake (10.0
|
65
|
+
rake (10.1.0)
|
66
|
+
rcov (0.9.11)
|
29
67
|
rcov (0.9.11-java)
|
30
|
-
rdoc (
|
68
|
+
rdoc (4.0.1)
|
31
69
|
json (~> 1.4)
|
32
70
|
slop (3.3.3)
|
33
|
-
spoon (0.0.
|
71
|
+
spoon (0.0.4)
|
72
|
+
ffi
|
34
73
|
thor (0.16.0)
|
35
74
|
|
36
75
|
PLATFORMS
|
@@ -42,6 +81,6 @@ DEPENDENCIES
|
|
42
81
|
jeweler
|
43
82
|
multipart-post
|
44
83
|
pry
|
45
|
-
rack (
|
84
|
+
rack (>= 1.4.1)
|
46
85
|
rcov
|
47
|
-
spoon
|
86
|
+
spoon (~> 0.0.4)
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.4.
|
1
|
+
0.4.1
|
@@ -1,13 +1,12 @@
|
|
1
1
|
package jubilee;
|
2
2
|
|
3
3
|
import org.jruby.Ruby;
|
4
|
+
import org.jruby.jubilee.Server;
|
4
5
|
import org.jruby.jubilee.impl.NullIO;
|
5
6
|
import org.jruby.jubilee.impl.RubyIORackErrors;
|
6
7
|
import org.jruby.jubilee.impl.RubyIORackInput;
|
7
8
|
import org.jruby.runtime.load.BasicLibraryService;
|
8
9
|
|
9
|
-
import org.jruby.jubilee.Server;
|
10
|
-
|
11
10
|
import java.io.IOException;
|
12
11
|
|
13
12
|
public class JubileeService implements BasicLibraryService {
|
@@ -14,135 +14,139 @@ import java.util.Map;
|
|
14
14
|
*/
|
15
15
|
public final class Const {
|
16
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
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
public static
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
ADDITIONAL_HEADERS
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
17
|
+
public static final String JUBILEE_VERSION = "Jubilee 0.1.0";
|
18
|
+
public static final String HTTP_11 = "HTTP/1.1";
|
19
|
+
public static final String HTTP_10 = "HTTP/1.0";
|
20
|
+
|
21
|
+
public static final String SERVER_SOFTWARE = "SERVER_SOFTWARE";
|
22
|
+
public static final String SERVER_PROTOCOL = "SERVER_PROTOCOL";
|
23
|
+
public static final String GATEWAY_INTERFACE = "GATEWAY_INTERFACE";
|
24
|
+
public static final String SERVER_NAME = "SERVER_NAME";
|
25
|
+
public static final String SERVER_PORT = "SERVER_PORT";
|
26
|
+
|
27
|
+
public static final String CGI_VER = "CGI/1.2";
|
28
|
+
|
29
|
+
public static final String RACK_INPUT = "rack.input";
|
30
|
+
|
31
|
+
public static final String REQUEST_METHOD = "REQUEST_METHOD";
|
32
|
+
public static final String GET = "GET";
|
33
|
+
public static final String POST = "POST";
|
34
|
+
public static final String REQUEST_PATH = "REQUEST_PATH";
|
35
|
+
public static final String REQUEST_URI = "REQUEST_URI";
|
36
|
+
public static final String PATH_INFO = "PATH_INFO";
|
37
|
+
public static final String QUERY_STRING = "QUERY_STRING";
|
38
|
+
public static final String LOCALHOST = "localhost";
|
39
|
+
public static final String PORT_80 = "80";
|
40
|
+
|
41
|
+
public static final String REMOTE_ADDR = "REMOTE_ADDR";
|
42
|
+
public static final String HTTP_HOST = "HTTP_HOST";
|
43
|
+
public static final String HTTP_USER_AGENT = "HTTP_USER_AGENT";
|
44
|
+
public static final String HTTP_ACCEPT = "HTTP_ACCEPT";
|
45
|
+
public static final String HTTP_COOKIE = "HTTP_COOKIE";
|
46
|
+
public static final String HTTP_ACCEPT_LANGUAGE = "HTTP_ACCEPT_LANGUAGE";
|
47
|
+
public static final String HTTP_ACCEPT_ENCODING = "HTTP_ACCEPT_ENCODING";
|
48
|
+
public static final String HTTP_CONNECTION = "HTTP_CONNECTION";
|
49
|
+
public static final String HTTP_CONTENT_TYPE = "CONTENT_TYPE";
|
50
|
+
public static final String HTTP_CONTENT_LENGTH = "CONTENT_LENGTH";
|
51
|
+
|
52
|
+
public static class Rack {
|
53
|
+
public static final String HTTP_DATE = "HTTP_DATE";
|
54
|
+
public static final String HTTP_EXPECT = "HTTP_EXPECT";
|
55
|
+
public static final String HTTP_IF_MATCH = "HTTP_IF_MATCH";
|
56
|
+
public static final String HTTP_IF_MODIFIED_SINCE = "HTTP_IF_MODIFIED_SINCE";
|
57
|
+
public static final String HTTP_IF_NONE_MATCH = "HTTP_IF_NONE_MATCH";
|
58
|
+
public static final String HTTP_IF_RANGE = "HTTP_IF_RANGE";
|
59
|
+
public static final String HTTP_IF_UNMODIFIED_SINCE = "HTTP_IF_UNMODIFIED_SINCE";
|
60
|
+
public static final String HTTP_RANGE = "HTTP_RANGE";
|
61
|
+
public static final String HTTP_PRAGMA = "HTTP_PRAGMA";
|
62
|
+
public static final String HTTP_MAX_FORWARDS = "HTTP_MAX_FORWARDS";
|
63
|
+
public static final String HTTP_REFERER = "HTTP_REFERER";
|
64
|
+
public static final String HTTP_VIA = "HTTP_VIA";
|
65
|
+
public static final String HTTP_WARNING = "HTTP_WARNING";
|
66
|
+
|
67
|
+
public static final String HTTP_X_REQUESTED_WITH = "HTTP_X_REQUESTED_WITH"; // xhr
|
68
|
+
public static final String HTTP_DNT = "HTTP_DNT"; // do-not-track
|
69
|
+
public static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"; // original ip
|
70
|
+
|
71
|
+
public static final String HTTP_CONTENT_MD5 = "HTTP_CONTENT_MD5";
|
72
|
+
}
|
73
|
+
|
74
|
+
public static class Vertx {
|
75
|
+
// all lower case since vertx has converted them
|
76
|
+
public static final String COOKIE = "cookie";
|
77
|
+
public static final String USER_AGENT = "user-agent";
|
78
|
+
public static final String ACCEPT = "accept";
|
79
|
+
public static final String ACCEPT_LANGUAGE = "accept-language";
|
80
|
+
public static final String ACCEPT_ENCODING = "accept-encoding";
|
81
|
+
public static final String CONNECTION = "connection";
|
82
|
+
public static final String CONTENT_TYPE = "content-type";
|
83
|
+
public static final String CONTENT_LENGTH = "content-length";
|
84
|
+
public static final String CONTENT_MD5 = "content-md5";
|
85
|
+
public static final String HOST = "host";
|
86
|
+
|
87
|
+
public static final String DATE = "date";
|
88
|
+
public static final String EXPECT = "expect";
|
89
|
+
public static final String IF_MATCH = "if-match";
|
90
|
+
public static final String IF_MODIFIED_SINCE = "if-modified-since";
|
91
|
+
public static final String IF_NONE_MATCH = "if-none-match";
|
92
|
+
public static final String IF_RANGE = "if-range";
|
93
|
+
public static final String IF_UNMODIFIED_SINCE = "if-unmodified-since";
|
94
|
+
public static final String RANGE = "range";
|
95
|
+
public static final String PRAGMA = "pragma";
|
96
|
+
public static final String MAX_FORWARDS = "max-forwards";
|
97
|
+
public static final String REFERER = "referer";
|
98
|
+
public static final String VIA = "via";
|
99
|
+
public static final String WARNING = "warning";
|
100
|
+
|
101
|
+
// Non-standard request headers http://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Common_non-standard_request_headers
|
102
|
+
public static final String X_REQUESTED_WITH = "x-requested-with"; // xhr
|
103
|
+
public static final String DNT = "dnt"; // do-not-track
|
104
|
+
public static final String X_FORWARDED_FOR = "x-forwarded-for"; // original ip
|
105
|
+
}
|
106
|
+
|
107
|
+
public static Map<String, String> ADDITIONAL_HEADERS = new HashMap<String, String>();
|
108
|
+
|
109
|
+
static {
|
110
|
+
ADDITIONAL_HEADERS.put(Vertx.DATE, Rack.HTTP_DATE);
|
111
|
+
ADDITIONAL_HEADERS.put(Vertx.EXPECT, Rack.HTTP_EXPECT);
|
112
|
+
ADDITIONAL_HEADERS.put(Vertx.IF_MATCH, Rack.HTTP_IF_MATCH);
|
113
|
+
ADDITIONAL_HEADERS.put(Vertx.IF_MODIFIED_SINCE, Rack.HTTP_IF_MODIFIED_SINCE);
|
114
|
+
ADDITIONAL_HEADERS.put(Vertx.IF_NONE_MATCH, Rack.HTTP_IF_NONE_MATCH);
|
115
|
+
ADDITIONAL_HEADERS.put(Vertx.IF_RANGE, Rack.HTTP_IF_RANGE);
|
116
|
+
ADDITIONAL_HEADERS.put(Vertx.IF_UNMODIFIED_SINCE, Rack.HTTP_IF_UNMODIFIED_SINCE);
|
117
|
+
ADDITIONAL_HEADERS.put(Vertx.RANGE, Rack.HTTP_RANGE);
|
118
|
+
ADDITIONAL_HEADERS.put(Vertx.PRAGMA, Rack.HTTP_PRAGMA);
|
119
|
+
ADDITIONAL_HEADERS.put(Vertx.MAX_FORWARDS, Rack.HTTP_MAX_FORWARDS);
|
120
|
+
ADDITIONAL_HEADERS.put(Vertx.REFERER, Rack.HTTP_REFERER);
|
121
|
+
ADDITIONAL_HEADERS.put(Vertx.VIA, Rack.HTTP_VIA);
|
122
|
+
ADDITIONAL_HEADERS.put(Vertx.WARNING, Rack.HTTP_WARNING);
|
123
|
+
ADDITIONAL_HEADERS.put(Vertx.X_REQUESTED_WITH, Rack.HTTP_X_REQUESTED_WITH);
|
124
|
+
ADDITIONAL_HEADERS.put(Vertx.DNT, Rack.HTTP_DNT);
|
125
|
+
ADDITIONAL_HEADERS.put(Vertx.X_FORWARDED_FOR, Rack.HTTP_X_FORWARDED_FOR);
|
126
|
+
ADDITIONAL_HEADERS.put(Vertx.CONTENT_MD5, Rack.HTTP_CONTENT_MD5);
|
127
|
+
}
|
128
|
+
|
129
|
+
public static RubyArray RackVersion(Ruby runtime) {
|
130
|
+
RubyArray version = RubyArray.newArray(runtime, 2);
|
131
|
+
version.add("1");
|
132
|
+
version.add("4");
|
133
|
+
return version;
|
134
|
+
}
|
135
|
+
|
136
|
+
public static final String HTTP = "http";
|
137
|
+
public static final String HTTPS = "https";
|
138
|
+
public static final String URL_SCHEME = "rack.url_scheme";
|
139
|
+
public static final String RACK_VERSION = "rack.version";
|
140
|
+
public static final String RACK_ERRORS = "rack.errors";
|
141
|
+
public static final String RACK_MULTITHREAD = "rack.multithread";
|
142
|
+
public static final String RACK_MULTIPROCESS = "rack.multiprocess";
|
143
|
+
public static final String RACK_RUNONCE = "rack.run_once";
|
144
|
+
public static final String SCRIPT_NAME = "SCRIPT_NAME";
|
145
|
+
|
146
|
+
private Const() {
|
147
|
+
}
|
148
|
+
|
149
|
+
// Internal
|
150
|
+
public static final String END_OF_BODY = "__EOF__";
|
151
|
+
public static final byte EOL = '\n';
|
148
152
|
}
|
@@ -1,5 +1,7 @@
|
|
1
1
|
package org.jruby.jubilee;
|
2
2
|
|
3
|
+
import io.netty.buffer.ByteBuf;
|
4
|
+
import io.netty.buffer.Unpooled;
|
3
5
|
import org.jruby.Ruby;
|
4
6
|
import org.jruby.javasupport.JavaEmbedUtils;
|
5
7
|
import org.jruby.jubilee.impl.DefaultRackEnvironment;
|
@@ -10,7 +12,9 @@ import org.vertx.java.core.VoidHandler;
|
|
10
12
|
import org.vertx.java.core.buffer.Buffer;
|
11
13
|
import org.vertx.java.core.http.HttpServerRequest;
|
12
14
|
|
13
|
-
import java.util.concurrent
|
15
|
+
import java.util.concurrent.ExecutorService;
|
16
|
+
import java.util.concurrent.Executors;
|
17
|
+
import java.util.concurrent.atomic.AtomicBoolean;
|
14
18
|
|
15
19
|
/**
|
16
20
|
* Created with IntelliJ IDEA.
|
@@ -24,27 +28,27 @@ public class RackApplication {
|
|
24
28
|
|
25
29
|
private ExecutorService exec;
|
26
30
|
|
27
|
-
public RackApplication(IRubyObject app, boolean ssl) {
|
31
|
+
public RackApplication(IRubyObject app, boolean ssl, int numberOfWorkers) {
|
28
32
|
this.app = app;
|
29
33
|
this.ssl = ssl;
|
30
|
-
exec = Executors.
|
34
|
+
exec = Executors.newFixedThreadPool(numberOfWorkers);
|
31
35
|
}
|
32
36
|
|
33
37
|
public void call(final HttpServerRequest request) {
|
34
|
-
final
|
38
|
+
final ByteBuf bodyBuf = Unpooled.unreleasableBuffer(Unpooled.buffer(0, Integer.MAX_VALUE));
|
35
39
|
final Ruby runtime = app.getRuntime();
|
36
|
-
final
|
40
|
+
final AtomicBoolean eof = new AtomicBoolean(false);
|
37
41
|
request.dataHandler(new Handler<Buffer>() {
|
38
42
|
@Override
|
39
43
|
public void handle(Buffer buffer) {
|
40
|
-
bodyBuf.
|
44
|
+
bodyBuf.writeBytes(buffer.getBytes());
|
41
45
|
}
|
42
46
|
});
|
43
47
|
// TODO optimize by use NullIO when there is no body here.
|
44
48
|
Runnable task = new Runnable() {
|
45
49
|
@Override
|
46
50
|
public void run() {
|
47
|
-
RackInput input = new RubyIORackInput(runtime, bodyBuf,
|
51
|
+
RackInput input = new RubyIORackInput(runtime, request, bodyBuf, eof);
|
48
52
|
RackEnvironment env = new DefaultRackEnvironment(runtime, request, input, ssl);
|
49
53
|
IRubyObject result = app.callMethod(runtime.getCurrentContext(), "call", env.getEnv());
|
50
54
|
RackResponse response = (RackResponse) JavaEmbedUtils.rubyToJava(runtime, result, RackResponse.class);
|
@@ -55,7 +59,7 @@ public class RackApplication {
|
|
55
59
|
request.endHandler(new VoidHandler() {
|
56
60
|
@Override
|
57
61
|
protected void handle() {
|
58
|
-
|
62
|
+
eof.set(true);
|
59
63
|
}
|
60
64
|
});
|
61
65
|
}
|