class Toycol::Protocol
This class is for protocol definition and parsing request messages
Attributes
protocol_name[R]
request_message[R]
Public Class Methods
additional_request_methods(*additional_request_methods)
click to toggle source
For protocol definition: Define adding request methods
# File lib/toycol/protocol.rb, line 52 def additional_request_methods(*additional_request_methods) @additional_request_methods = additional_request_methods end
custom_status_codes(**custom_status_codes)
click to toggle source
# File lib/toycol/protocol.rb, line 42 def custom_status_codes(**custom_status_codes) @custom_status_codes = custom_status_codes end
define(protocol_name = :default, &block)
click to toggle source
For Protocolfile to define new protocol
# File lib/toycol/protocol.rb, line 17 def define(protocol_name = :default, &block) if @definements[protocol_name] raise DuplicateProtocolError, "#{protocol_name || "Anonymous"} protocol has already been defined" end @definements[protocol_name] = block end
http_method(&block)
click to toggle source
# File lib/toycol/protocol.rb, line 67 def self.http_method(&block) @http_method = block end
input(&block)
click to toggle source
# File lib/toycol/protocol.rb, line 71 def self.input(&block) @input = block end
path(&block)
click to toggle source
# File lib/toycol/protocol.rb, line 59 def self.path(&block) @path = block end
query(&block)
click to toggle source
# File lib/toycol/protocol.rb, line 63 def self.query(&block) @query = block end
request()
click to toggle source
For protocol definition: Define how to parse the request message
# File lib/toycol/protocol.rb, line 57 def request @request ||= Class.new do def self.path(&block) @path = block end def self.query(&block) @query = block end def self.http_method(&block) @http_method = block end def self.input(&block) @input = block end end end
request_method()
click to toggle source
For proxy server: Fetch the request method
# File lib/toycol/protocol.rb, line 93 def request_method @http_request_methods.concat @additional_request_methods if @additional_request_methods request_method = request.instance_variable_get("@http_method").call(request_message) unless @http_request_methods.include? request_method raise UndefinementError, "This request method is undefined" end request_method end
request_path()
click to toggle source
For proxy server: Fetch the request path
# File lib/toycol/protocol.rb, line 78 def request_path request_path = request.instance_variable_get("@path").call(request_message) if request_path.size >= 2048 raise UnauthorizeError, "This request path is too long" elsif request_path.scan(%r{[/\w\d\-_]}).size < request_path.size raise UnauthorizeError, "This request path contains unauthorized character" end request_path end
run!(message)
click to toggle source
For proxy server to interpret protocol definitions and parse messages
# File lib/toycol/protocol.rb, line 32 def run!(message) @request_message = message.chomp return unless (block = @definements[@protocol_name]) instance_exec(@request_message, &block) end
status_message(status)
click to toggle source
For proxy server: fetch the message of status code
# File lib/toycol/protocol.rb, line 120 def status_message(status) @http_status_codes.merge!(@custom_status_codes) if @custom_status_codes unless (message = @http_status_codes[status]) raise HTTPError, "Application returns unknown status code" end message end
use(protocol_name = :default)
click to toggle source
For application to select which protocol to use
# File lib/toycol/protocol.rb, line 27 def use(protocol_name = :default) @protocol_name = protocol_name end