david 0.3.0 → 0.4.0
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 +4 -4
- data/.gitignore +4 -0
- data/.travis.yml +2 -2
- data/Gemfile +8 -2
- data/Gemfile.lock +84 -44
- data/README.md +87 -5
- data/benchmarks/Gemfile +1 -0
- data/benchmarks/Gemfile.lock +3 -1
- data/benchmarks/coapbench.sh +20 -0
- data/benchmarks/quick.sh +2 -0
- data/benchmarks/rackup/Gemfile +10 -0
- data/benchmarks/rackup/Gemfile.lock +159 -0
- data/benchmarks/rackup/grape.ru +18 -0
- data/benchmarks/rackup/rack.ru +7 -0
- data/benchmarks/rackup/rails.ru +14 -0
- data/benchmarks/rps.rb +14 -2
- data/benchmarks/stress.sh +17 -0
- data/david.gemspec +0 -3
- data/experiments/Gemfile +6 -0
- data/experiments/concurrency/Gemfile +3 -0
- data/experiments/concurrency/stub.rb +88 -0
- data/experiments/hash_key.rb +64 -0
- data/experiments/string_concat.rb +21 -0
- data/experiments/symbol_to_proc.rb +15 -0
- data/experiments/thread_safe.rb +40 -0
- data/lib/david.rb +8 -4
- data/lib/david/actor.rb +1 -11
- data/lib/david/app_config.rb +112 -0
- data/lib/david/exchange.rb +124 -0
- data/lib/david/fake_logger.rb +11 -0
- data/lib/david/garbage_collector.rb +9 -17
- data/lib/david/guerilla/rack/utils.rb +18 -0
- data/lib/david/interop.rb +4 -0
- data/lib/david/interop/mandatory_etsi.rb +4 -0
- data/lib/david/interop/mandatory_etsi/grape.rb +37 -0
- data/lib/david/interop/mandatory_etsi/hobbit.rb +30 -0
- data/lib/david/interop/mandatory_etsi/nyny.rb +36 -0
- data/lib/david/interop/mandatory_etsi/rack.rb +26 -0
- data/lib/david/interop/mandatory_etsi/sinatra.rb +36 -0
- data/lib/david/observe.rb +24 -29
- data/lib/david/rails/action_controller/base.rb +9 -7
- data/lib/david/railties/config.rb +4 -4
- data/lib/david/registry.rb +22 -0
- data/lib/david/server.rb +56 -56
- data/lib/david/server/constants.rb +1 -0
- data/lib/david/server/mapping.rb +43 -11
- data/lib/david/server/mid_cache.rb +29 -0
- data/lib/david/server/multicast.rb +7 -5
- data/lib/david/server/respond.rb +53 -43
- data/lib/david/server/utility.rb +2 -1
- data/lib/david/show_exceptions.rb +12 -8
- data/lib/david/transmitter.rb +44 -0
- data/lib/david/trap.rb +10 -0
- data/lib/david/version.rb +1 -1
- data/lib/rack/handler/david.rb +6 -10
- data/lib/rack/hello_world.rb +25 -0
- data/spec/app_config_spec.rb +56 -0
- data/spec/dummy/app/controllers/etsis_controller.rb +26 -0
- data/spec/dummy/app/controllers/tests_controller.rb +9 -0
- data/spec/dummy/config/application.rb +4 -6
- data/spec/dummy/config/environments/development.rb +2 -2
- data/spec/dummy/config/environments/test.rb +2 -2
- data/spec/dummy/config/routes.rb +13 -53
- data/spec/interop/mandatory_spec.rb +100 -0
- data/spec/observe_spec.rb +8 -7
- data/spec/resource_discovery_spec.rb +3 -3
- data/spec/server_spec.rb +60 -15
- data/spec/spec_helper.rb +21 -2
- metadata +40 -33
- data/lib/david/request.rb +0 -80
- data/lib/david/server/deduplication.rb +0 -21
- data/lib/david/server/options.rb +0 -79
    
        data/spec/observe_spec.rb
    CHANGED
    
    | @@ -7,19 +7,20 @@ describe Observe do | |
