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