rsense-server 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +14 -0
  4. data/Guardfile +5 -0
  5. data/LICENSE.txt +1 -0
  6. data/README.md +51 -0
  7. data/Rakefile +9 -0
  8. data/bin/_rsense.rb +115 -0
  9. data/config/puma.rb +2 -0
  10. data/lib/rsense/server/code.rb +38 -0
  11. data/lib/rsense/server/command/completion_result.rb +11 -0
  12. data/lib/rsense/server/command/special_meth.rb +18 -0
  13. data/lib/rsense/server/command/type_inference_method.rb +24 -0
  14. data/lib/rsense/server/command.rb +239 -0
  15. data/lib/rsense/server/config.rb +70 -0
  16. data/lib/rsense/server/gem_path.rb +18 -0
  17. data/lib/rsense/server/listeners/find_definition_event_listener.rb +91 -0
  18. data/lib/rsense/server/listeners/where_event_listener.rb +39 -0
  19. data/lib/rsense/server/load_path.rb +62 -0
  20. data/lib/rsense/server/options.rb +85 -0
  21. data/lib/rsense/server/parser.rb +17 -0
  22. data/lib/rsense/server/path_info.rb +17 -0
  23. data/lib/rsense/server/project.rb +24 -0
  24. data/lib/rsense/server/version.rb +5 -0
  25. data/lib/rsense/server.rb +18 -0
  26. data/rsense-server.gemspec +35 -0
  27. data/spec/fixtures/config_fixture/.rsense +4 -0
  28. data/spec/fixtures/deeply/nested/thing.rb +0 -0
  29. data/spec/fixtures/find_def_sample.json +10 -0
  30. data/spec/fixtures/sample.json +10 -0
  31. data/spec/fixtures/test_gem/.gitignore +22 -0
  32. data/spec/fixtures/test_gem/Gemfile +4 -0
  33. data/spec/fixtures/test_gem/LICENSE.txt +22 -0
  34. data/spec/fixtures/test_gem/README.md +29 -0
  35. data/spec/fixtures/test_gem/Rakefile +2 -0
  36. data/spec/fixtures/test_gem/lib/sample/version.rb +3 -0
  37. data/spec/fixtures/test_gem/lib/sample.rb +16 -0
  38. data/spec/fixtures/test_gem/sample.gemspec +23 -0
  39. data/spec/fixtures/test_gem/test.json +10 -0
  40. data/spec/rsense/server/code_spec.rb +44 -0
  41. data/spec/rsense/server/command/special_meth_spec.rb +23 -0
  42. data/spec/rsense/server/command_spec.rb +108 -0
  43. data/spec/rsense/server/config_spec.rb +27 -0
  44. data/spec/rsense/server/gem_path_spec.rb +16 -0
  45. data/spec/rsense/server/load_path_spec.rb +63 -0
  46. data/spec/rsense/server/options_spec.rb +33 -0
  47. data/spec/rsense/server/path_info_spec.rb +11 -0
  48. data/spec/rsense/server/project_spec.rb +18 -0
  49. data/spec/rsense/server_spec.rb +7 -0
  50. data/spec/spec_helper.rb +16 -0
  51. data/vendor/gems/puma-2.8.2-java/COPYING +55 -0
  52. data/vendor/gems/puma-2.8.2-java/DEPLOYMENT.md +92 -0
  53. data/vendor/gems/puma-2.8.2-java/Gemfile +17 -0
  54. data/vendor/gems/puma-2.8.2-java/History.txt +532 -0
  55. data/vendor/gems/puma-2.8.2-java/LICENSE +26 -0
  56. data/vendor/gems/puma-2.8.2-java/Manifest.txt +68 -0
  57. data/vendor/gems/puma-2.8.2-java/README.md +251 -0
  58. data/vendor/gems/puma-2.8.2-java/Rakefile +158 -0
  59. data/vendor/gems/puma-2.8.2-java/bin/puma +10 -0
  60. data/vendor/gems/puma-2.8.2-java/bin/puma-wild +17 -0
  61. data/vendor/gems/puma-2.8.2-java/bin/pumactl +12 -0
  62. data/vendor/gems/puma-2.8.2-java/docs/config.md +0 -0
  63. data/vendor/gems/puma-2.8.2-java/docs/nginx.md +80 -0
  64. data/vendor/gems/puma-2.8.2-java/docs/signals.md +42 -0
  65. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/PumaHttp11Service.java +17 -0
  66. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/ext_help.h +15 -0
  67. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/extconf.rb +8 -0
  68. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.c +1225 -0
  69. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.h +64 -0
  70. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.java.rl +161 -0
  71. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser.rl +146 -0
  72. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/http11_parser_common.rl +54 -0
  73. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/io_buffer.c +155 -0
  74. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/mini_ssl.c +195 -0
  75. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11.java +225 -0
  76. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/Http11Parser.java +488 -0
  77. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/org/jruby/puma/MiniSSL.java +289 -0
  78. data/vendor/gems/puma-2.8.2-java/ext/puma_http11/puma_http11.c +491 -0
  79. data/vendor/gems/puma-2.8.2-java/lib/puma/accept_nonblock.rb +23 -0
  80. data/vendor/gems/puma-2.8.2-java/lib/puma/app/status.rb +59 -0
  81. data/vendor/gems/puma-2.8.2-java/lib/puma/binder.rb +298 -0
  82. data/vendor/gems/puma-2.8.2-java/lib/puma/capistrano.rb +86 -0
  83. data/vendor/gems/puma-2.8.2-java/lib/puma/cli.rb +587 -0
  84. data/vendor/gems/puma-2.8.2-java/lib/puma/client.rb +289 -0
  85. data/vendor/gems/puma-2.8.2-java/lib/puma/cluster.rb +389 -0
  86. data/vendor/gems/puma-2.8.2-java/lib/puma/compat.rb +18 -0
  87. data/vendor/gems/puma-2.8.2-java/lib/puma/configuration.rb +377 -0
  88. data/vendor/gems/puma-2.8.2-java/lib/puma/const.rb +165 -0
  89. data/vendor/gems/puma-2.8.2-java/lib/puma/control_cli.rb +251 -0
  90. data/vendor/gems/puma-2.8.2-java/lib/puma/daemon_ext.rb +25 -0
  91. data/vendor/gems/puma-2.8.2-java/lib/puma/delegation.rb +11 -0
  92. data/vendor/gems/puma-2.8.2-java/lib/puma/detect.rb +4 -0
  93. data/vendor/gems/puma-2.8.2-java/lib/puma/events.rb +130 -0
  94. data/vendor/gems/puma-2.8.2-java/lib/puma/io_buffer.rb +7 -0
  95. data/vendor/gems/puma-2.8.2-java/lib/puma/java_io_buffer.rb +45 -0
  96. data/vendor/gems/puma-2.8.2-java/lib/puma/jruby_restart.rb +83 -0
  97. data/vendor/gems/puma-2.8.2-java/lib/puma/minissl.rb +148 -0
  98. data/vendor/gems/puma-2.8.2-java/lib/puma/null_io.rb +34 -0
  99. data/vendor/gems/puma-2.8.2-java/lib/puma/puma_http11.jar +0 -0
  100. data/vendor/gems/puma-2.8.2-java/lib/puma/rack_default.rb +7 -0
  101. data/vendor/gems/puma-2.8.2-java/lib/puma/rack_patch.rb +45 -0
  102. data/vendor/gems/puma-2.8.2-java/lib/puma/reactor.rb +183 -0
  103. data/vendor/gems/puma-2.8.2-java/lib/puma/runner.rb +146 -0
  104. data/vendor/gems/puma-2.8.2-java/lib/puma/server.rb +801 -0
  105. data/vendor/gems/puma-2.8.2-java/lib/puma/single.rb +102 -0
  106. data/vendor/gems/puma-2.8.2-java/lib/puma/tcp_logger.rb +32 -0
  107. data/vendor/gems/puma-2.8.2-java/lib/puma/thread_pool.rb +185 -0
  108. data/vendor/gems/puma-2.8.2-java/lib/puma/util.rb +9 -0
  109. data/vendor/gems/puma-2.8.2-java/lib/puma.rb +14 -0
  110. data/vendor/gems/puma-2.8.2-java/lib/rack/handler/puma.rb +66 -0
  111. data/vendor/gems/puma-2.8.2-java/puma.gemspec +55 -0
  112. data/vendor/gems/puma-2.8.2-java/test/test_app_status.rb +92 -0
  113. data/vendor/gems/puma-2.8.2-java/test/test_cli.rb +173 -0
  114. data/vendor/gems/puma-2.8.2-java/test/test_config.rb +26 -0
  115. data/vendor/gems/puma-2.8.2-java/test/test_http10.rb +27 -0
  116. data/vendor/gems/puma-2.8.2-java/test/test_http11.rb +144 -0
  117. data/vendor/gems/puma-2.8.2-java/test/test_integration.rb +165 -0
  118. data/vendor/gems/puma-2.8.2-java/test/test_iobuffer.rb +38 -0
  119. data/vendor/gems/puma-2.8.2-java/test/test_minissl.rb +25 -0
  120. data/vendor/gems/puma-2.8.2-java/test/test_null_io.rb +31 -0
  121. data/vendor/gems/puma-2.8.2-java/test/test_persistent.rb +238 -0
  122. data/vendor/gems/puma-2.8.2-java/test/test_puma_server.rb +323 -0
  123. data/vendor/gems/puma-2.8.2-java/test/test_rack_handler.rb +10 -0
  124. data/vendor/gems/puma-2.8.2-java/test/test_rack_server.rb +141 -0
  125. data/vendor/gems/puma-2.8.2-java/test/test_tcp_rack.rb +42 -0
  126. data/vendor/gems/puma-2.8.2-java/test/test_thread_pool.rb +156 -0
  127. data/vendor/gems/puma-2.8.2-java/test/test_unix_socket.rb +39 -0
  128. data/vendor/gems/puma-2.8.2-java/test/test_ws.rb +89 -0
  129. data/vendor/gems/puma-2.8.2-java/tools/jungle/README.md +9 -0
  130. data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/README.md +54 -0
  131. data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/puma +332 -0
  132. data/vendor/gems/puma-2.8.2-java/tools/jungle/init.d/run-puma +3 -0
  133. data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/README.md +61 -0
  134. data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma-manager.conf +31 -0
  135. data/vendor/gems/puma-2.8.2-java/tools/jungle/upstart/puma.conf +63 -0
  136. data/vendor/gems/puma-2.8.2-java/tools/trickletest.rb +45 -0
  137. metadata +389 -0