| 7 7 |  | 
| 8 8 | 
             
              # TODO Replace this with factory.
         | 
| 9 9 | 
             
              before do
         | 
| 10 | 
            -
                [:@ | 
| 10 | 
            +
                [:@exchange1, :@exchange2].each do |var|
         | 
| 11 | 
            +
                  mid     = SecureRandom.random_number(0xffff)
         | 
| 11 12 | 
             
                  token   = SecureRandom.random_number(0xff)
         | 
| 12 13 | 
             
                  options = { uri_path: [], token: token }
         | 
| 13 14 |  | 
| 14 | 
            -
                  message | 
| 15 | 
            -
                   | 
| 15 | 
            +
                  message  = CoAP::Message.new(:con, :get, mid, '', options)
         | 
| 16 | 
            +
                  exchange = Exchange.new('127.0.0.1', CoAP::PORT, message)
         | 
| 16 17 |  | 
| 17 | 
            -
                  instance_variable_set(var,  | 
| 18 | 
            +
                  instance_variable_set(var, exchange)
         | 
| 18 19 | 
             
                end
         | 
| 19 20 | 
             
              end
         | 
| 20 21 |  | 
| 21 | 
            -
              let(:dummy1) { [@ | 
| 22 | 
            -
              let(:dummy2) { [@ | 
| 22 | 
            +
              let(:dummy1) { [@exchange1, {'PATH_INFO' => '/'}, '1'] }
         | 
| 23 | 
            +
              let(:dummy2) { [@exchange2, {'PATH_INFO' => '/'}, '1'] }
         | 
| 23 24 |  | 
| 24 25 | 
             
              subject { Celluloid::Actor[:observe] }
         | 
| 25 26 |  | 
| @@ -36,7 +37,7 @@ describe Observe do | |
| 36 37 | 
             
                  end
         | 
| 37 38 | 
             
                end
         | 
| 38 39 |  | 
| 39 | 
            -
                # [n,  | 
| 40 | 
            +
                # [n, exchange, env, etag, timestamp]
         | 
| 40 41 | 
             
                context 'value' do
         | 
| 41 42 | 
             
                  let!(:time) { Time.now.to_i }
         | 
| 42 43 |  | 
| @@ -8,7 +8,7 @@ describe David::ResourceDiscovery do | |
| 8 8 | 
             
              end
         | 
| 9 9 |  | 
| 10 10 | 
             
              let!(:server) do
         | 
| 11 | 
            -
                supervised_server(:Port => port, :Log => debug, :app =>  | 
| 11 | 
            +
                supervised_server(:Port => port, :Log => debug, :app => Rails.application)
         | 
| 12 12 | 
             
              end
         | 
| 13 13 |  | 
| 14 14 | 
             
              context 'ordinary request' do
         | 
| @@ -25,11 +25,11 @@ describe David::ResourceDiscovery do | |
| 25 25 | 
             
                  end
         | 
| 26 26 |  | 
| 27 27 | 
             
                  it 'CoRE::Link' do
         | 
| 28 | 
            -
                    expect(links.size).to eq( | 
| 28 | 
            +
                    expect(links.size).to eq(9)
         | 
| 29 29 | 
             
                    expect(links.map(&:uri).uniq.size).to eq(links.size)
         | 
| 30 30 |  | 
| 31 31 | 
             
                    links.each do |link|
         | 
| 32 | 
            -
                      expect(link.uri).to match(/^\/things/)
         | 
| 32 | 
            +
                      expect(link.uri).to match(/^\/(cbor|hello|query|seg.*|test|things)/)
         | 
| 33 33 | 
             
                    end
         | 
| 34 34 | 
             
                  end
         | 
| 35 35 | 
             
                end
         | 
    
        data/spec/server_spec.rb
    CHANGED
    
    | @@ -273,21 +273,6 @@ describe Server do | |
| 273 273 | 
             
                end
         | 
| 274 274 | 
             
              end
         | 
| 275 275 |  | 
| 276 | 
            -
              context 'options' do
         | 
| 277 | 
            -
                describe 'default_to_true' do
         | 
| 278 | 
            -
                  let(:method) do
         | 
| 279 | 
            -
                    ->(*args) { Server::Options.send(:default_to_true, *args) }
         | 
| 280 | 
            -
                  end
         | 
| 281 | 
            -
             | 
| 282 | 
            -
                  it { expect(method.call(:block, nil)).to eq(true) }
         | 
| 283 | 
            -
                  it { expect(method.call(:block, true)).to eq(true) }
         | 
| 284 | 
            -
                  it { expect(method.call(:block, 'true')).to eq(true) }
         | 
| 285 | 
            -
             | 
| 286 | 
            -
                  it { expect(method.call(:block, false)).to eq(false) }
         | 
| 287 | 
            -
                  it { expect(method.call(:block, 'false')).to eq(false) }
         | 
| 288 | 
            -
                end
         | 
| 289 | 
            -
              end
         | 
| 290 | 
            -
             | 
| 291 276 | 
             
              context 'proxy' do
         | 
| 292 277 | 
             
                subject { client.get('/', '::1', nil, nil, proxy_uri: 'coap://[::1]/') }
         | 
| 293 278 |  | 
| @@ -300,6 +285,66 @@ describe Server do | |
| 300 285 | 
             
                end
         | 
| 301 286 | 
             
              end
         | 
| 302 287 |  | 
| 288 | 
            +
              context 'transcoding' do
         | 
| 289 | 
            +
                let!(:server) { supervised_server(:Port => port, :CBOR => true) }
         | 
| 290 | 
            +
             | 
| 291 | 
            +
                let(:cbor) { {'Hello' => 'World!'}.to_cbor }
         | 
| 292 | 
            +
             | 
| 293 | 
            +
                subject { client.get('/cbor', '::1', nil, cbor, content_format: 60) }
         | 
| 294 | 
            +
             | 
| 295 | 
            +
                context 'incoming' do
         | 
| 296 | 
            +
                  context 'string key' do
         | 
| 297 | 
            +
                    it 'should return text' do
         | 
| 298 | 
            +
                      expect(subject).to be_a(CoAP::Message)
         | 
| 299 | 
            +
                      expect(subject.ver).to eq(1)
         | 
| 300 | 
            +
                      expect(subject.tt).to eq(:ack)
         | 
| 301 | 
            +
                      expect(subject.mcode).to eq([2, 5])
         | 
| 302 | 
            +
                      expect(subject.payload).to eq('{"Hello"=>"World!"}{"Hello"=>"World!"}')
         | 
| 303 | 
            +
                    end
         | 
| 304 | 
            +
                  end
         | 
| 305 | 
            +
             | 
| 306 | 
            +
                  context 'int key' do
         | 
| 307 | 
            +
                    let(:cbor) { {1 => 2}.to_cbor }
         | 
| 308 | 
            +
             | 
| 309 | 
            +
                    it 'should return text' do
         | 
| 310 | 
            +
                      expect(subject).to be_a(CoAP::Message)
         | 
| 311 | 
            +
                      expect(subject.ver).to eq(1)
         | 
| 312 | 
            +
                      expect(subject.tt).to eq(:ack)
         | 
| 313 | 
            +
                      expect(subject.mcode).to eq([2, 5])
         | 
| 314 | 
            +
                      expect(subject.payload).to eq('{"1"=>2}{1=>2}')
         | 
| 315 | 
            +
                    end
         | 
| 316 | 
            +
                  end
         | 
| 317 | 
            +
             | 
| 318 | 
            +
                  context 'rails' do
         | 
| 319 | 
            +
                    let!(:server) do
         | 
| 320 | 
            +
                      supervised_server(:Port => port, :Log => debug, :CBOR => true,
         | 
| 321 | 
            +
                        :app => Rails.application)
         | 
| 322 | 
            +
                    end
         | 
| 323 | 
            +
             | 
| 324 | 
            +
                    it 'should return text' do
         | 
| 325 | 
            +
                      expect(subject).to be_a(CoAP::Message)
         | 
| 326 | 
            +
                      expect(subject.ver).to eq(1)
         | 
| 327 | 
            +
                      expect(subject.tt).to eq(:ack)
         | 
| 328 | 
            +
                      expect(subject.mcode).to eq([2, 5])
         | 
| 329 | 
            +
                      expect(subject.payload).to eq('{"Hello"=>"World!"}')
         | 
| 330 | 
            +
                    end
         | 
| 331 | 
            +
                  end
         | 
| 332 | 
            +
                end
         | 
| 333 | 
            +
             | 
| 334 | 
            +
                context 'outgoing' do
         | 
| 335 | 
            +
                  subject { client.get('/json', '::1') }
         | 
| 336 | 
            +
             | 
| 337 | 
            +
                  it 'should return CBOR' do
         | 
| 338 | 
            +
                    expect(subject).to be_a(CoAP::Message)
         | 
| 339 | 
            +
                    expect(subject.ver).to eq(1)
         | 
| 340 | 
            +
                    expect(subject.tt).to eq(:ack)
         | 
| 341 | 
            +
                    expect(subject.mcode).to eq([2, 5])
         | 
| 342 | 
            +
                    expect(CBOR.load(subject.payload)).to eq({'Hello' => 'World!'})
         | 
| 343 | 
            +
                    expect(subject.options[:content_format]).to eq(60)
         | 
| 344 | 
            +
                  end
         | 
| 345 | 
            +
                end
         | 
| 346 | 
            +
              end
         | 
| 347 | 
            +
             | 
| 303 348 | 
             
              after do
         | 
| 304 349 | 
             
                server.terminate
         | 
| 305 350 | 
             
              end
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -6,13 +6,14 @@ SimpleCov.start { add_filter 'spec/dummy' } | |
| 6 6 | 
             
            # Rails
         | 
| 7 7 | 
             
            ENV['RAILS_ENV'] ||= 'test'
         | 
| 8 8 |  | 
| 9 | 
            -
            require File.expand_path("../dummy/config/environment | 
| 9 | 
            +
            require File.expand_path("../dummy/config/environment",  __FILE__)
         | 
| 10 10 | 
             
            require 'rspec/rails'
         | 
| 11 11 |  | 
| 12 12 | 
             
            # David
         | 
| 13 13 | 
             
            $:.unshift(File.expand_path('../lib', File.dirname(__FILE__)))
         | 
| 14 14 |  | 
| 15 15 | 
             
            require 'david'
         | 
| 16 | 
            +
            require 'david/interop'
         | 
| 16 17 |  | 
| 17 18 | 
             
            module David
         | 
| 18 19 | 
             
              module TestHelper
         | 
| @@ -24,6 +25,21 @@ module David | |
| 24 25 | 
             
                  rand((2**10+1)..(2**16-1))
         | 
| 25 26 | 
             
                end
         | 
| 26 27 |  | 
| 28 | 
            +
                def req(method, path, options = {})
         | 
| 29 | 
            +
                  mid = rand(0xffff) unless respond_to?(:mid)
         | 
| 30 | 
            +
                  port = random_port unless respond_to?(:port)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  payload = options.delete(:payload)
         | 
| 33 | 
            +
                  options.merge!(mid: mid)
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  client = CoAP::Client.new(retransmit: false, recv_timeout: 0.1,
         | 
| 36 | 
            +
                    token: false)
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  response = client.send(method, path, '::1', nil, payload, options)
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  [mid, response]
         | 
| 41 | 
            +
                end
         | 
| 42 | 
            +
             | 
| 27 43 | 
             
                def supervised_server(options)
         | 
| 28 44 | 
             
                  defaults = {
         | 
| 29 45 | 
             
                    :Host => '::1',
         | 
| @@ -35,7 +51,10 @@ module David | |
| 35 51 |  | 
| 36 52 | 
             
                  app = options.delete(:app) || Rack::HelloWorld
         | 
| 37 53 |  | 
| 38 | 
            -
                  David::Server. | 
| 54 | 
            +
                  server = David::Server.new(app, defaults.merge(options))
         | 
| 55 | 
            +
                  server.async.run
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                  server
         | 
| 39 58 | 
             
                end
         | 
| 40 59 | 
             
              end
         | 
| 41 60 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: david
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - henning mueller
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2015- | 
| 11 | 
            +
            date: 2015-02-05 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: celluloid-io
         | 
| @@ -86,34 +86,6 @@ dependencies: | |
| 86 86 | 
             
                    version: '3.1'
         | 
| 87 87 | 
             
              prerelease: false
         | 
| 88 88 | 
             
              type: :development
         | 
| 89 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 90 | 
            -
              name: rspec-rails
         | 
| 91 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 92 | 
            -
                requirements:
         | 
| 93 | 
            -
                - - ~>
         | 
| 94 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 95 | 
            -
                    version: '3.1'
         | 
| 96 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 97 | 
            -
                requirements:
         | 
| 98 | 
            -
                - - ~>
         | 
| 99 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 100 | 
            -
                    version: '3.1'
         | 
| 101 | 
            -
              prerelease: false
         | 
| 102 | 
            -
              type: :development
         | 
| 103 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 104 | 
            -
              name: rails
         | 
| 105 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 106 | 
            -
                requirements:
         | 
| 107 | 
            -
                - - ~>
         | 
| 108 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version: '4.2'
         | 
| 110 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 111 | 
            -
                requirements:
         | 
| 112 | 
            -
                - - ~>
         | 
| 113 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 114 | 
            -
                    version: '4.2'
         | 
| 115 | 
            -
              prerelease: false
         | 
| 116 | 
            -
              type: :development
         | 
| 117 89 | 
             
            description: |-
         | 
| 118 90 | 
             
              David is a CoAP server with Rack interface to bring the
         | 
| 119 91 | 
             
                  illustrious family of Rack compatible web frameworks into the Internet of
         | 
| @@ -134,43 +106,73 @@ files: | |
| 134 106 | 
             
            - TODO.md
         | 
| 135 107 | 
             
            - benchmarks/Gemfile
         | 
| 136 108 | 
             
            - benchmarks/Gemfile.lock
         | 
| 109 | 
            +
            - benchmarks/coapbench.sh
         | 
| 110 | 
            +
            - benchmarks/quick.sh
         | 
| 111 | 
            +
            - benchmarks/rackup/Gemfile
         | 
| 112 | 
            +
            - benchmarks/rackup/Gemfile.lock
         | 
| 113 | 
            +
            - benchmarks/rackup/grape.ru
         | 
| 114 | 
            +
            - benchmarks/rackup/rack.ru
         | 
| 115 | 
            +
            - benchmarks/rackup/rails.ru
         | 
| 137 116 | 
             
            - benchmarks/rps.rb
         | 
| 117 | 
            +
            - benchmarks/stress.sh
         | 
| 138 118 | 
             
            - bin/david
         | 
| 139 119 | 
             
            - config.ru
         | 
| 140 120 | 
             
            - david.gemspec
         | 
| 121 | 
            +
            - experiments/Gemfile
         | 
| 122 | 
            +
            - experiments/concurrency/Gemfile
         | 
| 123 | 
            +
            - experiments/concurrency/stub.rb
         | 
| 124 | 
            +
            - experiments/hash_key.rb
         | 
| 141 125 | 
             
            - experiments/mcast.rb
         | 
| 126 | 
            +
            - experiments/string_concat.rb
         | 
| 142 127 | 
             
            - experiments/structs.rb
         | 
| 128 | 
            +
            - experiments/symbol_to_proc.rb
         | 
| 143 129 | 
             
            - experiments/test.rb
         | 
| 130 | 
            +
            - experiments/thread_safe.rb
         | 
| 144 131 | 
             
            - lib/david.rb
         | 
| 145 132 | 
             
            - lib/david/actor.rb
         | 
| 133 | 
            +
            - lib/david/app_config.rb
         | 
| 134 | 
            +
            - lib/david/exchange.rb
         | 
| 135 | 
            +
            - lib/david/fake_logger.rb
         | 
| 146 136 | 
             
            - lib/david/garbage_collector.rb
         | 
| 147 137 | 
             
            - lib/david/guerilla/rack/handler.rb
         | 
| 138 | 
            +
            - lib/david/guerilla/rack/utils.rb
         | 
| 139 | 
            +
            - lib/david/interop.rb
         | 
| 140 | 
            +
            - lib/david/interop/mandatory_etsi.rb
         | 
| 141 | 
            +
            - lib/david/interop/mandatory_etsi/grape.rb
         | 
| 142 | 
            +
            - lib/david/interop/mandatory_etsi/hobbit.rb
         | 
| 143 | 
            +
            - lib/david/interop/mandatory_etsi/nyny.rb
         | 
| 144 | 
            +
            - lib/david/interop/mandatory_etsi/rack.rb
         | 
| 145 | 
            +
            - lib/david/interop/mandatory_etsi/sinatra.rb
         | 
| 148 146 | 
             
            - lib/david/observe.rb
         | 
| 149 147 | 
             
            - lib/david/rails/action_controller/base.rb
         | 
| 150 148 | 
             
            - lib/david/railties/config.rb
         | 
| 151 149 | 
             
            - lib/david/railties/middleware.rb
         | 
| 152 | 
            -
            - lib/david/ | 
| 150 | 
            +
            - lib/david/registry.rb
         | 
| 153 151 | 
             
            - lib/david/resource_discovery.rb
         | 
| 154 152 | 
             
            - lib/david/resource_discovery_proxy.rb
         | 
| 155 153 | 
             
            - lib/david/server.rb
         | 
| 156 154 | 
             
            - lib/david/server/constants.rb
         | 
| 157 | 
            -
            - lib/david/server/deduplication.rb
         | 
| 158 155 | 
             
            - lib/david/server/mapping.rb
         | 
| 156 | 
            +
            - lib/david/server/mid_cache.rb
         | 
| 159 157 | 
             
            - lib/david/server/multicast.rb
         | 
| 160 | 
            -
            - lib/david/server/options.rb
         | 
| 161 158 | 
             
            - lib/david/server/respond.rb
         | 
| 162 159 | 
             
            - lib/david/server/utility.rb
         | 
| 163 160 | 
             
            - lib/david/show_exceptions.rb
         | 
| 161 | 
            +
            - lib/david/transmitter.rb
         | 
| 162 | 
            +
            - lib/david/trap.rb
         | 
| 164 163 | 
             
            - lib/david/version.rb
         | 
| 165 164 | 
             
            - lib/rack/handler/coap.rb
         | 
| 166 165 | 
             
            - lib/rack/handler/david.rb
         | 
| 167 166 | 
             
            - lib/rack/hello_world.rb
         | 
| 167 | 
            +
            - spec/app_config_spec.rb
         | 
| 168 168 | 
             
            - spec/dummy/Rakefile
         | 
| 169 169 | 
             
            - spec/dummy/app/assets/images/.keep
         | 
| 170 170 | 
             
            - spec/dummy/app/assets/javascripts/application.js
         | 
| 171 171 | 
             
            - spec/dummy/app/assets/stylesheets/application.css
         | 
| 172 172 | 
             
            - spec/dummy/app/controllers/application_controller.rb
         | 
| 173 173 | 
             
            - spec/dummy/app/controllers/concerns/.keep
         | 
| 174 | 
            +
            - spec/dummy/app/controllers/etsis_controller.rb
         | 
| 175 | 
            +
            - spec/dummy/app/controllers/tests_controller.rb
         | 
| 174 176 | 
             
            - spec/dummy/app/helpers/application_helper.rb
         | 
| 175 177 | 
             
            - spec/dummy/app/mailers/.keep
         | 
| 176 178 | 
             
            - spec/dummy/app/models/.keep
         | 
| @@ -206,6 +208,7 @@ files: | |
| 206 208 | 
             
            - spec/dummy/public/500.html
         | 
| 207 209 | 
             
            - spec/dummy/public/favicon.ico
         | 
| 208 210 | 
             
            - spec/guerilla_rack_handler_spec.rb
         | 
| 211 | 
            +
            - spec/interop/mandatory_spec.rb
         | 
| 209 212 | 
             
            - spec/mapping_spec.rb
         | 
| 210 213 | 
             
            - spec/observe_spec.rb
         | 
| 211 214 | 
             
            - spec/perf/server_perf_spec.rb
         | 
| @@ -238,12 +241,15 @@ signing_key: | |
| 238 241 | 
             
            specification_version: 4
         | 
| 239 242 | 
             
            summary: CoAP server with Rack interface.
         | 
| 240 243 | 
             
            test_files:
         | 
| 244 | 
            +
            - spec/app_config_spec.rb
         | 
| 241 245 | 
             
            - spec/dummy/Rakefile
         | 
| 242 246 | 
             
            - spec/dummy/app/assets/images/.keep
         | 
| 243 247 | 
             
            - spec/dummy/app/assets/javascripts/application.js
         | 
| 244 248 | 
             
            - spec/dummy/app/assets/stylesheets/application.css
         | 
| 245 249 | 
             
            - spec/dummy/app/controllers/application_controller.rb
         | 
| 246 250 | 
             
            - spec/dummy/app/controllers/concerns/.keep
         | 
| 251 | 
            +
            - spec/dummy/app/controllers/etsis_controller.rb
         | 
| 252 | 
            +
            - spec/dummy/app/controllers/tests_controller.rb
         | 
| 247 253 | 
             
            - spec/dummy/app/helpers/application_helper.rb
         | 
| 248 254 | 
             
            - spec/dummy/app/mailers/.keep
         | 
| 249 255 | 
             
            - spec/dummy/app/models/.keep
         | 
| @@ -279,6 +285,7 @@ test_files: | |
| 279 285 | 
             
            - spec/dummy/public/500.html
         | 
| 280 286 | 
             
            - spec/dummy/public/favicon.ico
         | 
| 281 287 | 
             
            - spec/guerilla_rack_handler_spec.rb
         | 
| 288 | 
            +
            - spec/interop/mandatory_spec.rb
         | 
| 282 289 | 
             
            - spec/mapping_spec.rb
         | 
| 283 290 | 
             
            - spec/observe_spec.rb
         | 
| 284 291 | 
             
            - spec/perf/server_perf_spec.rb
         | 
    
        data/lib/david/request.rb
    DELETED
    
    | @@ -1,80 +0,0 @@ | |
| 1 | 
            -
            class Request < Struct.new(:host, :port, :message, :ancillary, :options)
         | 
| 2 | 
            -
              def accept
         | 
| 3 | 
            -
                message.options[:accept]
         | 
| 4 | 
            -
              end
         | 
| 5 | 
            -
             | 
| 6 | 
            -
              def block
         | 
| 7 | 
            -
                @block ||= if message.options[:block2].nil?
         | 
| 8 | 
            -
                  CoAP::Block.new(0, false, 1024)
         | 
| 9 | 
            -
                else
         | 
| 10 | 
            -
                  CoAP::Block.new(message.options[:block2]).decode
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
              end
         | 
| 13 | 
            -
             | 
| 14 | 
            -
              def con?
         | 
| 15 | 
            -
                message.tt == :con
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
             | 
| 18 | 
            -
              def delete?
         | 
| 19 | 
            -
                message.mcode == :delete
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
              def etag
         | 
| 23 | 
            -
                message.options[:etag]
         | 
| 24 | 
            -
              end
         | 
| 25 | 
            -
             | 
| 26 | 
            -
              def get_etag?
         | 
| 27 | 
            -
                message.options[:etag].nil? && get?
         | 
| 28 | 
            -
              end
         | 
| 29 | 
            -
             | 
| 30 | 
            -
              def get?
         | 
| 31 | 
            -
                message.mcode == :get
         | 
| 32 | 
            -
              end
         | 
| 33 | 
            -
             | 
| 34 | 
            -
              def idempotent?
         | 
| 35 | 
            -
                get? || put? || delete?
         | 
| 36 | 
            -
              end
         | 
| 37 | 
            -
             | 
| 38 | 
            -
              def mid
         | 
| 39 | 
            -
                message.mid
         | 
| 40 | 
            -
              end
         | 
| 41 | 
            -
             | 
| 42 | 
            -
              def multicast?
         | 
| 43 | 
            -
                a = ancillary
         | 
| 44 | 
            -
                return false if a.nil?
         | 
| 45 | 
            -
             | 
| 46 | 
            -
                return @multicast unless @multicast.nil?
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                @multicast =
         | 
| 49 | 
            -
                  a.cmsg_is?(:IP, :PKTINFO) && a.ip_pktinfo[0].ipv4_multicast? ||
         | 
| 50 | 
            -
                  a.cmsg_is?(:IPV6, :PKTINFO) && a.ipv6_pktinfo[0].ipv6_multicast?
         | 
| 51 | 
            -
              end
         | 
| 52 | 
            -
             | 
| 53 | 
            -
              def non?
         | 
| 54 | 
            -
                message.tt == :non
         | 
| 55 | 
            -
              end
         | 
| 56 | 
            -
             | 
| 57 | 
            -
              def observe?
         | 
| 58 | 
            -
                !message.options[:observe].nil?
         | 
| 59 | 
            -
              end
         | 
| 60 | 
            -
             | 
| 61 | 
            -
              def post?
         | 
| 62 | 
            -
                message.mcode == :post
         | 
| 63 | 
            -
              end
         | 
| 64 | 
            -
             | 
| 65 | 
            -
              def proxy?
         | 
| 66 | 
            -
                !(message.options[:proxy_uri].nil? && message.options[:proxy_scheme].nil?)
         | 
| 67 | 
            -
              end
         | 
| 68 | 
            -
             | 
| 69 | 
            -
              def put?
         | 
| 70 | 
            -
                message.mcode == :put
         | 
| 71 | 
            -
              end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
              def token
         | 
| 74 | 
            -
                message.options[:token]
         | 
| 75 | 
            -
              end
         | 
| 76 | 
            -
             | 
| 77 | 
            -
              def valid_method?
         | 
| 78 | 
            -
                CoAP::METHODS.include?(message.mcode)
         | 
| 79 | 
            -
              end
         | 
| 80 | 
            -
            end
         | 
| @@ -1,21 +0,0 @@ | |
| 1 | 
            -
            module David
         | 
| 2 | 
            -
              module Deduplication
         | 
| 3 | 
            -
                def self.included(base)
         | 
| 4 | 
            -
                  attr_reader :dedup_cache
         | 
| 5 | 
            -
                end
         | 
| 6 | 
            -
             | 
| 7 | 
            -
                def cache_response(request, response)
         | 
| 8 | 
            -
                  return if duplicate?(request)
         | 
| 9 | 
            -
                  @dedup_cache[[request.host, request.mid]] = [response, Time.now.to_i]
         | 
| 10 | 
            -
                end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                def cached_response(request)
         | 
| 13 | 
            -
                  response = @dedup_cache[[request.host, request.mid]]
         | 
| 14 | 
            -
                  [response[0], response[0].options] if response
         | 
| 15 | 
            -
                end
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                def duplicate?(request)
         | 
| 18 | 
            -
                  return !!cached_response(request)
         | 
| 19 | 
            -
                end
         | 
| 20 | 
            -
              end
         | 
| 21 | 
            -
            end
         |