class UDPRest::Server
Public Class Methods
new(options = {}) { |self| ... }
click to toggle source
# File lib/udp_rest.rb, line 11 def initialize(options = {}) @udp = UDPServer.new @routes = {} if block_given? yield(self) port = options[:port] || 80 options[:host] = options[:host] || '0.0.0.0' self.listen(port, options) end end
Public Instance Methods
add_route(req_method, path, &block)
click to toggle source
# File lib/udp_rest.rb, line 35 def add_route(req_method, path, &block) key = "#{req_method.upcase} #{path}" @routes[key] = Proc.new &block return key end
get(path, &block)
click to toggle source
# File lib/udp_rest.rb, line 31 def get(path, &block) add_route('GET', path, &block) end
listen(port, options = {})
click to toggle source
# File lib/udp_rest.rb, line 56 def listen(port, options = {}) port = port || 80 @udp.listen(port, options) do |packet| response = nil if response.nil? begin request = UHTTPRequest.from_packet packet rescue => e puts "400 BAD REQUEST: #{e}" response = respond(400, 'Bad Request') end end if response.nil? begin response = route_request(request) if response.to_s.bytesize > udp_server.max_packet_size raise "response too long (#{response.to_s.bytesize} bytes)" end rescue => e puts "500 APPLICATION ERROR: #{e}" response = respond(500, 'Application Error') end end @udp.send(response.to_s, packet.src_addr, packet.src_port) end end
post(path, &block)
click to toggle source
# File lib/udp_rest.rb, line 27 def post(path, &block) add_route('POST', path, &block) end
respond(code, text)
click to toggle source
# File lib/udp_rest.rb, line 88 def respond(code, text) UHTTPResponse.new(code, :text => text) end
route_request(request)
click to toggle source
# File lib/udp_rest.rb, line 41 def route_request(request) key = "#{request.req_method.upcase} #{request.path}" puts key block = @routes[key] return respond(404, 'Not Found') if block.nil? # handle the response. No matter what gets returned # we want to try and make it into something useful result = block.call(request, self) return result if result.is_a? UHTTPResponse return respond(200, result.to_s) if result.respond_to? :to_s return respond(200, 'ok') end
udp_server()
click to toggle source
# File lib/udp_rest.rb, line 23 def udp_server @udp end