Module: Itsi::Server::RouteTester
- Included in:
- Itsi::Server
- Defined in:
- lib/itsi/server/route_tester.rb
Overview
Utility module for printing Itsi route information
Instance Method Summary collapse
- #expand_tokens(tokens) ⇒ Object
- #explode_route_pattern(pattern) ⇒ Object
- #format_mw(mw) ⇒ Object
-
#parse_alternation(scanner) ⇒ Object
Parses inside a non-capturing group (?:A|B|C).
-
#parse_expression(scanner) ⇒ Object
Parses the expression into a nested tree of tokens.
- #print_route(route_str, stack) ⇒ Object
Instance Method Details
#expand_tokens(tokens) ⇒ Object
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 |
# File 'lib/itsi/server/route_tester.rb', line 140 def (tokens) parts = tokens.map do |token| if token.is_a?(String) [token] elsif token.is_a?(Hash) && token[:alt] # Recurse into each branch of the alternation token[:alt].map { |branch| (branch) }.flatten else raise "Unexpected token: #{token.inspect}" end end # Cartesian product of all parts parts.inject([""]) do |acc, part| acc.product(part).map { |a, b| a + b } end end |
#explode_route_pattern(pattern) ⇒ Object
87 88 89 90 91 92 |
# File 'lib/itsi/server/route_tester.rb', line 87 def explode_route_pattern(pattern) pattern = pattern.gsub(/^\^|\$$/, "") pattern = pattern.gsub("\\", "") tokens = parse_expression(StringScanner.new(pattern)) (tokens) end |
#format_mw(mw) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/itsi/server/route_tester.rb', line 8 def format_mw(mw) mw_name, mw_args = mw case mw_name when "app" "\e[33mapp\e[0m(#{mw_args["app_proc"].inspect.split(" ")[1][0...-1]})" when "log_requests" if mw_args["before"] && mw_args["after"] "\e[33mlog_requests\e[0m(before: #{mw_args["before"]["format"][0..6]}..., after: #{mw_args["after"]["format"][0..6]}...)" elsif mw_args["before"] "\e[33mlog_requests\e[0m(before: #{mw_args["before"]["format"][0..6]}...)" elsif mw_args["after"] "\e[33mlog_requests\e[0m(before: nil, after: #{mw_args["after"]["format"][0..6]}...)" end when "compress" "\e[33mcompress\e[0m(#{mw_args["algorithms"].join(" ")}, #{mw_args["mime_types"]})" when "cors" "\e[33mcors\e[0m(#{mw_args["allow_origins"].join(" ")}, #{mw_args["allow_methods"].join(" ")})" when "etag" "\e[33metag\e[0m(#{mw_args["type"]}/#{mw_args["algorithm"]})" when "cache_control" "\e[33mcache_control\e[0m(max_age: #{mw_args["max_age"]}, #{mw_args.select do |_, v| v == true end.keys.join(", ")})" when "redirect" "\e[33mredirect\e[0m(to: #{mw_args["to"]}, type: #{mw_args["type"]})" when "static_assets" "\e[33mstatic_assets\e[0m(path: #{mw_args["root_dir"]})" when "auth_api_key" "\e[33mauth_api_key\e[0m(keys: #{mw_args["valid_keys"].keys}#{mw_args["credentials_file"] ? ", credentials_file: #{mw_args["credentials_file"]}" : ""})" when "auth_basic" "\e[33mbasic_auth\e[0m(keys: #{mw_args["realm"]}#{mw_args["credentials_file"] ? ", credentials_file: #{mw_args["credentials_file"]}" : ""})" when "auth_jwt" "\e[33mjwt_auth\e[0m(#{mw_args["verifiers"].keys.join(",")})" when "rate_limit" key = mw_args["key"].is_a?(Hash) ? mw_args["key"]["parameter"] : mw_args["key"] "\e[33mrate_limit\e[0m(rps: #{mw_args["requests"]}/#{mw_args["seconds"]}, key: #{key})" when "allow_list" "\e[33mallow_list\e[0m(patterns: #{mw_args["allowed_patterns"].join(", ")})" when "deny_list" "\e[33mdeny_list\e[0m(patterns: #{mw_args["denied_patterns"].join(", ")})" when "csp" "\e[33mcsp\e[0m(#{mw_args["policy"].map { |k, v| "#{k}: #{v.join(",")}" }.join(", ")})" when "intrusion_protection" [mw_args].flatten.map do |mw_args| "\e[33mintrusion_protection\e[0m(banned_url_patterns: #{mw_args["banned_url_patterns"]&.length}, banned_header_patterns: #{mw_args["banned_header_patterns"]&.keys&.join(", ")}, #{mw_args["banned_time_seconds"]}s)" end.join("\n") when "request_headers" [mw_args].flatten.map do |mw_args| "\e[33mrequest_headers\e[0m(added: #{mw_args["additions"].keys}, removed: #{mw_args["removals"]})" end.join("\n") when "response_headers" [mw_args].flatten.map do |mw_args| "\e[33mresponse_headers\e[0m(added: #{mw_args["additions"].keys}, removed: #{mw_args["removals"]})" end.join("\n") when "static_response" "\e[response_headers\e[0m(#{mw_args["code"]} body: #{mw_args["body"][0..10]})" else "\e[33m#{mw.first}\e[0m" end end |
#parse_alternation(scanner) ⇒ Object
Parses inside a non-capturing group (?:A|B|C)
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 |
# File 'lib/itsi/server/route_tester.rb', line 117 def parse_alternation(scanner) = [] current = [] until scanner.eos? if scanner.scan(/\(\?:/) current << parse_alternation(scanner) elsif scanner.peek(1) == ")" scanner.getch # consume ')' break elsif scanner.peek(1) == "|" scanner.getch # consume '|' << current current = [] else current << scanner.getch end end << current { alt: } end |
#parse_expression(scanner) ⇒ Object
Parses the expression into a nested tree of tokens
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/itsi/server/route_tester.rb', line 95 def parse_expression(scanner) tokens = [] buffer = "" until scanner.eos? if scanner.scan(/\(\?:/) tokens << buffer unless buffer.empty? buffer = "" tokens << parse_alternation(scanner) elsif scanner.peek(1) == ")" scanner.getch # consume ')' break else buffer << scanner.getch end end tokens << buffer unless buffer.empty? tokens end |
#print_route(route_str, stack) ⇒ Object
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/itsi/server/route_tester.rb', line 69 def print_route(route_str, stack) filters = %w[methods ports protocols extensions].map do |key| val = stack[key] val ? "#{key}: #{Array(val).join(",")}" : nil end.compact filter_str = filters.any? ? filters.join(", ") : "(none)" middlewares = stack["middleware"].to_a puts "─" * 76 puts "\e[32mRoute:\e[0m \e[33m#{route_str}\e[0m" puts "\e[32mConditions:\e[0m \e[34m#{filter_str}\e[0m" puts "\e[32mMiddleware:\e[0m • #{format_mw(middlewares.first)}" middlewares[1..].each do |mw| puts " • #{format_mw(mw)}" end end |