Module: EventMachine::HttpEncoding
- Included in:
- HttpClient, MockHttpRequest
- Defined in:
- lib/em-http/http_encoding.rb
Constant Summary collapse
- HTTP_REQUEST_HEADER =
"%s %s HTTP/1.1\r\n"- FIELD_ENCODING =
"%s: %s\r\n"
Instance Method Summary collapse
- #bytesize(string) ⇒ Object
-
#encode_auth(k, v) ⇒ Object
Encode basic auth in an HTTP header In: Array ([user, pass]) - for basic auth String - custom auth string (OAuth, etc).
- #encode_cookie(cookie) ⇒ Object
-
#encode_field(k, v) ⇒ Object
Encode a field in an HTTP header.
- #encode_headers(head) ⇒ Object
-
#encode_host ⇒ Object
HTTP is kind of retarded that you have to specify a Host header, but if you include port 80 then further redirects will tack on the :80 which is annoying.
-
#encode_param(k, v) ⇒ Object
URL encodes query parameters: single k=v, or a URL encoded array, if v is an array of values.
- #encode_query(uri, query) ⇒ Object
- #encode_request(method, uri, query, proxy) ⇒ Object
-
#escape(s) ⇒ Object
Escapes a URI.
- #form_encode_body(obj) ⇒ Object
-
#munge_header_keys(head) ⇒ Object
Map all header keys to a downcased string version.
-
#unescape(s) ⇒ Object
Unescapes a URI escaped string.
Instance Method Details
#bytesize(string) ⇒ Object
17 18 19 |
# File 'lib/em-http/http_encoding.rb', line 17 def bytesize(string) string.bytesize end |
#encode_auth(k, v) ⇒ Object
Encode basic auth in an HTTP header In: Array ([user, pass]) - for basic auth
String - custom auth string (OAuth, etc)
106 107 108 109 110 111 112 |
# File 'lib/em-http/http_encoding.rb', line 106 def encode_auth(k,v) if v.is_a? Array FIELD_ENCODING % [k, ["Basic", Base64.encode64(v.join(":")).chomp].join(" ")] else encode_field(k,v) end end |
#encode_cookie(cookie) ⇒ Object
127 128 129 130 131 132 133 |
# File 'lib/em-http/http_encoding.rb', line 127 def () if .is_a? Hash .inject('') { |result, (k, v)| result << encode_param(k, v) + ";" } else end end |
#encode_field(k, v) ⇒ Object
Encode a field in an HTTP header
99 100 101 |
# File 'lib/em-http/http_encoding.rb', line 99 def encode_field(k, v) FIELD_ENCODING % [k, v] end |
#encode_headers(head) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/em-http/http_encoding.rb', line 114 def encode_headers(head) head.inject('') do |result, (key, value)| # Munge keys from foo-bar-baz to Foo-Bar-Baz key = key.split('-').map { |k| k.to_s.capitalize }.join('-') result << case key when 'Authorization', 'Proxy-Authorization' encode_auth(key, value) else encode_field(key, value) end end end |
#encode_host ⇒ Object
HTTP is kind of retarded that you have to specify a Host header, but if you include port 80 then further redirects will tack on the :80 which is annoying.
34 35 36 37 38 39 40 |
# File 'lib/em-http/http_encoding.rb', line 34 def encode_host if @uri.port == 80 || @uri.port == 443 return @uri.host else @uri.host + ":#{@uri.port}" end end |
#encode_param(k, v) ⇒ Object
URL encodes query parameters: single k=v, or a URL encoded array, if v is an array of values
67 68 69 70 71 72 73 |
# File 'lib/em-http/http_encoding.rb', line 67 def encode_param(k, v) if v.is_a?(Array) v.map { |e| escape(k) + "[]=" + escape(e) }.join("&") else escape(k) + "=" + escape(v) end end |
#encode_query(uri, query) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/em-http/http_encoding.rb', line 52 def encode_query(uri, query) encoded_query = if query.kind_of?(Hash) query.map { |k, v| encode_param(k, v) }.join('&') else query.to_s end if !uri.query.to_s.empty? encoded_query = [encoded_query, uri.query].reject {|part| part.empty?}.join("&") end encoded_query.to_s.empty? ? uri.path : "#{uri.path}?#{encoded_query}" end |
#encode_request(method, uri, query, proxy) ⇒ Object
42 43 44 45 46 47 48 49 50 |
# File 'lib/em-http/http_encoding.rb', line 42 def encode_request(method, uri, query, proxy) query = encode_query(uri, query) # Non CONNECT proxies require that you provide the full request # uri in request header, as opposed to a relative path. query = uri.join(query) if proxy && proxy[:type] != :socks && !proxy[:use_connect] HTTP_REQUEST_HEADER % [method.to_s.upcase, query] end |
#escape(s) ⇒ Object
Escapes a URI.
7 8 9 |
# File 'lib/em-http/http_encoding.rb', line 7 def escape(s) EscapeUtils.escape_url(s.to_s) end |
#form_encode_body(obj) ⇒ Object
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
# File 'lib/em-http/http_encoding.rb', line 75 def form_encode_body(obj) pairs = [] recursive = Proc.new do |h, prefix| h.each do |k,v| key = prefix == '' ? escape(k) : "#{prefix}[#{escape(k)}]" if v.is_a? Array nh = Hash.new v.size.times { |t| nh[t] = v[t] } recursive.call(nh, key) elsif v.is_a? Hash recursive.call(v, key) else pairs << "#{key}=#{escape(v)}" end end end recursive.call(obj, '') return pairs.join('&') end |
#munge_header_keys(head) ⇒ Object
Map all header keys to a downcased string version
27 28 29 |
# File 'lib/em-http/http_encoding.rb', line 27 def munge_header_keys(head) head.inject({}) { |h, (k, v)| h[k.to_s.downcase] = v; h } end |
#unescape(s) ⇒ Object
Unescapes a URI escaped string.
12 13 14 |
# File 'lib/em-http/http_encoding.rb', line 12 def unescape(s) EscapeUtils.unescape_url(s.to_s) end |