Class: UDPRest::Server

Inherits:
Object
  • Object
show all
Defined in:
lib/udp_rest.rb

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Server

Returns a new instance of Server.



11
12
13
14
15
16
17
18
19
20
21
# 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

Instance Method Details

#add_route(req_method, path, &block) ⇒ Object



35
36
37
38
39
# 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) ⇒ Object



31
32
33
# File 'lib/udp_rest.rb', line 31

def get(path, &block)
	add_route('GET', path, &block)
end

#listen(port, options = {}) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# 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) ⇒ Object



27
28
29
# File 'lib/udp_rest.rb', line 27

def post(path, &block)
	add_route('POST', path, &block)
end

#respond(code, text) ⇒ Object



88
89
90
# File 'lib/udp_rest.rb', line 88

def respond(code, text)
	UHTTPResponse.new(code, :text => text)
end

#route_request(request) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 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_serverObject



23
24
25
# File 'lib/udp_rest.rb', line 23

def udp_server
	@udp
end