reel 0.4.0 → 0.5.0.pre
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of reel might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.travis.yml +5 -2
- data/Gemfile +6 -0
- data/README.md +26 -16
- data/benchmarks/hello_reel.rb +1 -1
- data/benchmarks/reel_pool.rb +27 -0
- data/examples/hello_world.rb +2 -2
- data/examples/{ssl_hello_world.rb → https_hello_world.rb} +1 -1
- data/examples/roundtrip.rb +1 -1
- data/examples/server_sent_events.rb +22 -18
- data/examples/spy_hello_world.rb +22 -0
- data/examples/websockets.rb +3 -3
- data/lib/reel.rb +6 -9
- data/lib/reel/connection.rb +40 -42
- data/lib/reel/mixins.rb +3 -1
- data/lib/reel/request.rb +40 -9
- data/lib/reel/request/body.rb +65 -0
- data/lib/reel/request/info.rb +21 -0
- data/lib/reel/{request_parser.rb → request/parser.rb} +2 -2
- data/lib/reel/request/state_machine.rb +26 -0
- data/lib/reel/response.rb +4 -11
- data/lib/reel/response/writer.rb +59 -0
- data/lib/reel/server.rb +30 -6
- data/lib/reel/server/http.rb +20 -0
- data/lib/reel/server/https.rb +63 -0
- data/lib/reel/spy.rb +71 -0
- data/lib/reel/stream.rb +2 -2
- data/lib/reel/version.rb +2 -2
- data/lib/reel/websocket.rb +1 -1
- data/reel.gemspec +3 -3
- data/spec/fixtures/ca.crt +27 -0
- data/spec/fixtures/ca.key +27 -0
- data/spec/fixtures/client.crt +81 -20
- data/spec/fixtures/client.unsigned.crt +22 -0
- data/spec/fixtures/server.crt +80 -20
- data/spec/reel/connection_spec.rb +50 -11
- data/spec/reel/{server_spec.rb → http_server_spec.rb} +1 -1
- data/spec/reel/https_server_spec.rb +119 -0
- data/spec/reel/{response_writer_spec.rb → response/writer_spec.rb} +10 -2
- data/spec/reel/websocket_spec.rb +2 -2
- data/spec/spec_helper.rb +3 -34
- data/spec/support/example_request.rb +34 -0
- metadata +56 -43
- data/examples/chunked.rb +0 -25
- data/lib/reel/request_body.rb +0 -56
- data/lib/reel/request_info.rb +0 -19
- data/lib/reel/response_writer.rb +0 -76
- data/lib/reel/ssl_server.rb +0 -41
- data/spec/reel/ssl_server_spec.rb +0 -54
data/lib/reel/spy.rb
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Reel
|
4
|
+
# Prints out all traffic to a Reel server. Useful for debugging
|
5
|
+
class Spy
|
6
|
+
extend Forwardable
|
7
|
+
|
8
|
+
def_delegators :@socket, :closed?
|
9
|
+
|
10
|
+
def initialize(socket, logger = STDOUT)
|
11
|
+
@socket, @logger = socket, logger
|
12
|
+
@proto, @port, _, @ip = @socket.peeraddr
|
13
|
+
connected
|
14
|
+
end
|
15
|
+
|
16
|
+
# Log a connection to this server
|
17
|
+
def connected
|
18
|
+
log :connect, "+++ #{@ip}:#{@port} (#{@proto}) connected\n"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Read from the client
|
22
|
+
def readpartial(maxlen, outbuf = "")
|
23
|
+
data = @socket.readpartial(maxlen, outbuf)
|
24
|
+
log :read, data
|
25
|
+
data
|
26
|
+
end
|
27
|
+
|
28
|
+
# Write data to the client
|
29
|
+
def write(string)
|
30
|
+
log :write, string
|
31
|
+
@socket << string
|
32
|
+
end
|
33
|
+
alias << write
|
34
|
+
|
35
|
+
# Close the socket
|
36
|
+
def close
|
37
|
+
@socket.close
|
38
|
+
log :close, "--- #{@ip}:#{@port} (#{@proto}) disconnected\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
# Log the given event
|
42
|
+
def log(type, str)
|
43
|
+
case type
|
44
|
+
when :connect
|
45
|
+
@logger << Colors.green(str)
|
46
|
+
when :close
|
47
|
+
@logger << Colors.red(str)
|
48
|
+
when :read
|
49
|
+
@logger << Colors.gold(str)
|
50
|
+
when :write
|
51
|
+
@logger << Colors.white(str)
|
52
|
+
else
|
53
|
+
raise "unknown event type: #{type.inspect}"
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
module Colors
|
58
|
+
module_function
|
59
|
+
|
60
|
+
def escape(n); "\033[#{n}m"; end
|
61
|
+
def reset; escape 0; end
|
62
|
+
def color(n); escape "1;#{n}"; end
|
63
|
+
def colorize(n, str); "#{color(n)}#{str}#{reset}"; end
|
64
|
+
|
65
|
+
def green(str); colorize(32, str); end
|
66
|
+
def red(str); colorize(31, str); end
|
67
|
+
def white(str); colorize(39, str); end
|
68
|
+
def gold(str); colorize(33, str); end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/reel/stream.rb
CHANGED
@@ -12,7 +12,7 @@ module Reel
|
|
12
12
|
def write(data)
|
13
13
|
@socket << data
|
14
14
|
data
|
15
|
-
rescue Errno::EPIPE
|
15
|
+
rescue IOError, Errno::ECONNRESET, Errno::EPIPE
|
16
16
|
raise SocketError, "error writing to socket"
|
17
17
|
end
|
18
18
|
alias :<< :write
|
@@ -102,7 +102,7 @@ module Reel
|
|
102
102
|
raise TypeError, "can't render #{@body.class} as a response body"
|
103
103
|
end
|
104
104
|
|
105
|
-
@headers =
|
105
|
+
@headers = HTTP::Headers.coerce(headers)
|
106
106
|
@version = http_version
|
107
107
|
end
|
108
108
|
|
data/lib/reel/version.rb
CHANGED
data/lib/reel/websocket.rb
CHANGED
data/reel.gemspec
CHANGED
@@ -18,9 +18,9 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.add_runtime_dependency 'celluloid', '>= 0.15.1'
|
19
19
|
gem.add_runtime_dependency 'celluloid-io', '>= 0.15.0'
|
20
20
|
gem.add_runtime_dependency 'http', '>= 0.5.0'
|
21
|
-
gem.add_runtime_dependency 'http_parser.rb', '>= 0.6.0
|
22
|
-
gem.add_runtime_dependency 'websocket_parser', '>= 0.1.
|
21
|
+
gem.add_runtime_dependency 'http_parser.rb', '>= 0.6.0'
|
22
|
+
gem.add_runtime_dependency 'websocket_parser', '>= 0.1.6'
|
23
23
|
|
24
24
|
gem.add_development_dependency 'rake'
|
25
|
-
gem.add_development_dependency 'rspec'
|
25
|
+
gem.add_development_dependency 'rspec', '>= 2.11.0'
|
26
26
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIEgDCCA2igAwIBAgIJAPs+Pcx3Ws69MA0GCSqGSIb3DQEBBQUAMIGGMQswCQYD
|
3
|
+
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
|
4
|
+
aXNjbzESMBAGA1UEChMJQ2VsbHVsb2lkMRcwFQYDVQQDEw5jYS5leGFtcGxlLmNv
|
5
|
+
bTEdMBsGCSqGSIb3DQEJARYOY2FAZXhhbXBsZS5jb20wHhcNMTMxMTA3MjMwMjMz
|
6
|
+
WhcNNDEwMzI0MjMwMjMzWjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
|
7
|
+
b3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoTCUNlbGx1bG9p
|
8
|
+
ZDEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4
|
9
|
+
YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA48syWpTE
|
10
|
+
uZexHJJKTgfdTA/eXkUEh6QM/NcclLARJVT5YWlfQigOAkSowBTIBlsxiMPPUITY
|
11
|
+
kBEbWNz6mlVYehQlxISG6gc1b90S+aj+hWPX9oWvQUrUboQZZtgxZf817MElxP5G
|
12
|
+
JAtNKlGGj6gKYyM/4ir8TXRJ9SHta4xeVrrqm7/pdh5uaE3cBAJv0usRK/uQxh1N
|
13
|
+
woGAq6iCpwImnjx6SNrs1MoJo/F2nmdEcODaCLTVTY08hp/v+cVPCONMEvuJRUnu
|
14
|
+
O7ytR6ym1/3MufHg3Xv6OwnfXqh/czZ6tD+ncH5bAHnmZOvT2OA8y68yxTnIshcT
|
15
|
+
wE7x+RBDRMCBhwIDAQABo4HuMIHrMB0GA1UdDgQWBBSqhnwm0V/WWAQcB9xXM7W6
|
16
|
+
s2gtrDCBuwYDVR0jBIGzMIGwgBSqhnwm0V/WWAQcB9xXM7W6s2gtrKGBjKSBiTCB
|
17
|
+
hjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh
|
18
|
+
biBGcmFuY2lzY28xEjAQBgNVBAoTCUNlbGx1bG9pZDEXMBUGA1UEAxMOY2EuZXhh
|
19
|
+
bXBsZS5jb20xHTAbBgkqhkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tggkA+z49zHda
|
20
|
+
zr0wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA0MMwHKw76n3Y+ybJ
|
21
|
+
WkOf9Qpu2/FDsQ0aMc5a/Z0cvrEx6xqcNDRmov+ikNClaClgfXG4gb+xWor8Y4fD
|
22
|
+
jpyaLL5X3G7ThseDjH6575UT1KjJ0team4XCx6zpLoKzLDW2sM1tAnNAXMGEnZ1R
|
23
|
+
HsJQdHuVTVekwuLcnrfnrfm395CLfMaOUaJw4ZsJmKyoHM03/80LNme+bjVJ+vh+
|
24
|
+
1vE2t2c86WprrNQIryseqwz08DAuSPjezuIsSd5sARuOw3ggC3xhEkVJDJY2lIMh
|
25
|
+
gxi384M84LBbGjvQdKbdxkWcvfD5hgEva9I8I2yXVyRoQrUWHnVRlL87PUmkRvLT
|
26
|
+
HC7SFg==
|
27
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpAIBAAKCAQEA48syWpTEuZexHJJKTgfdTA/eXkUEh6QM/NcclLARJVT5YWlf
|
3
|
+
QigOAkSowBTIBlsxiMPPUITYkBEbWNz6mlVYehQlxISG6gc1b90S+aj+hWPX9oWv
|
4
|
+
QUrUboQZZtgxZf817MElxP5GJAtNKlGGj6gKYyM/4ir8TXRJ9SHta4xeVrrqm7/p
|
5
|
+
dh5uaE3cBAJv0usRK/uQxh1NwoGAq6iCpwImnjx6SNrs1MoJo/F2nmdEcODaCLTV
|
6
|
+
TY08hp/v+cVPCONMEvuJRUnuO7ytR6ym1/3MufHg3Xv6OwnfXqh/czZ6tD+ncH5b
|
7
|
+
AHnmZOvT2OA8y68yxTnIshcTwE7x+RBDRMCBhwIDAQABAoIBAHQ038434JfxW6gA
|
8
|
+
tSlTd8Bqw/0BZosv1HRT5L+xhj2uOL5J/A+K0YK0tgWvVE9xzDZB9gvUiYoNQA84
|
9
|
+
RBvheA5nItE67nyLCuazOA/m91jjE3QuxLYhT3fFqhO+LI0lAcRy0CrLsMqIfWge
|
10
|
+
SPAWQJ5MiDV/ylBVB7mnAjCAXkwNfi3LYuoBa5tX9HmN7kDFpqN0KyFav/3Bsij5
|
11
|
+
JUwxAHjWbSH61TLjA4WpvyKTARW3uhInjwj+CMRszfyH//h7lwFba5YbebXjfdFP
|
12
|
+
PsOS8lc/puqrjf7ZS/lPcL8xTElrcDr5oMtOBEoU+y2W+Gz5tpNQHCRIpq71CwEv
|
13
|
+
/VdicoECgYEA/CyGXfVv3GULb4BQbKJqIKa17uv9nVDxc3VUoelhN40WshKOt4zd
|
14
|
+
03x0or1f/LymEijj2K/rKt6T1kbKIrw1FFG7HiFdX1AUBkP4q1gDBoGohSsOdcRQ
|
15
|
+
pFIdz9ViOn5F5+iJrRT3yDhJAL0kG/YSfqwsaafQqPzpgY9Ig3uIb0cCgYEA5z/5
|
16
|
+
4tBKT6ps0ppLyK8NqpRtSK5ZWiy+N4kbNKEgaXOkRxZUXJBlRGoMe/E+wDLHsDza
|
17
|
+
X3jwkFUCXXRM2PihwYWdZjCWo6ktorZzNd0fceAXkgeCi+FigfTweqe2zjq1s8BU
|
18
|
+
FrNGo/06lC2JWKHVbke5hcBeyjRVPp/8Jnzm+8ECgYAG8/dUeeL2sbaKAYC2Lhg9
|
19
|
+
BDu59bnNb6DorRCDUlsC3BoHGOnkd7baEPFqV0xhPJZbo9L8c4VJbk+nNdZ29LeF
|
20
|
+
8ub04rifWybiMVeW6dtTf5m06kYAy0Pp8/WseFa4BClLRqcdJZnbZGnm4lAvkS5b
|
21
|
+
XcXvt9fSAP8zOk8miO5vGwKBgQDbBuxumKwZwqip3Ly0yqDeFRFhSsmUsFZGEZV0
|
22
|
+
BrzFRGOvdQXYWmegIfXLGtc9gZtDYI/Q56KqgenojDQROYUz35MSbCjxwFZaDAcZ
|
23
|
+
WGPlHsQUawqJ5KLBxjZTZjCuKktZgmviyFC7GCj4mhzBlx6pAkRE28ysJl8rHqrb
|
24
|
+
5Wd9wQKBgQCX6cLNz8HzBzJDBcZN/0ipqdSSNj4GCVaZCD2S+2uqAvwEud/0slRo
|
25
|
+
1Pgi9o9BXSq6TGnXX6zcoWWXbMnlC2Oq61FFI+Q0+DnHxwwhasrULKTmeHzLN84s
|
26
|
+
QMUVu3CbaokYg2VBKPiyW2sLE3KOBViO1cQFBFvcPIMwoB9BzeG6ig==
|
27
|
+
-----END RSA PRIVATE KEY-----
|
data/spec/fixtures/client.crt
CHANGED
@@ -1,22 +1,83 @@
|
|
1
|
+
Certificate:
|
2
|
+
Data:
|
3
|
+
Version: 3 (0x2)
|
4
|
+
Serial Number: 1 (0x1)
|
5
|
+
Signature Algorithm: sha1WithRSAEncryption
|
6
|
+
Issuer: C=US, ST=California, L=San Francisco, O=Celluloid, CN=ca.example.com/emailAddress=ca@example.com
|
7
|
+
Validity
|
8
|
+
Not Before: Nov 7 23:23:12 2013 GMT
|
9
|
+
Not After : Nov 7 23:23:12 2014 GMT
|
10
|
+
Subject: C=US, ST=California, O=Celluloid, CN=client.example.com/emailAddress=client@example.com
|
11
|
+
Subject Public Key Info:
|
12
|
+
Public Key Algorithm: rsaEncryption
|
13
|
+
RSA Public Key: (2048 bit)
|
14
|
+
Modulus (2048 bit):
|
15
|
+
00:d5:eb:3c:e9:90:02:17:e0:58:a3:9f:2b:57:f3:
|
16
|
+
81:a0:1d:bf:21:61:d3:49:02:7f:bd:83:9e:d7:1a:
|
17
|
+
ba:ad:00:7e:81:94:ba:00:34:59:78:9f:ff:b2:9c:
|
18
|
+
44:30:06:a9:6b:36:77:ec:b4:fa:df:ee:c3:de:cf:
|
19
|
+
2b:67:b5:25:72:b9:f4:84:f8:b1:94:18:12:40:fe:
|
20
|
+
3c:a3:40:23:1c:11:ef:3e:e1:b7:ce:0b:66:61:0a:
|
21
|
+
9b:e7:23:67:4a:34:ac:2c:98:cf:83:c9:6b:3f:3d:
|
22
|
+
59:7b:5c:40:19:17:63:f8:89:0f:1e:18:b5:45:8e:
|
23
|
+
98:7e:28:0f:c3:ef:d7:07:90:87:86:b7:81:44:03:
|
24
|
+
8c:49:5a:a2:9f:f8:a8:df:b7:1a:35:70:1a:8b:c7:
|
25
|
+
67:54:8a:e7:11:2f:bb:6f:6b:78:a7:80:0a:98:4a:
|
26
|
+
cf:e2:f3:68:ca:2c:69:63:ed:f7:51:33:2b:4e:c7:
|
27
|
+
ce:cd:86:cd:f9:45:6a:6e:eb:a9:7b:86:fa:5e:b7:
|
28
|
+
1d:ed:db:05:36:a1:b2:8e:cc:a8:52:e3:27:1a:67:
|
29
|
+
60:29:b4:40:cd:5c:a6:81:4d:0e:65:7a:34:91:c4:
|
30
|
+
50:42:a5:84:2d:aa:69:1d:d1:b3:06:fd:3e:59:7d:
|
31
|
+
70:b8:e5:ac:63:f5:ad:ab:8f:c0:0a:65:cb:7e:98:
|
32
|
+
b0:b3
|
33
|
+
Exponent: 65537 (0x10001)
|
34
|
+
X509v3 extensions:
|
35
|
+
X509v3 Basic Constraints:
|
36
|
+
CA:FALSE
|
37
|
+
Netscape Comment:
|
38
|
+
OpenSSL Generated Certificate
|
39
|
+
X509v3 Subject Key Identifier:
|
40
|
+
74:EA:7C:F5:79:ED:5A:ED:B3:95:13:1C:5A:1A:C8:2E:63:12:EF:5D
|
41
|
+
X509v3 Authority Key Identifier:
|
42
|
+
keyid:AA:86:7C:26:D1:5F:D6:58:04:1C:07:DC:57:33:B5:BA:B3:68:2D:AC
|
43
|
+
|
44
|
+
Signature Algorithm: sha1WithRSAEncryption
|
45
|
+
38:9d:aa:2c:40:cf:a2:79:0e:17:a1:4b:07:0e:8f:c9:8b:5f:
|
46
|
+
8c:d4:34:14:00:e0:df:7d:9a:a4:d2:ec:b2:3f:ca:a4:e5:31:
|
47
|
+
03:17:74:3e:03:56:69:3d:d0:c4:fc:e9:11:62:63:3d:02:24:
|
48
|
+
37:f0:50:bf:c1:4e:a8:6f:e3:7d:24:16:9e:2d:cf:93:f3:c2:
|
49
|
+
ba:4a:76:f4:09:d9:44:44:80:19:5a:16:f5:b4:8c:13:bf:0a:
|
50
|
+
19:e9:2b:6f:e0:eb:d6:8a:f3:b3:1d:ba:46:51:7c:44:df:11:
|
51
|
+
af:59:a1:2b:d4:58:6d:a8:28:47:26:7a:af:84:30:0f:a0:91:
|
52
|
+
0b:94:f0:2a:a5:9e:2b:19:af:0c:16:34:fd:49:0c:ee:8d:31:
|
53
|
+
00:9f:b8:00:dc:9b:9f:38:b0:c0:c1:37:37:96:9a:18:07:b0:
|
54
|
+
c6:50:ff:28:3b:f7:84:8e:d5:b3:df:97:4f:91:c0:91:a4:af:
|
55
|
+
f8:a0:ef:83:0c:37:1b:2c:aa:57:66:1c:cf:89:28:5e:b9:33:
|
56
|
+
ab:87:35:78:e7:10:64:90:22:35:e8:02:cf:61:71:52:5a:84:
|
57
|
+
3a:1e:8a:71:cb:c2:63:32:c4:e8:d6:1b:ff:d5:18:18:50:b7:
|
58
|
+
c6:8c:c2:32:eb:7e:5e:44:b0:e2:03:5d:30:07:6b:ae:09:83:
|
59
|
+
a3:26:f1:78
|
1
60
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
61
|
+
MIID8zCCAtugAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx
|
62
|
+
EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEjAQ
|
63
|
+
BgNVBAoTCUNlbGx1bG9pZDEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkq
|
64
|
+
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTEzMTEwNzIzMjMxMloXDTE0MTEw
|
65
|
+
NzIzMjMxMlowdjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQ
|
66
|
+
BgNVBAoTCUNlbGx1bG9pZDEbMBkGA1UEAxMSY2xpZW50LmV4YW1wbGUuY29tMSEw
|
67
|
+
HwYJKoZIhvcNAQkBFhJjbGllbnRAZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEB
|
68
|
+
AQUAA4IBDwAwggEKAoIBAQDV6zzpkAIX4FijnytX84GgHb8hYdNJAn+9g57XGrqt
|
69
|
+
AH6BlLoANFl4n/+ynEQwBqlrNnfstPrf7sPezytntSVyufSE+LGUGBJA/jyjQCMc
|
70
|
+
Ee8+4bfOC2ZhCpvnI2dKNKwsmM+DyWs/PVl7XEAZF2P4iQ8eGLVFjph+KA/D79cH
|
71
|
+
kIeGt4FEA4xJWqKf+Kjftxo1cBqLx2dUiucRL7tva3ingAqYSs/i82jKLGlj7fdR
|
72
|
+
MytOx87Nhs35RWpu66l7hvpetx3t2wU2obKOzKhS4ycaZ2AptEDNXKaBTQ5lejSR
|
73
|
+
xFBCpYQtqmkd0bMG/T5ZfXC45axj9a2rj8AKZct+mLCzAgMBAAGjezB5MAkGA1Ud
|
74
|
+
EwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmlj
|
75
|
+
YXRlMB0GA1UdDgQWBBR06nz1ee1a7bOVExxaGsguYxLvXTAfBgNVHSMEGDAWgBSq
|
76
|
+
hnwm0V/WWAQcB9xXM7W6s2gtrDANBgkqhkiG9w0BAQUFAAOCAQEAOJ2qLEDPonkO
|
77
|
+
F6FLBw6PyYtfjNQ0FADg332apNLssj/KpOUxAxd0PgNWaT3QxPzpEWJjPQIkN/BQ
|
78
|
+
v8FOqG/jfSQWni3Pk/PCukp29AnZRESAGVoW9bSME78KGekrb+Dr1orzsx26RlF8
|
79
|
+
RN8Rr1mhK9RYbagoRyZ6r4QwD6CRC5TwKqWeKxmvDBY0/UkM7o0xAJ+4ANybnziw
|
80
|
+
wME3N5aaGAewxlD/KDv3hI7Vs9+XT5HAkaSv+KDvgww3GyyqV2Ycz4koXrkzq4c1
|
81
|
+
eOcQZJAiNegCz2FxUlqEOh6KccvCYzLE6NYb/9UYGFC3xozCMut+XkSw4gNdMAdr
|
82
|
+
rgmDoybxeA==
|
22
83
|
-----END CERTIFICATE-----
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDmjCCAoICCQDwZ8yE/0n4PjANBgkqhkiG9w0BAQUFADCBjjELMAkGA1UEBhMC
|
3
|
+
VVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
|
4
|
+
EjAQBgNVBAoTCUNlbGx1bG9pZDEbMBkGA1UEAxMSY2xpZW50LmV4YW1wbGUuY29t
|
5
|
+
MSEwHwYJKoZIhvcNAQkBFhJjbGllbnRAZXhhbXBsZS5jb20wHhcNMTIxMTI1MTkx
|
6
|
+
NjI2WhcNMjIxMTIzMTkxNjI2WjCBjjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNh
|
7
|
+
bGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEjAQBgNVBAoTCUNlbGx1
|
8
|
+
bG9pZDEbMBkGA1UEAxMSY2xpZW50LmV4YW1wbGUuY29tMSEwHwYJKoZIhvcNAQkB
|
9
|
+
FhJjbGllbnRAZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
|
10
|
+
AoIBAQDV6zzpkAIX4FijnytX84GgHb8hYdNJAn+9g57XGrqtAH6BlLoANFl4n/+y
|
11
|
+
nEQwBqlrNnfstPrf7sPezytntSVyufSE+LGUGBJA/jyjQCMcEe8+4bfOC2ZhCpvn
|
12
|
+
I2dKNKwsmM+DyWs/PVl7XEAZF2P4iQ8eGLVFjph+KA/D79cHkIeGt4FEA4xJWqKf
|
13
|
+
+Kjftxo1cBqLx2dUiucRL7tva3ingAqYSs/i82jKLGlj7fdRMytOx87Nhs35RWpu
|
14
|
+
66l7hvpetx3t2wU2obKOzKhS4ycaZ2AptEDNXKaBTQ5lejSRxFBCpYQtqmkd0bMG
|
15
|
+
/T5ZfXC45axj9a2rj8AKZct+mLCzAgMBAAEwDQYJKoZIhvcNAQEFBQADggEBAHzr
|
16
|
+
b4VTktAi+8baGRJCXupt0Ari8ffoWhsYerELFLQF7K2sluxOqCsGEEF21e99fZxP
|
17
|
+
lisLi0DIQ7cNlOGjRJ3xaydE74Fsry3xBNKoR8I7OMr9VFsrC54tc0x7NQ7bRHy6
|
18
|
+
kCjSwKN4I2KWJjQ8yf8mIalmUKOmb/hirzna8io4CiDeJGZ1XNAQ9dl1RHRW442G
|
19
|
+
GTu2ofAtU8TlzilZyclMY/lN7whw7sKP+pPr6fpAOJZsR64IzbBcWHHjJhx70XOx
|
20
|
+
jnd5FB1oXnuupgPqEKmatSCytrue8GTkanB8VZ6+Zd/4XgTkie3UtCZW8R+NL/Lo
|
21
|
+
us/+Ks3WIDyYdPSPnbE=
|
22
|
+
-----END CERTIFICATE-----
|
data/spec/fixtures/server.crt
CHANGED
@@ -1,22 +1,82 @@
|
|
1
|
+
Certificate:
|
2
|
+
Data:
|
3
|
+
Version: 3 (0x2)
|
4
|
+
Serial Number: 3 (0x3)
|
5
|
+
Signature Algorithm: sha1WithRSAEncryption
|
6
|
+
Issuer: C=US, ST=California, L=San Francisco, O=Celluloid, CN=ca.example.com/emailAddress=ca@example.com
|
7
|
+
Validity
|
8
|
+
Not Before: Nov 7 23:33:55 2013 GMT
|
9
|
+
Not After : Nov 7 23:33:55 2014 GMT
|
10
|
+
Subject: C=US, ST=California, O=Celluloid, CN=127.0.0.1/emailAddress=server@example.com
|
11
|
+
Subject Public Key Info:
|
12
|
+
Public Key Algorithm: rsaEncryption
|
13
|
+
RSA Public Key: (2048 bit)
|
14
|
+
Modulus (2048 bit):
|
15
|
+
00:a9:2e:cd:d7:83:4d:11:b6:81:b8:f9:22:9a:68:
|
16
|
+
d7:f0:e8:3b:de:f5:dd:0a:92:0d:02:35:f5:3c:02:
|
17
|
+
cc:4e:81:32:14:d5:0b:bc:b3:e6:f3:2a:4a:9e:eb:
|
18
|
+
a3:5f:09:ae:93:f1:53:e9:93:d5:5b:22:51:76:38:
|
19
|
+
d7:60:63:8a:3c:9a:e5:75:ab:e9:92:ea:3d:87:0c:
|
20
|
+
0b:56:3e:20:e3:3f:ef:58:3b:01:9f:fc:34:f7:2e:
|
21
|
+
14:9b:83:c9:3e:6a:52:f6:72:a7:bb:07:55:cd:52:
|
22
|
+
c3:45:12:f4:3e:c9:02:e5:8f:d3:16:29:be:e7:6d:
|
23
|
+
80:cc:f1:aa:9d:bf:8e:8a:1a:80:e3:f6:ff:6b:7e:
|
24
|
+
6e:10:88:ac:08:07:ab:bf:2a:84:06:db:66:05:ee:
|
25
|
+
c4:f8:3b:8e:23:53:fb:b6:d3:17:26:de:b5:75:12:
|
26
|
+
58:34:80:2f:d4:3f:f6:2a:9e:e3:0f:09:96:1c:2b:
|
27
|
+
f6:7d:bd:81:ad:0c:9e:86:f0:e6:03:70:f6:52:64:
|
28
|
+
17:64:aa:57:df:85:80:6c:b1:28:f7:47:bb:13:0a:
|
29
|
+
aa:21:e2:6b:34:f2:e9:1c:1b:27:1b:bd:43:be:71:
|
30
|
+
6a:cf:2a:79:b2:4a:c1:9a:09:8b:46:92:9e:d0:b0:
|
31
|
+
7d:5e:73:b4:06:03:4d:61:64:bd:b2:2f:c0:ae:24:
|
32
|
+
c5:1b
|
33
|
+
Exponent: 65537 (0x10001)
|
34
|
+
X509v3 extensions:
|
35
|
+
X509v3 Basic Constraints:
|
36
|
+
CA:FALSE
|
37
|
+
Netscape Comment:
|
38
|
+
OpenSSL Generated Certificate
|
39
|
+
X509v3 Subject Key Identifier:
|
40
|
+
B3:4D:7D:A4:A3:AC:8D:B7:7A:F6:EC:6E:25:60:CE:64:D2:2E:AC:AC
|
41
|
+
X509v3 Authority Key Identifier:
|
42
|
+
keyid:AA:86:7C:26:D1:5F:D6:58:04:1C:07:DC:57:33:B5:BA:B3:68:2D:AC
|
43
|
+
|
44
|
+
Signature Algorithm: sha1WithRSAEncryption
|
45
|
+
2b:fa:71:6f:e8:27:af:93:b8:2c:15:53:9d:00:15:25:0d:db:
|
46
|
+
33:ac:83:a7:a6:10:b0:d3:ca:7c:57:ae:d9:ca:4f:92:92:fe:
|
47
|
+
bd:3e:7d:59:af:33:59:1e:01:31:7c:01:7f:43:66:f3:96:84:
|
48
|
+
d6:20:e2:6d:69:61:eb:28:e9:b4:0c:9d:59:76:04:44:a1:0e:
|
49
|
+
76:7e:b5:d8:a8:30:7c:2a:82:63:ee:dc:34:56:26:e7:08:65:
|
50
|
+
7b:0e:31:33:f9:06:4a:51:4e:1a:e5:1a:5e:51:3c:d0:00:b2:
|
51
|
+
6a:6d:3c:c3:80:77:34:1a:0d:51:20:fc:5b:0b:e3:68:a0:3e:
|
52
|
+
72:10:b2:f7:7e:5d:a3:40:96:46:fe:e6:24:59:57:30:ab:6e:
|
53
|
+
00:e4:eb:92:87:23:8e:17:d7:03:bf:59:04:82:52:05:76:fb:
|
54
|
+
d3:da:a2:a0:05:41:97:71:6d:29:04:ad:1a:f3:49:38:dc:8b:
|
55
|
+
cb:34:fe:5b:b4:0b:c4:18:e5:52:a7:20:d6:2d:6a:b0:cd:6f:
|
56
|
+
17:87:8a:4f:6b:8f:43:50:ab:7b:2c:db:a3:be:09:24:a9:64:
|
57
|
+
6e:c4:13:16:e9:83:bf:a3:45:a9:f1:27:85:ce:f7:70:0c:37:
|
58
|
+
2f:25:8a:1e:b0:76:70:69:83:d2:ec:69:aa:ee:86:7e:4c:c9:
|
59
|
+
71:d7:5c:37
|
1
60
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
61
|
+
MIID6jCCAtKgAwIBAgIBAzANBgkqhkiG9w0BAQUFADCBhjELMAkGA1UEBhMCVVMx
|
62
|
+
EzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28xEjAQ
|
63
|
+
BgNVBAoTCUNlbGx1bG9pZDEXMBUGA1UEAxMOY2EuZXhhbXBsZS5jb20xHTAbBgkq
|
64
|
+
hkiG9w0BCQEWDmNhQGV4YW1wbGUuY29tMB4XDTEzMTEwNzIzMzM1NVoXDTE0MTEw
|
65
|
+
NzIzMzM1NVowbTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQ
|
66
|
+
BgNVBAoTCUNlbGx1bG9pZDESMBAGA1UEAxMJMTI3LjAuMC4xMSEwHwYJKoZIhvcN
|
67
|
+
AQkBFhJzZXJ2ZXJAZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
68
|
+
ggEKAoIBAQCpLs3Xg00RtoG4+SKaaNfw6Dve9d0Kkg0CNfU8AsxOgTIU1Qu8s+bz
|
69
|
+
Kkqe66NfCa6T8VPpk9VbIlF2ONdgY4o8muV1q+mS6j2HDAtWPiDjP+9YOwGf/DT3
|
70
|
+
LhSbg8k+alL2cqe7B1XNUsNFEvQ+yQLlj9MWKb7nbYDM8aqdv46KGoDj9v9rfm4Q
|
71
|
+
iKwIB6u/KoQG22YF7sT4O44jU/u20xcm3rV1Elg0gC/UP/YqnuMPCZYcK/Z9vYGt
|
72
|
+
DJ6G8OYDcPZSZBdkqlffhYBssSj3R7sTCqoh4ms08ukcGycbvUO+cWrPKnmySsGa
|
73
|
+
CYtGkp7QsH1ec7QGA01hZL2yL8CuJMUbAgMBAAGjezB5MAkGA1UdEwQCMAAwLAYJ
|
74
|
+
YIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJhdGVkIENlcnRpZmljYXRlMB0GA1Ud
|
75
|
+
DgQWBBSzTX2ko6yNt3r27G4lYM5k0i6srDAfBgNVHSMEGDAWgBSqhnwm0V/WWAQc
|
76
|
+
B9xXM7W6s2gtrDANBgkqhkiG9w0BAQUFAAOCAQEAK/pxb+gnr5O4LBVTnQAVJQ3b
|
77
|
+
M6yDp6YQsNPKfFeu2cpPkpL+vT59Wa8zWR4BMXwBf0Nm85aE1iDibWlh6yjptAyd
|
78
|
+
WXYERKEOdn612KgwfCqCY+7cNFYm5whlew4xM/kGSlFOGuUaXlE80ACyam08w4B3
|
79
|
+
NBoNUSD8WwvjaKA+chCy935do0CWRv7mJFlXMKtuAOTrkocjjhfXA79ZBIJSBXb7
|
80
|
+
09qioAVBl3FtKQStGvNJONyLyzT+W7QLxBjlUqcg1i1qsM1vF4eKT2uPQ1Creyzb
|
81
|
+
o74JJKlkbsQTFumDv6NFqfEnhc73cAw3LyWKHrB2cGmD0uxpqu6GfkzJcddcNw==
|
22
82
|
-----END CERTIFICATE-----
|
@@ -73,12 +73,8 @@ describe Reel::Connection do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
-
|
77
|
-
|
78
|
-
connection = Reel::Connection.new(peer)
|
79
|
-
client << ExampleRequest.new.to_s
|
80
|
-
request = connection.request
|
81
|
-
|
76
|
+
context "streams responses when transfer-encoding is chunked" do
|
77
|
+
def test_chunked_response(request, client)
|
82
78
|
# Sending transfer_encoding chunked without a body enables streaming mode
|
83
79
|
request.respond :ok, :transfer_encoding => :chunked
|
84
80
|
|
@@ -86,13 +82,13 @@ describe Reel::Connection do
|
|
86
82
|
request << "Hello"
|
87
83
|
request << "World"
|
88
84
|
request.finish_response # Write trailer and reset connection to header mode
|
89
|
-
connection.close
|
90
85
|
|
91
86
|
response = ""
|
92
87
|
|
93
88
|
begin
|
94
89
|
while chunk = client.readpartial(4096)
|
95
90
|
response << chunk
|
91
|
+
break if response =~ /0\r\n\r\n$/
|
96
92
|
end
|
97
93
|
rescue EOFError
|
98
94
|
end
|
@@ -101,19 +97,62 @@ describe Reel::Connection do
|
|
101
97
|
fixture = "5#{crlf}Hello#{crlf}5#{crlf}World#{crlf}0#{crlf*2}"
|
102
98
|
response[(response.length - fixture.length)..-1].should eq fixture
|
103
99
|
end
|
104
|
-
|
100
|
+
|
101
|
+
it "with keep-alive" do
|
102
|
+
with_socket_pair do |client, peer|
|
103
|
+
connection = Reel::Connection.new(peer)
|
104
|
+
client << ExampleRequest.new.to_s
|
105
|
+
request = connection.request
|
106
|
+
|
107
|
+
test_chunked_response(request, client)
|
108
|
+
connection.close
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "without keep-alive" do
|
113
|
+
with_socket_pair do |client, peer|
|
114
|
+
connection = Reel::Connection.new(peer)
|
115
|
+
client << ExampleRequest.new.tap{ |r|
|
116
|
+
r['Connection'] = 'close'
|
117
|
+
}.to_s
|
118
|
+
request = connection.request
|
119
|
+
|
120
|
+
test_chunked_response(request, client)
|
121
|
+
connection.close
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
it "with pipelined requests" do
|
126
|
+
with_socket_pair do |client, peer|
|
127
|
+
connection = Reel::Connection.new(peer)
|
128
|
+
|
129
|
+
2.times do
|
130
|
+
client << ExampleRequest.new.to_s
|
131
|
+
end
|
132
|
+
client << ExampleRequest.new.tap { |r|
|
133
|
+
r['Connection'] = 'close'
|
134
|
+
}.to_s
|
105
135
|
|
136
|
+
3.times do
|
137
|
+
request = connection.request
|
138
|
+
test_chunked_response(request, client)
|
139
|
+
end
|
140
|
+
connection.close
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
106
145
|
it "reset the request after a response is sent" do
|
107
146
|
with_socket_pair do |client, peer|
|
108
147
|
connection = Reel::Connection.new(peer)
|
109
148
|
example_request = ExampleRequest.new(:get, "/", "1.1", {'Connection' => 'close'})
|
110
149
|
client << example_request
|
111
150
|
|
112
|
-
connection.request.should_not
|
151
|
+
connection.request.should_not be_nil
|
113
152
|
|
114
153
|
connection.respond :ok, "Response sent"
|
115
154
|
|
116
|
-
connection.request.should
|
155
|
+
connection.request.should be_nil
|
117
156
|
end
|
118
157
|
end
|
119
158
|
|
@@ -127,7 +166,7 @@ describe Reel::Connection do
|
|
127
166
|
|
128
167
|
expect do
|
129
168
|
2.times { request = connection.request }
|
130
|
-
end.to raise_error(Reel::
|
169
|
+
end.to raise_error(Reel::StateError)
|
131
170
|
end
|
132
171
|
end
|
133
172
|
|