david 0.3.0.pre
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.
- checksums.yaml +7 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +51 -0
- data/LICENSE +674 -0
- data/README.md +5 -0
- data/Rakefile +6 -0
- data/bin/david +11 -0
- data/config.ru +4 -0
- data/david.gemspec +26 -0
- data/lib/david.rb +33 -0
- data/lib/david/guerilla/rack/handler.rb +21 -0
- data/lib/david/railties/config.rb +9 -0
- data/lib/david/railties/middleware.rb +31 -0
- data/lib/david/server.rb +62 -0
- data/lib/david/server/mapping.rb +32 -0
- data/lib/david/server/options.rb +47 -0
- data/lib/david/server/response.rb +124 -0
- data/lib/david/server/utility.rb +19 -0
- data/lib/david/version.rb +7 -0
- data/lib/david/well_known.rb +59 -0
- data/lib/rack/handler/coap.rb +6 -0
- data/lib/rack/handler/david.rb +35 -0
- data/lib/rack/hello_world.rb +45 -0
- data/spec/perf/server_perf_spec.rb +19 -0
- data/spec/spec_helper.rb +2 -0
- data/test.rb +58 -0
- metadata +131 -0
@@ -0,0 +1,59 @@
|
|
1
|
+
module David
|
2
|
+
class WellKnown
|
3
|
+
def initialize(app)
|
4
|
+
@app = app
|
5
|
+
end
|
6
|
+
|
7
|
+
def call(env)
|
8
|
+
dup._call(env)
|
9
|
+
end
|
10
|
+
|
11
|
+
def _call(env)
|
12
|
+
@env = env
|
13
|
+
|
14
|
+
if env['PATH_INFO'] == '/.well-known/core'
|
15
|
+
return [405, {}, []] if env['REQUEST_METHOD'] != 'GET'
|
16
|
+
|
17
|
+
links = filtered_paths.map { |path| CoRE::Link.new(path) }
|
18
|
+
|
19
|
+
[200,
|
20
|
+
{'Content-Type' => 'application/link-format'},
|
21
|
+
[links.map(&:to_s).join(',')]
|
22
|
+
]
|
23
|
+
else
|
24
|
+
@app.call(env)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def delete_format(spec)
|
31
|
+
spec.gsub(/\(\.:format\)\z/, '')
|
32
|
+
end
|
33
|
+
|
34
|
+
def filter(spec)
|
35
|
+
href = @env['QUERY_STRING'].split('href=').last
|
36
|
+
|
37
|
+
return true if href.blank?
|
38
|
+
|
39
|
+
spec =~ Regexp.new(href)
|
40
|
+
end
|
41
|
+
|
42
|
+
def filtered_paths
|
43
|
+
@filtered_paths ||= specs
|
44
|
+
.select { |spec| spec if include_spec?(spec) }
|
45
|
+
.select { |spec| spec if filter(spec) }
|
46
|
+
.map { |spec| delete_format(spec) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def include_spec?(spec)
|
50
|
+
!(spec == '/' || spec =~ /\A\/(assets|rails)/)
|
51
|
+
end
|
52
|
+
|
53
|
+
def specs
|
54
|
+
@specs ||= Rails.application.routes.routes.map do |route|
|
55
|
+
route.path.spec.to_s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Rack
|
2
|
+
module Handler
|
3
|
+
class David
|
4
|
+
DEFAULT_OPTIONS = {
|
5
|
+
:Host => ENV['RACK_ENV'] == 'development' ? '::1' : '::',
|
6
|
+
:Port => ::CoAP::PORT
|
7
|
+
}
|
8
|
+
|
9
|
+
def self.run(app, options={})
|
10
|
+
options = DEFAULT_OPTIONS.merge(options)
|
11
|
+
|
12
|
+
supervisor = ::David::Server.supervise_as(:david, app, options)
|
13
|
+
|
14
|
+
begin
|
15
|
+
sleep
|
16
|
+
rescue Interrupt
|
17
|
+
supervisor.terminate
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.valid_options
|
22
|
+
host, port = DEFAULT_OPTIONS.values_at(:Host, :Port)
|
23
|
+
|
24
|
+
{
|
25
|
+
'Host=HOST' => "Hostname to listen on (default: #{host})",
|
26
|
+
'Port=PORT' => "Port to listen on (default: #{port})",
|
27
|
+
'CBOR=BOOLEAN' => 'Transparent JSON/CBOR conversion.',
|
28
|
+
'Log=LOG' => 'Change logging (debug|none).'
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
register :david, David
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Rack
|
2
|
+
class HelloWorld
|
3
|
+
# include Celluloid
|
4
|
+
|
5
|
+
def call(env)
|
6
|
+
dup._call(env)
|
7
|
+
end
|
8
|
+
|
9
|
+
def _call(env)
|
10
|
+
if env['REQUEST_METHOD'] != 'GET'
|
11
|
+
return [405, {}, ['']]
|
12
|
+
end
|
13
|
+
|
14
|
+
return case env['PATH_INFO']
|
15
|
+
when '/.well-known/core'
|
16
|
+
[200,
|
17
|
+
{'Content-Type' => 'application/link-format'},
|
18
|
+
['</hello>;rt="hello";ct=0']
|
19
|
+
]
|
20
|
+
when '/hello'
|
21
|
+
[200,
|
22
|
+
# If Content-Length is not given, Rack assumes chunked transfer.
|
23
|
+
{'Content-Type' => 'text/plain', 'Content-Length' => '12'},
|
24
|
+
['Hello World!']
|
25
|
+
]
|
26
|
+
when '/wait'
|
27
|
+
sleep 10
|
28
|
+
[200,
|
29
|
+
{'Content-Type' => 'text/plain'},
|
30
|
+
['You waited!']
|
31
|
+
]
|
32
|
+
when '/value'
|
33
|
+
@@value ||= 0
|
34
|
+
@@value += 1
|
35
|
+
|
36
|
+
[200,
|
37
|
+
{'Content-Type' => 'text/plain'},
|
38
|
+
["#{@@value}"]
|
39
|
+
]
|
40
|
+
else
|
41
|
+
[404, {}, ['']]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'benchmark'
|
3
|
+
|
4
|
+
describe Server, 'performance' do
|
5
|
+
before do
|
6
|
+
@server = David::Server.supervise_as \
|
7
|
+
:david,
|
8
|
+
->(e) { [200, { 'Content-Length' => 0 }, ['']] },
|
9
|
+
{:Host => '::1', :Port => CoRE::CoAP::PORT, :Log => 'none'}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should handle GET request in less than #{max1 = 0.0025} seconds" do
|
13
|
+
expect(Benchmark.realtime { CoRE::CoAP::Client.new.get('/', '::1') }).to be < max1
|
14
|
+
end
|
15
|
+
|
16
|
+
after do
|
17
|
+
@server.terminate
|
18
|
+
end
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/test.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'bundler/setup'
|
2
|
+
Bundler.require
|
3
|
+
|
4
|
+
require 'benchmark'
|
5
|
+
|
6
|
+
include CoRE
|
7
|
+
|
8
|
+
#uri = ARGV.pop
|
9
|
+
uri = 'coap://[::1]/value'
|
10
|
+
n, c = ARGV.map(&:to_i)
|
11
|
+
|
12
|
+
threads = []
|
13
|
+
value = 0
|
14
|
+
|
15
|
+
c.times do
|
16
|
+
threads << Thread.start do
|
17
|
+
n.times do |i|
|
18
|
+
new_value = CoAP::Client.new.get_by_uri(uri).payload.to_i
|
19
|
+
value = new_value if new_value > value
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
Benchmark.bm do |b|
|
25
|
+
b.report { threads.map(&:join) }
|
26
|
+
end
|
27
|
+
|
28
|
+
puts value
|
29
|
+
|
30
|
+
FileUtils.rm_f('tmp')
|
31
|
+
|
32
|
+
Benchmark.bm do |b|
|
33
|
+
b.report do
|
34
|
+
c.times do
|
35
|
+
fork do
|
36
|
+
value = 0
|
37
|
+
|
38
|
+
n.times do |i|
|
39
|
+
new_value = CoAP::Client.new.get_by_uri(uri).payload.to_i
|
40
|
+
value = new_value if new_value > value
|
41
|
+
end
|
42
|
+
|
43
|
+
File.open('tmp', 'a') do |f|
|
44
|
+
f.write("#{value}\n")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
value = 0
|
52
|
+
|
53
|
+
File.readlines('tmp').each do |line|
|
54
|
+
new_value = line.to_i
|
55
|
+
value = new_value if new_value > value
|
56
|
+
end
|
57
|
+
|
58
|
+
puts value
|
metadata
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: david
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0.pre
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- henning mueller
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: cbor
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.5'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.5'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: celluloid-io
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.16'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.16'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: coap
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
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: rack
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.5'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.5'
|
69
|
+
description: |-
|
70
|
+
David is a CoAP server with Rack interface to bring the
|
71
|
+
illustrious family of Rack compatible web frameworks into the Internet of
|
72
|
+
Things.
|
73
|
+
email: henning@orgizm.net
|
74
|
+
executables:
|
75
|
+
- david
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- Gemfile
|
80
|
+
- Gemfile.lock
|
81
|
+
- LICENSE
|
82
|
+
- README.md
|
83
|
+
- Rakefile
|
84
|
+
- bin/david
|
85
|
+
- config.ru
|
86
|
+
- david.gemspec
|
87
|
+
- lib/david.rb
|
88
|
+
- lib/david/guerilla/rack/handler.rb
|
89
|
+
- lib/david/railties/config.rb
|
90
|
+
- lib/david/railties/middleware.rb
|
91
|
+
- lib/david/server.rb
|
92
|
+
- lib/david/server/mapping.rb
|
93
|
+
- lib/david/server/options.rb
|
94
|
+
- lib/david/server/response.rb
|
95
|
+
- lib/david/server/utility.rb
|
96
|
+
- lib/david/version.rb
|
97
|
+
- lib/david/well_known.rb
|
98
|
+
- lib/rack/handler/coap.rb
|
99
|
+
- lib/rack/handler/david.rb
|
100
|
+
- lib/rack/hello_world.rb
|
101
|
+
- spec/perf/server_perf_spec.rb
|
102
|
+
- spec/spec_helper.rb
|
103
|
+
- test.rb
|
104
|
+
homepage: https://github.com/nning/david
|
105
|
+
licenses:
|
106
|
+
- GPL-3.0
|
107
|
+
metadata: {}
|
108
|
+
post_install_message:
|
109
|
+
rdoc_options: []
|
110
|
+
require_paths:
|
111
|
+
- lib
|
112
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
+
requirements:
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
requirements:
|
119
|
+
- - ">"
|
120
|
+
- !ruby/object:Gem::Version
|
121
|
+
version: 1.3.1
|
122
|
+
requirements: []
|
123
|
+
rubyforge_project:
|
124
|
+
rubygems_version: 2.2.2
|
125
|
+
signing_key:
|
126
|
+
specification_version: 4
|
127
|
+
summary: CoAP server with Rack interface.
|
128
|
+
test_files:
|
129
|
+
- spec/perf/server_perf_spec.rb
|
130
|
+
- spec/spec_helper.rb
|
131
|
+
has_rdoc:
|