File: headers.rb

package info (click to toggle)
ruby-webmock 3.25.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,172 kB
  • sloc: ruby: 12,829; makefile: 6
file content (77 lines) | stat: -rw-r--r-- 2,075 bytes parent folder | download
1
2
3
4
5
6
7
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
68
69
70
71
72
73
74
75
76
77
# frozen_string_literal: true

module WebMock

  module Util

    class Headers

      STANDARD_HEADER_DELIMITER = '-'
      NONSTANDARD_HEADER_DELIMITER = '_'
      JOIN = ', '

      def self.normalize_headers(headers)
        return nil unless headers

        headers.each_with_object({}) do |(name, value), new_headers|
          new_headers[normalize_name(name)] =
            case value
            when Regexp then value
            when Array then (value.size == 1) ? value.first.to_s : value.map(&:to_s).sort
            else value.to_s
            end
        end
      end

      def self.sorted_headers_string(headers)
        headers = WebMock::Util::Headers.normalize_headers(headers)
        str = '{'.dup
        str << headers.map do |k,v|
          v = case v
            when Regexp then v.inspect
            when Array then "["+v.map{|w| "'#{w.to_s}'"}.join(", ")+"]"
            else "'#{v.to_s}'"
          end
          "'#{k}'=>#{v}"
        end.sort.join(", ")
        str << '}'
      end

      def self.pp_headers_string(headers)
        headers = WebMock::Util::Headers.normalize_headers(headers)
        seperator = "\n\t "
        str = "{#{seperator} ".dup
        str << headers.map do |k,v|
          v = case v
            when Regexp then v.inspect
            when Array then "["+v.map{|w| "'#{w.to_s}'"}.join(", ")+"]"
            else "'#{v.to_s}'"
          end
          "'#{k}'=>#{v}"
        end.sort.join(",#{seperator} ")
        str << "\n    }"
      end

      def self.decode_userinfo_from_header(header)
        header.sub(/^Basic /, "").unpack("m").first
      end

      def self.basic_auth_header(*credentials)
        strict_base64_encoded = [credentials.join(':')].pack("m0")
        "Basic #{strict_base64_encoded.chomp}"
      end

      def self.normalize_name(name)
        name
          .to_s
          .tr(NONSTANDARD_HEADER_DELIMITER, STANDARD_HEADER_DELIMITER)
          .split(STANDARD_HEADER_DELIMITER)
          .map!(&:capitalize)
          .join(STANDARD_HEADER_DELIMITER)
      end

    end

  end

end