rflow-components-http 1.0.0a2 → 1.0.0a3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rspec +1 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/lib/rflow/components/http/extensions.rb +1 -6
- data/lib/rflow/components/http/server.rb +40 -48
- data/lib/rflow/components/http/version.rb +1 -1
- data/rflow-components-http.gemspec +4 -3
- data/spec/rflow/components/http/extensions/extensions_spec.rb +41 -0
- data/spec/rflow/components/http/server_spec.rb +44 -0
- data/spec/schema_spec.rb +26 -32
- data/spec/spec_helper.rb +3 -4
- metadata +46 -39
- data/lib/rflow/components/http/client.rb +0 -0
- data/spec/extensions_spec.rb +0 -43
- data/spec/http_server_spec.rb +0 -46
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 7c8e0aafd255f7936e411610a811d1af425de6a5
|
4
|
+
data.tar.gz: 733e7ea0910aca051f9979f0a58a2982ab645cc6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ecde2cf8d154c68120901bebb4f7abaf80af439384e7ae314a994761b8f58b222e0d0862aea45ed2ba0f211e82fa144f3e6bcaf4b7fc36e20110bef838aa3469
|
7
|
+
data.tar.gz: dc580c77986021c51228604bea59a575cf91e84aaeaffcdf2a14e446c93bb3574df1bcd5a27637f12733f1752b06d66f98cd778081fbb7029b4e2aaf873df6e2
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color -fd
|
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rflow-dev
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.1.1
|
@@ -1,10 +1,7 @@
|
|
1
1
|
class RFlow
|
2
2
|
module Components
|
3
3
|
module HTTP
|
4
|
-
|
5
|
-
# The set of extensions to add capability to HTTP data types
|
6
4
|
module Extensions
|
7
|
-
|
8
5
|
module IPConnectionExtension
|
9
6
|
# Default accessors
|
10
7
|
# TODO: validate the stuffs
|
@@ -21,7 +18,7 @@ class RFlow
|
|
21
18
|
# Need to be careful when extending to not clobber data already in data_object
|
22
19
|
module HTTPRequestExtension
|
23
20
|
def self.extended(base_data)
|
24
|
-
base_data.data_object ||= {'uri' => '/', 'method' => 'GET', 'protocol' => 'HTTP/1.0', 'headers'=>{}, 'content' => ''}
|
21
|
+
base_data.data_object ||= {'uri' => '/', 'method' => 'GET', 'protocol' => 'HTTP/1.0', 'headers' => {}, 'content' => ''}
|
25
22
|
end
|
26
23
|
|
27
24
|
# Default accessors
|
@@ -59,9 +56,7 @@ class RFlow
|
|
59
56
|
data_object[name] = args.first.to_i
|
60
57
|
end
|
61
58
|
end
|
62
|
-
|
63
59
|
end
|
64
|
-
|
65
60
|
end
|
66
61
|
end
|
67
62
|
end
|
@@ -1,12 +1,10 @@
|
|
1
1
|
require 'eventmachine'
|
2
2
|
require 'evma_httpserver'
|
3
|
-
|
4
3
|
require 'rflow'
|
5
4
|
|
6
5
|
class RFlow
|
7
6
|
module Components
|
8
7
|
module HTTP
|
9
|
-
|
10
8
|
class Server < RFlow::Component
|
11
9
|
input_port :response_port
|
12
10
|
output_port :request_port
|
@@ -16,7 +14,7 @@ class RFlow
|
|
16
14
|
def configure!(config)
|
17
15
|
@listen = config['listen'] ? config['listen'] : '127.0.0.1'
|
18
16
|
@port = config['port'] ? config['port'].to_i : 8000
|
19
|
-
@connections =
|
17
|
+
@connections = {}
|
20
18
|
end
|
21
19
|
|
22
20
|
def run!
|
@@ -58,59 +56,55 @@ class RFlow
|
|
58
56
|
no_environment_strings
|
59
57
|
end
|
60
58
|
|
61
|
-
|
62
59
|
def receive_data(data)
|
63
60
|
RFlow.logger.debug { "#{self.class.name}: Received #{data.bytesize} bytes of data from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port}" }
|
64
61
|
super
|
65
62
|
end
|
66
63
|
|
67
|
-
|
68
64
|
def process_http_request
|
69
65
|
RFlow.logger.debug { "#{self.class.name}: Received HTTP request from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port} for #{@http_request_uri}" }
|
70
66
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
name, val = header.split(/:\s*/, 2)
|
89
|
-
request_message.data.headers[name] = val
|
90
|
-
end
|
91
|
-
|
92
|
-
processing_event.context = signature.to_s
|
93
|
-
processing_event.completed_at = Time.now.utc
|
94
|
-
request_message.provenance << processing_event
|
67
|
+
server.request_port.send_message(RFlow::Message.new('RFlow::Message::Data::HTTP::Request').tap do |m|
|
68
|
+
m.data.client_ip = @client_ip
|
69
|
+
m.data.client_port = @client_port
|
70
|
+
m.data.server_ip = @server_ip
|
71
|
+
m.data.server_port = @server_port
|
72
|
+
|
73
|
+
m.data.method = @http_request_method
|
74
|
+
m.data.uri = @http_request_uri
|
75
|
+
m.data.query_string = @http_query_string
|
76
|
+
m.data.protocol = @http_protocol
|
77
|
+
m.data.content = @http_post_content
|
78
|
+
m.data.headers = {}
|
79
|
+
|
80
|
+
@http_headers.split(/\0/).each do |header|
|
81
|
+
name, val = header.split(/:\s*/, 2)
|
82
|
+
m.data.headers[name] = val
|
83
|
+
end
|
95
84
|
|
96
|
-
|
85
|
+
m.provenance << RFlow::Message::ProcessingEvent.new(server.uuid, Time.now.utc).tap do |e|
|
86
|
+
e.context = signature.to_s
|
87
|
+
e.completed_at = Time.now.utc
|
88
|
+
end
|
89
|
+
end)
|
90
|
+
rescue Exception => e
|
91
|
+
RFlow.logger.error "Error processing HTTP request from #{client_ip}:#{client_port} to #{@server_ip}:#{@server_port} for #{@http_request_uri}: #{e.class.name}: #{e.message}, because: #{e.backtrace.inspect}"
|
97
92
|
end
|
98
93
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
resp.headers[header] = value
|
94
|
+
def send_http_response(response_message = nil)
|
95
|
+
resp = EventMachine::DelegatedHttpResponse.new(self).tap do |r|
|
96
|
+
# Default values
|
97
|
+
r.status = 200
|
98
|
+
r.content = ""
|
99
|
+
r.headers["Content-Type"] = "text/html"
|
100
|
+
r.headers["Server"] = "Apache"
|
101
|
+
|
102
|
+
if response_message
|
103
|
+
r.status = response_message.data.status_code
|
104
|
+
r.content = response_message.data.content
|
105
|
+
response_message.data.headers.each do |header, value|
|
106
|
+
r.headers[header] = value
|
107
|
+
end
|
114
108
|
end
|
115
109
|
end
|
116
110
|
|
@@ -120,17 +114,15 @@ class RFlow
|
|
120
114
|
close_connection_after_writing
|
121
115
|
end
|
122
116
|
|
123
|
-
|
124
117
|
# Called when a connection is torn down for whatever reason.
|
125
118
|
# Remove this connection from the server's list
|
126
|
-
def unbind(reason=nil)
|
119
|
+
def unbind(reason = nil)
|
127
120
|
RFlow.logger.debug { "#{self.class.name}: Disconnected from HTTP client #{client_ip}:#{client_port}#{reason.nil? ? '' : " due to '#{reason}'"}" }
|
128
121
|
server.connections.delete(self.signature.to_s)
|
129
122
|
super()
|
130
123
|
end
|
131
124
|
end
|
132
125
|
end
|
133
|
-
|
134
126
|
end
|
135
127
|
end
|
136
128
|
end
|
@@ -21,9 +21,10 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
22
22
|
s.require_paths = ["lib"]
|
23
23
|
|
24
|
-
s.add_dependency 'rflow', '~> 1.0.
|
25
|
-
s.add_dependency '
|
24
|
+
s.add_dependency 'rflow', '~> 1.0.0a2'
|
25
|
+
s.add_dependency 'eventmachine_httpserver_update', '~> 0.2.1'
|
26
26
|
|
27
|
-
s.add_development_dependency 'rspec', '~> 2.
|
27
|
+
s.add_development_dependency 'rspec', '~> 2.99'
|
28
|
+
s.add_development_dependency 'rspec-collection_matchers', '~> 0.0.4'
|
28
29
|
s.add_development_dependency 'rake', '~> 0.8'
|
29
30
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class RFlow
|
4
|
+
module Components
|
5
|
+
module HTTP
|
6
|
+
module Extensions
|
7
|
+
describe HTTPRequestExtension do
|
8
|
+
it "should work" do
|
9
|
+
Configuration.available_data_extensions['RFlow::Message::Data::HTTP::Request'].should include(described_class)
|
10
|
+
|
11
|
+
Message.new('RFlow::Message::Data::HTTP::Request').data.tap do |d|
|
12
|
+
d.uri.should == '/'
|
13
|
+
d.method.should == 'GET'
|
14
|
+
d.query_string.should == nil
|
15
|
+
d.protocol.should == 'HTTP/1.0'
|
16
|
+
d.headers.should == {}
|
17
|
+
d.uri = '/foo'
|
18
|
+
d.uri.should == '/foo'
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe HTTPResponseExtension do
|
24
|
+
it "should work" do
|
25
|
+
Configuration.available_data_extensions['RFlow::Message::Data::HTTP::Response'].should include(described_class)
|
26
|
+
|
27
|
+
Message.new('RFlow::Message::Data::HTTP::Response').data.tap do |d|
|
28
|
+
d.protocol.should == 'HTTP/1.0'
|
29
|
+
d.status_code.should == 200
|
30
|
+
d.status_reason_phrase.should == 'OK'
|
31
|
+
d.headers.should == {}
|
32
|
+
d.content.should == ''
|
33
|
+
d.status_code = 404
|
34
|
+
d.status_code.should == 404
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class RFlow
|
4
|
+
module Components
|
5
|
+
module HTTP
|
6
|
+
describe Server do
|
7
|
+
let(:conn) { Server::Connection.new('a') }
|
8
|
+
|
9
|
+
it "should return a default HTTP response" do
|
10
|
+
conn.should_receive(:send_data).with("HTTP/1.1 200 OK\r\nContent-Length: 0\r\nContent-Type: text/html\r\nServer: Apache\r\n\r\n")
|
11
|
+
conn.should_receive(:send_data).with('')
|
12
|
+
conn.stub(:close_connection)
|
13
|
+
|
14
|
+
conn.send_http_response(Message.new("RFlow::Message::Data::HTTP::Response"))
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should use proper status reason phrases" do
|
18
|
+
conn.should_receive(:send_data).with("HTTP/1.1 404 Not Found\r\nContent-Length: 0\r\nContent-Type: text/html\r\nServer: Apache\r\n\r\n")
|
19
|
+
conn.should_receive(:send_data).with('')
|
20
|
+
conn.stub(:close_connection)
|
21
|
+
|
22
|
+
conn.send_http_response(Message.new("RFlow::Message::Data::HTTP::Response").tap {|r| r.data.status_code = 404 })
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should return a fully configured HTTP response" do
|
26
|
+
m = Message.new("RFlow::Message::Data::HTTP::Response").tap do |m|
|
27
|
+
m.data.status_code = 1337
|
28
|
+
m.data.status_reason_phrase = "JUST BECAUSE" # ignored as status phrases are overwritten
|
29
|
+
m.data.headers['Boom'] = 'Town'
|
30
|
+
m.data.content = 'boom'
|
31
|
+
end
|
32
|
+
|
33
|
+
expected_body = "boom"
|
34
|
+
|
35
|
+
conn.should_receive(:send_data).with("HTTP/1.1 1337\r\nBoom: Town\r\nContent-Length: 4\r\nContent-Type: text/html\r\nServer: Apache\r\n\r\n")
|
36
|
+
conn.should_receive(:send_data).with('boom')
|
37
|
+
conn.stub(:close_connection)
|
38
|
+
|
39
|
+
conn.send_http_response(m)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/spec/schema_spec.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'spec_helper
|
1
|
+
require 'spec_helper'
|
2
2
|
|
3
3
|
describe 'RFlow::Message::Data::HTTP::Request Avro Schema' do
|
4
|
-
|
5
|
-
@schema_string = RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Request']['avro']
|
6
|
-
end
|
4
|
+
let(:schema) { RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Request']['avro'] }
|
7
5
|
|
8
6
|
it "should encode and decode an object" do
|
9
7
|
request = {
|
@@ -18,26 +16,23 @@ describe 'RFlow::Message::Data::HTTP::Request Avro Schema' do
|
|
18
16
|
'content' => '',
|
19
17
|
}
|
20
18
|
|
21
|
-
expect {encode_avro(
|
22
|
-
|
23
|
-
|
24
|
-
expect {decode_avro(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
19
|
+
expect { encode_avro(schema, request) }.to_not raise_error
|
20
|
+
encoded_request = encode_avro(schema, request)
|
21
|
+
|
22
|
+
expect { decode_avro(schema, encoded_request) }.to_not raise_error
|
23
|
+
decode_avro(schema, encoded_request).tap do |decoded|
|
24
|
+
decoded['method'].should == request['method']
|
25
|
+
decoded['uri'].should == request['uri']
|
26
|
+
decoded['query_string'].should == request['query_string']
|
27
|
+
decoded['protocol'].should == request['protocol']
|
28
|
+
decoded['headers'].should == request['headers']
|
29
|
+
decoded['content'].should == request['content']
|
30
|
+
end
|
33
31
|
end
|
34
32
|
end
|
35
33
|
|
36
|
-
|
37
34
|
describe 'RFlow::Message::Data::HTTP::Response Avro Schema' do
|
38
|
-
|
39
|
-
@schema_string = RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Response']['avro']
|
40
|
-
end
|
35
|
+
let(:schema) { RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Response']['avro'] }
|
41
36
|
|
42
37
|
it "should encode and decode an object" do
|
43
38
|
response = {
|
@@ -51,17 +46,16 @@ describe 'RFlow::Message::Data::HTTP::Response Avro Schema' do
|
|
51
46
|
'content' => 'CONTENT',
|
52
47
|
}
|
53
48
|
|
54
|
-
expect {encode_avro(
|
55
|
-
|
56
|
-
|
57
|
-
expect {decode_avro(
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
49
|
+
expect { encode_avro(schema, response) }.to_not raise_error
|
50
|
+
encoded_response = encode_avro(schema, response)
|
51
|
+
|
52
|
+
expect { decode_avro(schema, encoded_response) }.to_not raise_error
|
53
|
+
decode_avro(schema, encoded_response).tap do |decoded|
|
54
|
+
decoded['protocol'].should == response['protocol']
|
55
|
+
decoded['status_code'].should == response['status_code']
|
56
|
+
decoded['status_reason_phrase'].should == response['status_reason_phrase']
|
57
|
+
decoded['headers'].should == response['headers']
|
58
|
+
decoded['content'].should == response['content']
|
59
|
+
end
|
65
60
|
end
|
66
61
|
end
|
67
|
-
|
data/spec/spec_helper.rb
CHANGED
@@ -1,13 +1,12 @@
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'rflow-components-http'))
|
2
|
-
|
3
1
|
require 'logger'
|
2
|
+
require 'rflow-components-http'
|
4
3
|
|
5
4
|
RFlow.logger = Logger.new STDOUT
|
5
|
+
RFlow.logger.level = 5
|
6
6
|
|
7
7
|
def decode_avro(schema_string, serialized_object)
|
8
8
|
schema = Avro::Schema.parse(schema_string)
|
9
|
-
|
10
|
-
Avro::IO::DatumReader.new(schema, schema).read Avro::IO::BinaryDecoder.new(sio)
|
9
|
+
Avro::IO::DatumReader.new(schema, schema).read Avro::IO::BinaryDecoder.new(StringIO.new(serialized_object))
|
11
10
|
end
|
12
11
|
|
13
12
|
def encode_avro(schema_string, object)
|
metadata
CHANGED
@@ -1,78 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rflow-components-http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease: 5
|
4
|
+
version: 1.0.0a3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michael L. Artz
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2014-04
|
11
|
+
date: 2014-06-04 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rflow
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- - ~>
|
17
|
+
- - "~>"
|
20
18
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.0.
|
19
|
+
version: 1.0.0a2
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- - ~>
|
24
|
+
- - "~>"
|
28
25
|
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.
|
26
|
+
version: 1.0.0a2
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
|
-
name:
|
28
|
+
name: eventmachine_httpserver_update
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- - ~>
|
31
|
+
- - "~>"
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: 0.2.1
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- - ~>
|
38
|
+
- - "~>"
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: 0.2.1
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: rspec
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- - ~>
|
45
|
+
- - "~>"
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: '2.
|
47
|
+
version: '2.99'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- - ~>
|
52
|
+
- - "~>"
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: '2.
|
54
|
+
version: '2.99'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec-collection_matchers
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.0.4
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.0.4
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: rake
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
|
-
- - ~>
|
73
|
+
- - "~>"
|
68
74
|
- !ruby/object:Gem::Version
|
69
75
|
version: '0.8'
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
|
-
- - ~>
|
80
|
+
- - "~>"
|
76
81
|
- !ruby/object:Gem::Version
|
77
82
|
version: '0.8'
|
78
83
|
description: HTTP client and server components for the RFlow FBP framework. Also
|
@@ -83,52 +88,54 @@ executables: []
|
|
83
88
|
extensions: []
|
84
89
|
extra_rdoc_files: []
|
85
90
|
files:
|
86
|
-
- .gitignore
|
87
|
-
- .
|
91
|
+
- ".gitignore"
|
92
|
+
- ".rspec"
|
93
|
+
- ".ruby-gemset"
|
94
|
+
- ".ruby-version"
|
95
|
+
- ".travis.yml"
|
88
96
|
- Gemfile
|
89
97
|
- LICENSE
|
90
98
|
- README.md
|
91
99
|
- Rakefile
|
92
100
|
- lib/rflow-components-http.rb
|
93
101
|
- lib/rflow/components/http.rb
|
94
|
-
- lib/rflow/components/http/client.rb
|
95
102
|
- lib/rflow/components/http/extensions.rb
|
96
103
|
- lib/rflow/components/http/server.rb
|
97
104
|
- lib/rflow/components/http/version.rb
|
98
105
|
- rflow-components-http.gemspec
|
99
106
|
- schema/http_request.avsc
|
100
107
|
- schema/http_response.avsc
|
101
|
-
- spec/extensions_spec.rb
|
102
|
-
- spec/
|
108
|
+
- spec/rflow/components/http/extensions/extensions_spec.rb
|
109
|
+
- spec/rflow/components/http/server_spec.rb
|
103
110
|
- spec/schema_spec.rb
|
104
111
|
- spec/spec_helper.rb
|
105
112
|
homepage: https://github.com/redjack/rflow-components-http
|
106
113
|
licenses:
|
107
114
|
- Apache-2.0
|
115
|
+
metadata: {}
|
108
116
|
post_install_message:
|
109
117
|
rdoc_options: []
|
110
118
|
require_paths:
|
111
119
|
- lib
|
112
120
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
121
|
requirements:
|
115
|
-
- -
|
122
|
+
- - ">="
|
116
123
|
- !ruby/object:Gem::Version
|
117
124
|
version: '1.9'
|
118
125
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
126
|
requirements:
|
121
|
-
- -
|
127
|
+
- - ">"
|
122
128
|
- !ruby/object:Gem::Version
|
123
129
|
version: 1.3.1
|
124
130
|
requirements: []
|
125
131
|
rubyforge_project: rflow-components-http
|
126
|
-
rubygems_version:
|
132
|
+
rubygems_version: 2.2.2
|
127
133
|
signing_key:
|
128
|
-
specification_version:
|
134
|
+
specification_version: 4
|
129
135
|
summary: HTTP client and server components for the RFlow FBP framework
|
130
136
|
test_files:
|
131
|
-
- spec/extensions_spec.rb
|
132
|
-
- spec/
|
137
|
+
- spec/rflow/components/http/extensions/extensions_spec.rb
|
138
|
+
- spec/rflow/components/http/server_spec.rb
|
133
139
|
- spec/schema_spec.rb
|
134
140
|
- spec/spec_helper.rb
|
141
|
+
has_rdoc:
|
File without changes
|
data/spec/extensions_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'spec_helper.rb'
|
2
|
-
|
3
|
-
describe RFlow::Components::HTTP::Extensions::HTTPRequestExtension do
|
4
|
-
before(:each) do
|
5
|
-
@schema_string = RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Request']['avro']
|
6
|
-
end
|
7
|
-
|
8
|
-
it "should work" do
|
9
|
-
RFlow::Configuration.available_data_extensions['RFlow::Message::Data::HTTP::Request'].should include(described_class)
|
10
|
-
|
11
|
-
request = RFlow::Message.new('RFlow::Message::Data::HTTP::Request')
|
12
|
-
request.data.uri.should == '/'
|
13
|
-
request.data.method.should == 'GET'
|
14
|
-
request.data.query_string.should == nil
|
15
|
-
request.data.protocol.should == 'HTTP/1.0'
|
16
|
-
request.data.headers.should == {}
|
17
|
-
|
18
|
-
request.data.uri = 'POST'
|
19
|
-
request.data.uri.should == 'POST'
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
|
24
|
-
describe RFlow::Components::HTTP::Extensions::HTTPResponseExtension do
|
25
|
-
before(:each) do
|
26
|
-
@schema_string = RFlow::Configuration.available_data_types['RFlow::Message::Data::HTTP::Response']['avro']
|
27
|
-
end
|
28
|
-
|
29
|
-
it "should work" do
|
30
|
-
RFlow::Configuration.available_data_extensions['RFlow::Message::Data::HTTP::Response'].should include(described_class)
|
31
|
-
|
32
|
-
response = RFlow::Message.new('RFlow::Message::Data::HTTP::Response')
|
33
|
-
response.data.protocol.should == 'HTTP/1.0'
|
34
|
-
response.data.status_code.should == 200
|
35
|
-
response.data.status_reason_phrase.should == 'OK'
|
36
|
-
response.data.headers.should == {}
|
37
|
-
response.data.content.should == ''
|
38
|
-
|
39
|
-
response.data.status_code = 404
|
40
|
-
response.data.status_code.should == 404
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
data/spec/http_server_spec.rb
DELETED
@@ -1,46 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe RFlow::Components::HTTP::Server do
|
4
|
-
|
5
|
-
it "should return a default HTTP response" do
|
6
|
-
c = RFlow::Components::HTTP::Server::Connection.new('a')
|
7
|
-
m = RFlow::Message.new("RFlow::Message::Data::HTTP::Response")
|
8
|
-
|
9
|
-
expected_header = "HTTP/1.1 200 ...\r\nContent-Type: text/html\r\nContent-length: 0\r\nServer: Apache\r\n\r\n"
|
10
|
-
expected_body = ""
|
11
|
-
|
12
|
-
c.should_receive(:send_data) do |header|
|
13
|
-
header.should == expected_header
|
14
|
-
end
|
15
|
-
c.should_receive(:send_data) do |body|
|
16
|
-
body.should == expected_body
|
17
|
-
end
|
18
|
-
c.should_receive(:close_connection).any_number_of_times
|
19
|
-
|
20
|
-
c.send_http_response(m)
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should return a fully configured HTTP response" do
|
24
|
-
c = RFlow::Components::HTTP::Server::Connection.new('a')
|
25
|
-
|
26
|
-
m = RFlow::Message.new("RFlow::Message::Data::HTTP::Response")
|
27
|
-
m.data.status_code = 1337
|
28
|
-
m.data.status_reason_phrase = "JUST BECAUSE"
|
29
|
-
m.data.headers['Boom'] = 'Town'
|
30
|
-
m.data.content = 'boom'
|
31
|
-
|
32
|
-
expected_header = "HTTP/1.1 1337 ...\r\nBoom: Town\r\nContent-Type: text/html\r\nContent-length: 4\r\nServer: Apache\r\n\r\n"
|
33
|
-
expected_body = "boom"
|
34
|
-
|
35
|
-
c.should_receive(:send_data) do |header|
|
36
|
-
header.should == expected_header
|
37
|
-
end
|
38
|
-
c.should_receive(:send_data) do |body|
|
39
|
-
body.should == expected_body
|
40
|
-
end
|
41
|
-
c.should_receive(:close_connection).any_number_of_times
|
42
|
-
|
43
|
-
c.send_http_response(m)
|
44
|
-
end
|
45
|
-
|
46
|
-
end
|