plum 0.0.1

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.
Files changed (56) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +4 -0
  5. data/Guardfile +7 -0
  6. data/LICENSE +21 -0
  7. data/README.md +14 -0
  8. data/Rakefile +12 -0
  9. data/bin/.gitkeep +0 -0
  10. data/examples/local_server.rb +206 -0
  11. data/examples/static_server.rb +157 -0
  12. data/lib/plum.rb +21 -0
  13. data/lib/plum/binary_string.rb +74 -0
  14. data/lib/plum/connection.rb +201 -0
  15. data/lib/plum/connection_utils.rb +38 -0
  16. data/lib/plum/errors.rb +35 -0
  17. data/lib/plum/event_emitter.rb +19 -0
  18. data/lib/plum/flow_control.rb +97 -0
  19. data/lib/plum/frame.rb +163 -0
  20. data/lib/plum/frame_factory.rb +53 -0
  21. data/lib/plum/frame_utils.rb +50 -0
  22. data/lib/plum/hpack/constants.rb +331 -0
  23. data/lib/plum/hpack/context.rb +55 -0
  24. data/lib/plum/hpack/decoder.rb +145 -0
  25. data/lib/plum/hpack/encoder.rb +105 -0
  26. data/lib/plum/hpack/huffman.rb +42 -0
  27. data/lib/plum/http_connection.rb +33 -0
  28. data/lib/plum/https_connection.rb +24 -0
  29. data/lib/plum/stream.rb +217 -0
  30. data/lib/plum/stream_utils.rb +58 -0
  31. data/lib/plum/version.rb +3 -0
  32. data/plum.gemspec +29 -0
  33. data/test/plum/connection/test_handle_frame.rb +70 -0
  34. data/test/plum/hpack/test_context.rb +63 -0
  35. data/test/plum/hpack/test_decoder.rb +291 -0
  36. data/test/plum/hpack/test_encoder.rb +49 -0
  37. data/test/plum/hpack/test_huffman.rb +36 -0
  38. data/test/plum/stream/test_handle_frame.rb +262 -0
  39. data/test/plum/test_binary_string.rb +64 -0
  40. data/test/plum/test_connection.rb +96 -0
  41. data/test/plum/test_connection_utils.rb +29 -0
  42. data/test/plum/test_error.rb +13 -0
  43. data/test/plum/test_flow_control.rb +167 -0
  44. data/test/plum/test_frame.rb +59 -0
  45. data/test/plum/test_frame_factory.rb +56 -0
  46. data/test/plum/test_frame_utils.rb +46 -0
  47. data/test/plum/test_https_connection.rb +37 -0
  48. data/test/plum/test_stream.rb +32 -0
  49. data/test/plum/test_stream_utils.rb +16 -0
  50. data/test/server.crt +19 -0
  51. data/test/server.csr +16 -0
  52. data/test/server.key +27 -0
  53. data/test/test_helper.rb +28 -0
  54. data/test/utils/assertions.rb +60 -0
  55. data/test/utils/server.rb +63 -0
  56. metadata +234 -0
