Module: EventMachine::HttpEncoding

Included in:
HttpClient
Defined in:
lib/em-http/client.rb

Overview

Methods for building HTTP requests

Constant Summary collapse

HTTP_REQUEST_HEADER =
"%s %s HTTP/1.1\r\n"
FIELD_ENCODING =
"%s: %s\r\n"
BASIC_AUTH_ENCODING =
"%s: Basic %s\r\n"

Instance Method Summary collapse

Instance Method Details

#encode_basic_auth(k, v) ⇒ Object

Encode basic auth in an HTTP header



125
126
127
# File 'lib/em-http/client.rb', line 125

def encode_basic_auth(k,v)
  BASIC_AUTH_ENCODING % [k, Base64.encode64(v.join(":")).chomp]
end


141
142
143
144
145
146
147
# File 'lib/em-http/client.rb', line 141

def encode_cookie(cookie)
  if cookie.is_a? Hash
    cookie.inject('') { |result, (k, v)| result <<  encode_param(k, v) + ";" }
  else
    cookie
  end
end

#encode_field(k, v) ⇒ Object

Encode a field in an HTTP header



120
121
122
# File 'lib/em-http/client.rb', line 120

def encode_field(k, v)
  FIELD_ENCODING % [k, v]
end

#encode_headers(head) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
# File 'lib/em-http/client.rb', line 129

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.capitalize }.join('-')
    unless key == "Authorization"
      result << encode_field(key, value)
    else
      result << encode_basic_auth(key, value)
    end
  end
end

#encode_hostObject

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.



92
93
94
# File 'lib/em-http/client.rb', line 92

def encode_host
  @uri.host + (@uri.port.to_i != 80 ? ":#{@uri.port}" : "")
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



111
112
113
114
115
116
117
# File 'lib/em-http/client.rb', line 111

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(path, query) ⇒ Object



100
101
102
103
104
105
106
107
# File 'lib/em-http/client.rb', line 100

def encode_query(path, query)
  return path unless query
  if query.kind_of? String
    return "#{path}?#{query}"
  else
    return path + "?" + query.map { |k, v| encode_param(k, v) }.join('&')
  end
end

#encode_request(method, path, query) ⇒ Object



96
97
98
# File 'lib/em-http/client.rb', line 96

def encode_request(method, path, query)
  HTTP_REQUEST_HEADER % [method.to_s.upcase, encode_query(path, query)]
end

#escape(s) ⇒ Object

Escapes a URI.



71
72
73
74
75
# File 'lib/em-http/client.rb', line 71

def escape(s)
  s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/n) {
    '%'+$1.unpack('H2'*$1.size).join('%').upcase
  }.tr(' ', '+')
end

#munge_header_keys(head) ⇒ Object

Map all header keys to a downcased string version



85
86
87
# File 'lib/em-http/client.rb', line 85

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.



78
79
80
81
82
# File 'lib/em-http/client.rb', line 78

def unescape(s)
  s.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n){
    [$1.delete('%')].pack('H*')
  }
end