From 367b6e512b30757fbea0b2ecfa0e68e47f4648c2 Mon Sep 17 00:00:00 2001 From: Michael Richardson Date: Tue, 14 Nov 2017 01:44:41 -0500 Subject: [PATCH 1/5] include constants module for env[] access --- lib/david/resource_discovery.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/david/resource_discovery.rb b/lib/david/resource_discovery.rb index 4882ab8..1371452 100644 --- a/lib/david/resource_discovery.rb +++ b/lib/david/resource_discovery.rb @@ -1,6 +1,9 @@ +require 'david/server/constants' + module David class ResourceDiscovery include Celluloid + include David::Server::Constants def initialize(app) @app = app From 8856a905f39d36f8030942c1fb28d9808b5058f5 Mon Sep 17 00:00:00 2001 From: Michael Richardson Date: Wed, 15 Nov 2017 17:48:49 -0500 Subject: [PATCH 2/5] ignore /cable routes as well --- lib/david/resource_discovery.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/david/resource_discovery.rb b/lib/david/resource_discovery.rb index 1371452..673db3e 100644 --- a/lib/david/resource_discovery.rb +++ b/lib/david/resource_discovery.rb @@ -73,7 +73,7 @@ def filter(link) end def include_route?(route) - !(route[0] =~ /\A\/(assets|rails)/) + !(route[0] =~ /\A\/(assets|rails|cable)/) end def routes From 33de4c1644c0d5b4b756cc6f57dca08b41c286ee Mon Sep 17 00:00:00 2001 From: Michael Richardson Date: Wed, 15 Nov 2017 17:50:25 -0500 Subject: [PATCH 3/5] include defaults[:rt] and defaults[:short] into coap list --- lib/david/resource_discovery.rb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/david/resource_discovery.rb b/lib/david/resource_discovery.rb index 673db3e..d3ca4b2 100644 --- a/lib/david/resource_discovery.rb +++ b/lib/david/resource_discovery.rb @@ -57,6 +57,10 @@ def clean_routes .each { |r| delete_format!(r) } end + def resource_links + Hash[routes.collect { |r| [r[3], r[4]] }] + end + def delete_format!(route) route[0].gsub!(/\(\.:format\)\z/, '') end @@ -81,7 +85,9 @@ def routes [ route.path.spec.to_s, route.defaults[:controller], - route.defaults[:action] + route.defaults[:action], + route.defaults[:rt], + route.defaults[:short] ] end end From 826ee8e8ce951a9fd458af39450f778c147cf932 Mon Sep 17 00:00:00 2001 From: Michael Richardson Date: Wed, 15 Nov 2017 17:50:43 -0500 Subject: [PATCH 4/5] filter david routes for coap: true --- lib/david/resource_discovery.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/david/resource_discovery.rb b/lib/david/resource_discovery.rb index d3ca4b2..21131bd 100644 --- a/lib/david/resource_discovery.rb +++ b/lib/david/resource_discovery.rb @@ -81,7 +81,9 @@ def include_route?(route) end def routes - Rails.application.routes.routes.map do |route| + Rails.application.routes.routes.select { |route| + route.defaults[:coap] + }.map do |route| [ route.path.spec.to_s, route.defaults[:controller], From b6930a5047ccd0388b6a70fafe43ac2e88514733 Mon Sep 17 00:00:00 2001 From: Michael Richardson Date: Thu, 16 Nov 2017 13:32:30 -0500 Subject: [PATCH 5/5] return resource type based upon list of resource_links --- lib/david/resource_discovery.rb | 34 +++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/lib/david/resource_discovery.rb b/lib/david/resource_discovery.rb index 21131bd..27a33ca 100644 --- a/lib/david/resource_discovery.rb +++ b/lib/david/resource_discovery.rb @@ -19,11 +19,37 @@ def _call(env) @env = env - filtered = routes_hash.select { |link| filter(link) } - body = filtered.keys.map(&:to_s).join(',') + queries = @env[QUERY_STRING].split('&') + body_links = [] + + if queries.length > 0 + queries.each {|q| + # XXX do these need to %-unescaped now? + (item, value) = q.split('=') + + case item + when 'href' + # TODO If query end in '*', match on prefix. + # Otherwise match on whole string. + # https://tools.ietf.org/html/rfc6690#section-4.1 + filtered = routes_hash.select { |link| filter(link) } + body_links = filtered.keys + + when 'rt' + byebug + unless resource_links[value].blank? + body_links << sprintf("<%s>", ERB::Util.html_escape(resource_links[value])) + end + + else + false + end + } + end - # TODO On multicast, do not respond if result set empty. + body = body_links.map(&:to_s).join(',') + # TODO On multicast, do not respond if result set empty. [ 200, { @@ -58,7 +84,7 @@ def clean_routes end def resource_links - Hash[routes.collect { |r| [r[3], r[4]] }] + @resource_links ||= Hash[routes.collect { |r| [r[3], r[4]] }] end def delete_format!(route)