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