@@ -0,0 +1,195 @@
1
+ #define RSTRING_NOT_MODIFIED 1
2
+ #include <ruby.h>
3
+ #include <rubyio.h>
4
+ #include <openssl/bio.h>
5
+ #include <openssl/ssl.h>
6
+ #include <openssl/err.h>
7
+
8
+ typedef struct {
9
+ BIO* read;
10
+ BIO* write;
11
+ SSL* ssl;
12
+ SSL_CTX* ctx;
13
+ } ms_conn;
14
+
15
+ void engine_free(ms_conn* conn) {
16
+ BIO_free(conn->read);
17
+ BIO_free(conn->write);
18
+
19
+ free(conn);
20
+ }
21
+
22
+ ms_conn* engine_alloc(VALUE klass, VALUE* obj) {
23
+ ms_conn* conn;
24
+
25
+ *obj = Data_Make_Struct(klass, ms_conn, 0, engine_free, conn);
26
+
27
+ conn->read = BIO_new(BIO_s_mem());
28
+ BIO_set_nbio(conn->read, 1);
29
+
30
+ conn->write = BIO_new(BIO_s_mem());
31
+ BIO_set_nbio(conn->write, 1);
32
+
33
+ conn->ssl = 0;
34
+ conn->ctx = 0;
35
+
36
+ return conn;
37
+ }
38
+
39
+ VALUE engine_init_server(VALUE self, VALUE key, VALUE cert) {
40
+ VALUE obj;
41
+ SSL_CTX* ctx;
42
+ SSL* ssl;
43
+
44
+ ms_conn* conn = engine_alloc(self, &obj);
45
+
46
+ StringValue(key);
47
+ StringValue(cert);
48
+
49
+ ctx = SSL_CTX_new(SSLv23_server_method());
50
+ conn->ctx = ctx;
51
+
52
+ SSL_CTX_use_certificate_file(ctx, RSTRING_PTR(cert), SSL_FILETYPE_PEM);
53
+ SSL_CTX_use_PrivateKey_file(ctx, RSTRING_PTR(key), SSL_FILETYPE_PEM);
54
+ /* SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE); */
55
+
56
+ ssl = SSL_new(ctx);
57
+ conn->ssl = ssl;
58
+
59
+ /* SSL_set_verify(ssl, SSL_VERIFY_NONE, NULL); */
60
+
61
+ SSL_set_bio(ssl, conn->read, conn->write);
62
+
63
+ SSL_set_accept_state(ssl);
64
+ return obj;
65
+ }
66
+
67
+ VALUE engine_init_client(VALUE klass) {
68
+ VALUE obj;
69
+ ms_conn* conn = engine_alloc(klass, &obj);
70
+
71
+ conn->ctx = SSL_CTX_new(DTLSv1_method());
72
+ conn->ssl = SSL_new(conn->ctx);
73
+ SSL_set_verify(conn->ssl, SSL_VERIFY_NONE, NULL);
74
+
75
+ SSL_set_bio(conn->ssl, conn->read, conn->write);
76
+
77
+ SSL_set_connect_state(conn->ssl);
78
+ return obj;
79
+ }
80
+
81
+ VALUE engine_inject(VALUE self, VALUE str) {
82
+ ms_conn* conn;
83
+ long used;
84
+
85
+ Data_Get_Struct(self, ms_conn, conn);
86
+
87
+ StringValue(str);
88
+
89
+ used = BIO_write(conn->read, RSTRING_PTR(str), (int)RSTRING_LEN(str));
90
+
91
+ if(used == 0 || used == -1) {
92
+ return Qfalse;
93
+ }
94
+
95
+ return INT2FIX(used);
96
+ }
97
+
98
+ static VALUE eError;
99
+
100
+ void raise_error(SSL* ssl, int result) {
101
+ int error = SSL_get_error(ssl, result);
102
+ char* msg = ERR_error_string(error, NULL);
103
+
104
+ ERR_clear_error();
105
+ rb_raise(eError, "OpenSSL error: %s - %d", msg, error);
106
+ }
107
+
108
+ VALUE engine_read(VALUE self) {
109
+ ms_conn* conn;
110
+ char buf[512];
111
+ int bytes, n;
112
+
113
+ Data_Get_Struct(self, ms_conn, conn);
114
+
115
+ bytes = SSL_read(conn->ssl, (void*)buf, sizeof(buf));
116
+
117
+ if(bytes > 0) {
118
+ return rb_str_new(buf, bytes);
119
+ }
120
+
121
+ if(SSL_want_read(conn->ssl)) return Qnil;
122
+
123
+ if(SSL_get_error(conn->ssl, bytes) == SSL_ERROR_ZERO_RETURN) {
124
+ rb_eof_error();
125
+ }
126
+
127
+ raise_error(conn->ssl, bytes);
128
+
129
+ return Qnil;
130
+ }
131
+
132
+ VALUE engine_write(VALUE self, VALUE str) {
133
+ ms_conn* conn;
134
+ char buf[512];
135
+ int bytes;
136
+
137
+ Data_Get_Struct(self, ms_conn, conn);
138
+
139
+ StringValue(str);
140
+
141
+ bytes = SSL_write(conn->ssl, (void*)RSTRING_PTR(str), (int)RSTRING_LEN(str));
142
+ if(bytes > 0) {
143
+ return INT2FIX(bytes);
144
+ }
145
+
146
+ if(SSL_want_write(conn->ssl)) return Qnil;
147
+
148
+ raise_error(conn->ssl, bytes);
149
+
150
+ return Qnil;
151
+ }
152
+
153
+ VALUE engine_extract(VALUE self) {
154
+ ms_conn* conn;
155
+ int bytes;
156
+ size_t pending;
157
+ char buf[512];
158
+
159
+ Data_Get_Struct(self, ms_conn, conn);
160
+
161
+ pending = BIO_pending(conn->write);
162
+ if(pending > 0) {
163
+ bytes = BIO_read(conn->write, buf, sizeof(buf));
164
+ if(bytes > 0) {
165
+ return rb_str_new(buf, bytes);
166
+ } else if(!BIO_should_retry(conn->write)) {
167
+ raise_error(conn->ssl, bytes);
168
+ }
169
+ }
170
+
171
+ return Qnil;
172
+ }
173
+
174
+ void Init_mini_ssl(VALUE puma) {
175
+ VALUE mod, eng;
176
+
177
+ SSL_library_init();
178
+ OpenSSL_add_ssl_algorithms();
179
+ SSL_load_error_strings();
180
+ ERR_load_crypto_strings();
181
+
182
+ mod = rb_define_module_under(puma, "MiniSSL");
183
+ eng = rb_define_class_under(mod, "Engine", rb_cObject);
184
+
185
+ eError = rb_define_class_under(mod, "SSLError", rb_eStandardError);
186
+
187
+ rb_define_singleton_method(eng, "server", engine_init_server, 2);
188
+ rb_define_singleton_method(eng, "client", engine_init_client, 0);
189
+
190
+ rb_define_method(eng, "inject", engine_inject, 1);
191
+ rb_define_method(eng, "read", engine_read, 0);
192
+
193
+ rb_define_method(eng, "write", engine_write, 1);
194
+ rb_define_method(eng, "extract", engine_extract, 0);
195
+ }
@@ -0,0 +1,225 @@
1
+ package org.jruby.puma;
2
+
3
+ import org.jruby.Ruby;
4
+ import org.jruby.RubyClass;
5
+ import org.jruby.RubyHash;
6
+ import org.jruby.RubyModule;
7
+ import org.jruby.RubyNumeric;
8
+ import org.jruby.RubyObject;
9
+ import org.jruby.RubyString;
10
+
11
+ import org.jruby.anno.JRubyMethod;
12
+
13
+ import org.jruby.runtime.ObjectAllocator;
14
+ import org.jruby.runtime.ThreadContext;
15
+ import org.jruby.runtime.builtin.IRubyObject;
16
+
17
+ import org.jruby.exceptions.RaiseException;
18
+
19
+ import org.jruby.util.ByteList;
20
+
21
+ /**
22
+ * @author <a href="mailto:ola.bini@ki.se">Ola Bini</a>
23
+ */
24
+ public class Http11 extends RubyObject {
25
+ public final static int MAX_FIELD_NAME_LENGTH = 256;
26
+ public final static String MAX_FIELD_NAME_LENGTH_ERR = "HTTP element FIELD_NAME is longer than the 256 allowed length.";
27
+ public final static int MAX_FIELD_VALUE_LENGTH = 80 * 1024;
28
+ public final static String MAX_FIELD_VALUE_LENGTH_ERR = "HTTP element FIELD_VALUE is longer than the 81920 allowed length.";
29
+ public final static int MAX_REQUEST_URI_LENGTH = 1024 * 12;
30
+ public final static String MAX_REQUEST_URI_LENGTH_ERR = "HTTP element REQUEST_URI is longer than the 12288 allowed length.";
31
+ public final static int MAX_FRAGMENT_LENGTH = 1024;
32
+ public final static String MAX_FRAGMENT_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the 1024 allowed length.";
33
+ public final static int MAX_REQUEST_PATH_LENGTH = 2048;
34
+ public final static String MAX_REQUEST_PATH_LENGTH_ERR = "HTTP element REQUEST_PATH is longer than the 2048 allowed length.";
35
+ public final static int MAX_QUERY_STRING_LENGTH = 1024 * 10;
36
+ public final static String MAX_QUERY_STRING_LENGTH_ERR = "HTTP element QUERY_STRING is longer than the 10240 allowed length.";
37
+ public final static int MAX_HEADER_LENGTH = 1024 * (80 + 32);
38
+ public final static String MAX_HEADER_LENGTH_ERR = "HTTP element HEADER is longer than the 114688 allowed length.";
39
+
40
+
41
+ private static ObjectAllocator ALLOCATOR = new ObjectAllocator() {
42
+ public IRubyObject allocate(Ruby runtime, RubyClass klass) {
43
+ return new Http11(runtime, klass);
44
+ }
45
+ };
46
+
47
+ public static void createHttp11(Ruby runtime) {
48
+ RubyModule mPuma = runtime.defineModule("Puma");
49
+ mPuma.defineClassUnder("HttpParserError",runtime.getClass("IOError"),runtime.getClass("IOError").getAllocator());
50
+
51
+ RubyClass cHttpParser = mPuma.defineClassUnder("HttpParser",runtime.getObject(),ALLOCATOR);
52
+ cHttpParser.defineAnnotatedMethods(Http11.class);
53
+ }
54
+
55
+ private Ruby runtime;
56
+ private RubyClass eHttpParserError;
57
+ private Http11Parser hp;
58
+ private RubyString body;
59
+
60
+ public Http11(Ruby runtime, RubyClass clazz) {
61
+ super(runtime,clazz);
62
+ this.runtime = runtime;
63
+ this.eHttpParserError = (RubyClass)runtime.getModule("Puma").getConstant("HttpParserError");
64
+ this.hp = new Http11Parser();
65
+ this.hp.parser.http_field = http_field;
66
+ this.hp.parser.request_method = request_method;
67
+ this.hp.parser.request_uri = request_uri;
68
+ this.hp.parser.fragment = fragment;
69
+ this.hp.parser.request_path = request_path;
70
+ this.hp.parser.query_string = query_string;
71
+ this.hp.parser.http_version = http_version;
72
+ this.hp.parser.header_done = header_done;
73
+ this.hp.parser.init();
74
+ }
75
+
76
+ public void validateMaxLength(int len, int max, String msg) {
77
+ if(len>max) {
78
+ throw new RaiseException(runtime, eHttpParserError, msg, true);
79
+ }
80
+ }
81
+
82
+ private Http11Parser.FieldCB http_field = new Http11Parser.FieldCB() {
83
+ public void call(Object data, int field, int flen, int value, int vlen) {
84
+ RubyHash req = (RubyHash)data;
85
+ RubyString v,f;
86
+ validateMaxLength(flen, MAX_FIELD_NAME_LENGTH, MAX_FIELD_NAME_LENGTH_ERR);
87
+ validateMaxLength(vlen, MAX_FIELD_VALUE_LENGTH, MAX_FIELD_VALUE_LENGTH_ERR);
88
+
89
+ v = RubyString.newString(runtime, new ByteList(Http11.this.hp.parser.buffer,value,vlen));
90
+ ByteList b = new ByteList(Http11.this.hp.parser.buffer,field,flen);
91
+ for(int i = 0,j = b.length();i<j;i++) {
92
+ if((b.get(i) & 0xFF) == '-') {
93
+ b.set(i, (byte)'_');
94
+ } else {
95
+ b.set(i, (byte)Character.toUpperCase((char)b.get(i)));
96
+ }
97
+ }
98
+
99
+ String as = b.toString();
100
+
101
+ if(as.equals("CONTENT_LENGTH") || as.equals("CONTENT_TYPE")) {
102
+ f = RubyString.newString(runtime, b);
103
+ } else {
104
+ f = RubyString.newString(runtime, "HTTP_");
105
+ f.cat(b);
106
+ }
107
+ req.op_aset(req.getRuntime().getCurrentContext(), f,v);
108
+ }
109
+ };
110
+
111
+ private Http11Parser.ElementCB request_method = new Http11Parser.ElementCB() {
112
+ public void call(Object data, int at, int length) {
113
+ RubyHash req = (RubyHash)data;
114
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
115
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_METHOD"),val);
116
+ }
117
+ };
118
+
119
+ private Http11Parser.ElementCB request_uri = new Http11Parser.ElementCB() {
120
+ public void call(Object data, int at, int length) {
121
+ RubyHash req = (RubyHash)data;
122
+ validateMaxLength(length, MAX_REQUEST_URI_LENGTH, MAX_REQUEST_URI_LENGTH_ERR);
123
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
124
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_URI"),val);
125
+ }
126
+ };
127
+
128
+ private Http11Parser.ElementCB fragment = new Http11Parser.ElementCB() {
129
+ public void call(Object data, int at, int length) {
130
+ RubyHash req = (RubyHash)data;
131
+ validateMaxLength(length, MAX_FRAGMENT_LENGTH, MAX_FRAGMENT_LENGTH_ERR);
132
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
133
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("FRAGMENT"),val);
134
+ }
135
+ };
136
+
137
+ private Http11Parser.ElementCB request_path = new Http11Parser.ElementCB() {
138
+ public void call(Object data, int at, int length) {
139
+ RubyHash req = (RubyHash)data;
140
+ validateMaxLength(length, MAX_REQUEST_PATH_LENGTH, MAX_REQUEST_PATH_LENGTH_ERR);
141
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
142
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("REQUEST_PATH"),val);
143
+ }
144
+ };
145
+
146
+ private Http11Parser.ElementCB query_string = new Http11Parser.ElementCB() {
147
+ public void call(Object data, int at, int length) {
148
+ RubyHash req = (RubyHash)data;
149
+ validateMaxLength(length, MAX_QUERY_STRING_LENGTH, MAX_QUERY_STRING_LENGTH_ERR);
150
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
151
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("QUERY_STRING"),val);
152
+ }
153
+ };
154
+
155
+ private Http11Parser.ElementCB http_version = new Http11Parser.ElementCB() {
156
+ public void call(Object data, int at, int length) {
157
+ RubyHash req = (RubyHash)data;
158
+ RubyString val = RubyString.newString(runtime,new ByteList(hp.parser.buffer,at,length));
159
+ req.op_aset(req.getRuntime().getCurrentContext(), runtime.newString("HTTP_VERSION"),val);
160
+ }
161
+ };
162
+
163
+ private Http11Parser.ElementCB header_done = new Http11Parser.ElementCB() {
164
+ public void call(Object data, int at, int length) {
165
+ body = RubyString.newString(runtime, new ByteList(hp.parser.buffer, at, length));
166
+ }
167
+ };
168
+
169
+ @JRubyMethod
170
+ public IRubyObject initialize() {
171
+ this.hp.parser.init();
172
+ return this;
173
+ }
174
+
175
+ @JRubyMethod
176
+ public IRubyObject reset() {
177
+ this.hp.parser.init();
178
+ return runtime.getNil();
179
+ }
180
+
181
+ @JRubyMethod
182
+ public IRubyObject finish() {
183
+ this.hp.finish();
184
+ return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
185
+ }
186
+
187
+ @JRubyMethod
188
+ public IRubyObject execute(IRubyObject req_hash, IRubyObject data, IRubyObject start) {
189
+ int from = 0;
190
+ from = RubyNumeric.fix2int(start);
191
+ ByteList d = ((RubyString)data).getByteList();
192
+ if(from >= d.length()) {
193
+ throw new RaiseException(runtime, eHttpParserError, "Requested start is after data buffer end.", true);
194
+ } else {
195
+ this.hp.parser.data = req_hash;
196
+ this.hp.execute(d,from);
197
+ validateMaxLength(this.hp.parser.nread,MAX_HEADER_LENGTH, MAX_HEADER_LENGTH_ERR);
198
+ if(this.hp.has_error()) {
199
+ throw new RaiseException(runtime, eHttpParserError, "Invalid HTTP format, parsing fails.", true);
200
+ } else {
201
+ return runtime.newFixnum(this.hp.parser.nread);
202
+ }
203
+ }
204
+ }
205
+
206
+ @JRubyMethod(name = "error?")
207
+ public IRubyObject has_error() {
208
+ return this.hp.has_error() ? runtime.getTrue() : runtime.getFalse();
209
+ }
210
+
211
+ @JRubyMethod(name = "finished?")
212
+ public IRubyObject is_finished() {
213
+ return this.hp.is_finished() ? runtime.getTrue() : runtime.getFalse();
214
+ }
215
+
216
+ @JRubyMethod
217
+ public IRubyObject nread() {
218
+ return runtime.newFixnum(this.hp.parser.nread);
219
+ }
220
+
221
+ @JRubyMethod
222
+ public IRubyObject body() {
223
+ return body;
224
+ }
225
+ }// Http11