@@ -0,0 +1,16 @@
1
+ require "test_helper"
2
+
3
+ using BinaryString
4
+
5
+ class StreamUtilsTest < Minitest::Test
6
+ def test_stream_promise
7
+ open_new_stream {|stream|
8
+ push_stream = stream.promise([])
9
+
10
+ assert(push_stream.id % 2 == 0)
11
+ assert(push_stream.id > stream.id)
12
+ assert_equal(stream, push_stream.parent)
13
+ assert_includes(stream.children, push_stream)
14
+ }
15
+ end
16
+ end
data/test/server.crt ADDED
@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDADCCAegCCQCasnaEkilFpDANBgkqhkiG9w0BAQsFADBCMQswCQYDVQQGEwJK
3
+ UDEOMAwGA1UECAwFVG9reW8xDzANBgNVBAoMBnJoZS5qcDESMBAGA1UEAwwJbG9j
4
+ YWxob3N0MB4XDTE1MDcyMDA2NTc1N1oXDTI1MDcxNzA2NTc1N1owQjELMAkGA1UE
5
+ BhMCSlAxDjAMBgNVBAgMBVRva3lvMQ8wDQYDVQQKDAZyaGUuanAxEjAQBgNVBAMM
6
+ CWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMTOiEAW
7
+ dc+SQ5DOXd/C6fFCj9Ykfk1ykFaYainKYjDkzdPC1oX7h0HCF7v5CJ4gPObuKtT0
8
+ YhQ74kiD0NbJGO0+KscZmmYaLbAmhNi1DDpv5c0mYmwzHR7I5qRbfbUlOnhHvwRX
9
+ XIzzUVVYTGExEYgrVLaLnVva+dRAs+yKGUkqwTG4lo7XVVS/f7UXLn8pJiRRzC34
10
+ kFoEwybWgjme1liC1M+oUft8rkrvZtgLsbZTifkM8uql9ytcIYVMxRteIy3d4W7I
11
+ Lh60SGMoRBSIC5T1OwuM2jjsMJTcmIntmRHutRKH62gqryyZzNqf7O/o28g3M/E0
12
+ 0qDCKqL0JjNM/m8CAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAW3bWpzS5p+QurVBt
13
+ wMgePDkv1OGb5suCYI3OHOry5j5uUSbZFMoQGxFDWlQkmRbPvWvkGB2lozcNy0Gd
14
+ qgknNgpxnv2gM6rBX93UE3Xez6q9H6+jlC4cdsGXqw/mC8VzxH/YkdkCfn2CrR/H
15
+ /dUy2++NtEKqbRBETRDB6tWM43K0fV1Ow/TketCBBztMTV0+smqc3dhKtv7wqcvD
16
+ E024K17wDStFp/pB6ZXY0K9wEZt+NFdyYo8IXmkyGKzIksDrvjL+2D4PdagEbz7J
17
+ bWhOWkMrJIawnhJm9+jf9I8c4VqumphM1lWcI1ZySTxVZV7jxOichE9PJJBpKiG8
18
+ 9jBWDg==
19
+ -----END CERTIFICATE-----
data/test/server.csr ADDED
@@ -0,0 +1,16 @@
1
+ -----BEGIN CERTIFICATE REQUEST-----
2
+ MIIChzCCAW8CAQAwQjELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRva3lvMQ8wDQYD
3
+ VQQKDAZyaGUuanAxEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEB
4
+ BQADggEPADCCAQoCggEBAMTOiEAWdc+SQ5DOXd/C6fFCj9Ykfk1ykFaYainKYjDk
5
+ zdPC1oX7h0HCF7v5CJ4gPObuKtT0YhQ74kiD0NbJGO0+KscZmmYaLbAmhNi1DDpv
6
+ 5c0mYmwzHR7I5qRbfbUlOnhHvwRXXIzzUVVYTGExEYgrVLaLnVva+dRAs+yKGUkq
7
+ wTG4lo7XVVS/f7UXLn8pJiRRzC34kFoEwybWgjme1liC1M+oUft8rkrvZtgLsbZT
8
+ ifkM8uql9ytcIYVMxRteIy3d4W7ILh60SGMoRBSIC5T1OwuM2jjsMJTcmIntmRHu
9
+ tRKH62gqryyZzNqf7O/o28g3M/E00qDCKqL0JjNM/m8CAwEAAaAAMA0GCSqGSIb3
10
+ DQEBCwUAA4IBAQA0SapSebe5VEfJ5fzNXufuhOUUdspm6bFN6uZgq7i3ayISvfL9
11
+ 8gsqAyUzsRCMlejUDgRzIHDJCrN9gWCs4+IrqC4YkIoetxH4hs9gxAS9wATcLQPN
12
+ iqe8/kJiput5kFjp+XPH21VSiDDCaJGuXmBMMywPvJwT2G4WbPZe1VbHplb3x50j
13
+ A/OZjh+Uvlej+gHWWP9YVoQmp4oLPfUpksF00z4gw6h8tgMoww4T0cGF/z/qa5Vy
14
+ yMJpRVGcQavhwV8lGpN6cNgtQQIal1kaKYcyOx9bDiWmzuMYAVUZ3KreqT5HpSVx
15
+ PT/yMIBzcSI/9rjTAlnyMbjxQFnrZYWsb/6e
16
+ -----END CERTIFICATE REQUEST-----
data/test/server.key ADDED
@@ -0,0 +1,27 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEAxM6IQBZ1z5JDkM5d38Lp8UKP1iR+TXKQVphqKcpiMOTN08LW
3
+ hfuHQcIXu/kIniA85u4q1PRiFDviSIPQ1skY7T4qxxmaZhotsCaE2LUMOm/lzSZi
4
+ bDMdHsjmpFt9tSU6eEe/BFdcjPNRVVhMYTERiCtUtoudW9r51ECz7IoZSSrBMbiW
5
+ jtdVVL9/tRcufykmJFHMLfiQWgTDJtaCOZ7WWILUz6hR+3yuSu9m2AuxtlOJ+Qzy
6
+ 6qX3K1whhUzFG14jLd3hbsguHrRIYyhEFIgLlPU7C4zaOOwwlNyYie2ZEe61Eofr
7
+ aCqvLJnM2p/s7+jbyDcz8TTSoMIqovQmM0z+bwIDAQABAoIBAHXtY8szKijU9dOB
8
+ NNLt0oyUW+fvOhdiPIcHESY1dRzjHUp0h2MFUwjeKqaiFL3bh2LA971fKp4BPBhD
9
+ lBH/sgYGqE9hUhk4OoRAsH3CDq+9eS+yfmtjPWHC9CEsCWlQA3crVpRdXMHA0s2W
10
+ +T2Lz3uOq1Yu1n3B+s1qb+We4oPqIkYj3qHpP+BxQYrL9y4L8Hk+dJZviYanlrcG
11
+ MV8CH8WnwqbwkQRDwxE04qALrOWeIE44zY/ZzNCOs8Q4MzyLRFSyAOURECoh4V//
12
+ 1eNZd0ojiyxRlpRuDkVt7zn6+FdxZrRySuJxEwFQ5Qanl37yMJb/NN8ill3D8T9L
13
+ vjRTwXECgYEA974PL0IVZmhuk5FcyObFaNDSL196evgUAnPxMQwATwXMzKPw6azE
14
+ rRnBopoS4zq4XWXWR/GAIskmF8vag9zf/za9f8QlJzqT3eQE4mGZeZfpic2WYtBZ
15
+ AojLgEwMGcof4TGHv0dCdSjuw95dXvL7qUopqfiB95TLSv2VXkW6arMCgYEAy13Z
16
+ K2RUt0DLafs/nmNywYDt/isMTTkL0tf4QjdB8Os4C1WcyMUSd1yYblrmsNN8/eWe
17
+ gOHrFt/zwD/kz0z5f/LBsIoEI3ZmJWjL29FQhSllM8q3JfkwCOfH5TmNDF/aAA1t
18
+ b0g+LSSxoUwttLu2euJk64uTGTWXrU+7BxVWq1UCgYAtaVRFOFrN28SxHgsg9FQp
19
+ Q2XTsy+zTLf2PyRt9iI0Wf7RYBev7bBbfoYk9RMTPdc/n4QoydbQCYkHAaH7W8hf
20
+ crxHqD+bMjyahspyaKuGQ1dWoC25zTETqtmKmeX58Dfpwnd8k2ZWLXuewarh1a5V
21
+ uLdsZZYFOOwOwe7YSfXCywKBgQCU2HCd2MZEhhEb1b/fjowsYtBOKnXLg4hK3rWe
22
+ yVDjI1YWvaeOLudwI36RrsiP/YrLTievzyrAyFNgj6NJst4eLrBjJPEYf40NrmEe
23
+ 11mmzQB8Ys+f5H2q1vIwrOm2d+VYCnvhai/P3L6B/v6o/Ib39AHHgJW+asJEIEoU
24
+ SiLwLQKBgHEY7WLyqs7dPf9ZxJErZH2eTstMtj649750GsfQGqr0Ul/zWWSq6QPJ
25
+ lzVB2B+g/m6xnPQjn7dXPLeZ3lLbmcLTpl5O9T65qDXgVIzKPX4Ybd4ozjDOfHW5
26
+ u5vKC+xEwJK+17JJ78Mb8XH7vmujCmKLueEuZtgrT6P9Cke26yEN
27
+ -----END RSA PRIVATE KEY-----
@@ -0,0 +1,28 @@
1
+ LISTEN_PORT = ENV["PLUM_LISTEN_PORT"] || 40444
2
+
3
+ unless ENV["SKIP_COVERAGE"]
4
+ begin
5
+ require "simplecov"
6
+ require "codeclimate-test-reporter"
7
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
+ SimpleCov::Formatter::HTMLFormatter,
9
+ CodeClimate::TestReporter::Formatter
10
+ ]
11
+ SimpleCov.start do
12
+ add_filter "test/"
13
+ end
14
+ rescue LoadError
15
+ end
16
+ end
17
+
18
+ require "timeout"
19
+ require "minitest"
20
+ require "minitest/unit"
21
+ require "minitest/autorun"
22
+ require "minitest/pride"
23
+ require "plum"
24
+ include Plum
25
+
26
+ Dir.glob(File.expand_path("../utils/*.rb", __FILE__)).each do |file|
27
+ require file
28
+ end
@@ -0,0 +1,60 @@
1
+ module CustomAssertions
2
+ def assert_connection_error(type, &blk)
3
+ assert_http_error(Plum::ConnectionError, type, &blk)
4
+ end
5
+
6
+ def assert_stream_error(type, &blk)
7
+ assert_http_error(Plum::StreamError, type, &blk)
8
+ end
9
+
10
+ def assert_no_error(stream: nil, connection: nil, &blk)
11
+ Plum::ConnectionError.reset
12
+ Plum::StreamError.reset
13
+ begin
14
+ blk.call
15
+ rescue Plum::HTTPError
16
+ end
17
+ assert_nil(Plum::StreamError.last, "No stream error expected but raised: #{Plum::StreamError.last}")
18
+ assert_nil(Plum::ConnectionError.last, "No connection error expected but raised: #{Plum::ConnectionError.last}")
19
+ end
20
+
21
+ def assert_frame(frame, **args)
22
+ args.each do |name, value|
23
+ assert_equal(value, frame.__send__(name))
24
+ end
25
+ end
26
+
27
+ private
28
+ def assert_http_error(klass, type, &blk)
29
+ klass.reset
30
+ begin
31
+ blk.call
32
+ rescue klass
33
+ end
34
+ last = klass.last
35
+ assert(last, "#{klass.name} type: #{type} expected but nothing was raised.")
36
+ assert_equal(type, last, "#{klass.name} type: #{type} expected but type: #{last} was raised.")
37
+ end
38
+ end
39
+ Minitest::Test.__send__(:prepend, CustomAssertions)
40
+
41
+ module LastErrorExtension
42
+ def initialize(type, message = nil)
43
+ super
44
+ self.class.last = type
45
+ end
46
+
47
+ module ClassMethods
48
+ attr_accessor :last
49
+ def reset
50
+ self.last = nil
51
+ end
52
+ end
53
+
54
+ def self.prepended(base)
55
+ base.extend(ClassMethods)
56
+ base.reset
57
+ end
58
+ end
59
+ Plum::ConnectionError.__send__(:prepend, LastErrorExtension)
60
+ Plum::StreamError.__send__(:prepend, LastErrorExtension)
@@ -0,0 +1,63 @@
1
+ require "timeout"
2
+
3
+ module ServerUtils
4
+ def open_server_connection(scheme = :https)
5
+ io = StringIO.new
6
+ @_con = (scheme == :https ? HTTPSConnection : HTTPConnection).new(io)
7
+ @_con << Connection::CLIENT_CONNECTION_PREFACE
8
+ @_con << Frame.new(type: :settings, stream_id: 0).assemble
9
+ if block_given?
10
+ yield @_con
11
+ else
12
+ @_con
13
+ end
14
+ end
15
+
16
+ def open_new_stream(arg1 = nil, **kwargs)
17
+ if arg1.is_a?(Connection)
18
+ con = arg1
19
+ else
20
+ con = open_server_connection
21
+ end
22
+
23
+ @_stream = con.instance_eval {
24
+ new_stream((con.streams.keys.last||0/2)*2+1, **kwargs)
25
+ }
26
+ if block_given?
27
+ yield @_stream
28
+ else
29
+ @_stream
30
+ end
31
+ end
32
+
33
+ def sent_frames(con = nil)
34
+ resp = (con || @_con).io.string.dup
35
+ frames = []
36
+ while f = Frame.parse!(resp)
37
+ frames << f
38
+ end
39
+ frames
40
+ end
41
+
42
+ def capture_frames(con = nil, &blk)
43
+ io = (con || @_con).io
44
+ pos = io.string.bytesize
45
+ blk.call
46
+ resp = io.string.byteslice(pos, io.string.bytesize - pos)
47
+ frames = []
48
+ while f = Frame.parse!(resp)
49
+ frames << f
50
+ end
51
+ frames
52
+ end
53
+
54
+ def capture_frame(con = nil, &blk)
55
+ frames = capture_frames(con, &blk)
56
+ assert_equal(1, frames.size, "Supplied block sent no frames or more than 1 frame")
57
+ frames.first
58
+ end
59
+ end
60
+
61
+ class Minitest::Test
62
+ include ServerUtils
63
+ end
metadata ADDED
@@ -0,0 +1,234 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: plum
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - rhenium
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: yard
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 5.7.0
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 5.7.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: codeclimate-test-reporter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: guard
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: guard-minitest
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: A minimal implementation of HTTP/2 server.
126
+ email:
127
+ - k@rhe.jp
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".travis.yml"
134
+ - Gemfile
135
+ - Guardfile
136
+ - LICENSE
137
+ - README.md
138
+ - Rakefile
139
+ - bin/.gitkeep
140
+ - examples/local_server.rb
141
+ - examples/static_server.rb
142
+ - lib/plum.rb
143
+ - lib/plum/binary_string.rb
144
+ - lib/plum/connection.rb
145
+ - lib/plum/connection_utils.rb
146
+ - lib/plum/errors.rb
147
+ - lib/plum/event_emitter.rb
148
+ - lib/plum/flow_control.rb
149
+ - lib/plum/frame.rb
150
+ - lib/plum/frame_factory.rb
151
+ - lib/plum/frame_utils.rb
152
+ - lib/plum/hpack/constants.rb
153
+ - lib/plum/hpack/context.rb
154
+ - lib/plum/hpack/decoder.rb
155
+ - lib/plum/hpack/encoder.rb
156
+ - lib/plum/hpack/huffman.rb
157
+ - lib/plum/http_connection.rb
158
+ - lib/plum/https_connection.rb
159
+ - lib/plum/stream.rb
160
+ - lib/plum/stream_utils.rb
161
+ - lib/plum/version.rb
162
+ - plum.gemspec
163
+ - test/plum/connection/test_handle_frame.rb
164
+ - test/plum/hpack/test_context.rb
165
+ - test/plum/hpack/test_decoder.rb
166
+ - test/plum/hpack/test_encoder.rb
167
+ - test/plum/hpack/test_huffman.rb
168
+ - test/plum/stream/test_handle_frame.rb
169
+ - test/plum/test_binary_string.rb
170
+ - test/plum/test_connection.rb
171
+ - test/plum/test_connection_utils.rb
172
+ - test/plum/test_error.rb
173
+ - test/plum/test_flow_control.rb
174
+ - test/plum/test_frame.rb
175
+ - test/plum/test_frame_factory.rb
176
+ - test/plum/test_frame_utils.rb
177
+ - test/plum/test_https_connection.rb
178
+ - test/plum/test_stream.rb
179
+ - test/plum/test_stream_utils.rb
180
+ - test/server.crt
181
+ - test/server.csr
182
+ - test/server.key
183
+ - test/test_helper.rb
184
+ - test/utils/assertions.rb
185
+ - test/utils/server.rb
186
+ homepage: https://github.com/rhenium/plum
187
+ licenses:
188
+ - MIT
189
+ metadata: {}
190
+ post_install_message:
191
+ rdoc_options: []
192
+ require_paths:
193
+ - lib
194
+ required_ruby_version: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ required_rubygems_version: !ruby/object:Gem::Requirement
200
+ requirements:
201
+ - - ">="
202
+ - !ruby/object:Gem::Version
203
+ version: '0'
204
+ requirements: []
205
+ rubyforge_project:
206
+ rubygems_version: 2.5.0
207
+ signing_key:
208
+ specification_version: 4
209
+ summary: A minimal implementation of HTTP/2 server.
210
+ test_files:
211
+ - test/plum/connection/test_handle_frame.rb
212
+ - test/plum/hpack/test_context.rb
213
+ - test/plum/hpack/test_decoder.rb
214
+ - test/plum/hpack/test_encoder.rb
215
+ - test/plum/hpack/test_huffman.rb
216
+ - test/plum/stream/test_handle_frame.rb
217
+ - test/plum/test_binary_string.rb
218
+ - test/plum/test_connection.rb
219
+ - test/plum/test_connection_utils.rb
220
+ - test/plum/test_error.rb
221
+ - test/plum/test_flow_control.rb
222
+ - test/plum/test_frame.rb
223
+ - test/plum/test_frame_factory.rb
224
+ - test/plum/test_frame_utils.rb
225
+ - test/plum/test_https_connection.rb
226
+ - test/plum/test_stream.rb
227
+ - test/plum/test_stream_utils.rb
228
+ - test/server.crt
229
+ - test/server.csr
230
+ - test/server.key
231
+ - test/test_helper.rb
232
+ - test/utils/assertions.rb
233
+ - test/utils/server.rb
234
+ has_rdoc: