Module: Net::HTTPHeader

Included in:
HTTPGenericRequest, HTTPResponse
Defined in:
lib/mechanize/net-overrides/net/http.rb

Overview

Header module.

Provides access to @header in the mixed-into class as a hash-like object, except with case-insensitive keys. Also provides methods for accessing commonly-used header values in a more convenient format.

Instance Method Summary collapse

Instance Method Details

#[](key) ⇒ Object

Returns the header field corresponding to the case-insensitive key. For example, a key of “Content-Type” might return “text/html”



1038
1039
1040
1041
# File 'lib/mechanize/net-overrides/net/http.rb', line 1038

def [](key)
  a = @header[key.downcase] or return nil
  a.join(', ')
end

#[]=(key, val) ⇒ Object

Sets the header field corresponding to the case-insensitive key.



1044
1045
1046
1047
1048
1049
1050
# File 'lib/mechanize/net-overrides/net/http.rb', line 1044

def []=(key, val)
  unless val
    @header.delete key.downcase
    return val
  end
  @header[key.downcase] = Array(val).map {|s| s.to_str }
end

#add_field(key, val) ⇒ Object

Adds header name and field instead of replace.

request.add_header 'X-My-Header', 'a'
p request['X-My-Header']              #=> "a"
request.add_header 'X-My-Header', 'b'
p request['X-My-Header']              #=> "a, b"
request.add_header 'X-My-Header', 'c'
p request['X-My-Header']              #=> "a, b, c"
p request.get_fields('X-My-Header')   #=> ["a", "b", "c"]


1062
1063
1064
1065
1066
1067
1068
# File 'lib/mechanize/net-overrides/net/http.rb', line 1062

def add_field(key, val)
  if @header.key?(key.downcase)
    @header[key.downcase].concat Array(val)
  else
    @header[key.downcase] = Array(val).dup
  end
end

#basic_auth(account, password) ⇒ Object

Set the Authorization: header for “Basic” authorization.



1280
1281
1282
# File 'lib/mechanize/net-overrides/net/http.rb', line 1280

def basic_auth(, password)
  @header['authorization'] = [basic_encode(, password)]
end

#chunked?Boolean

Returns “true” if the “transfer-encoding” header is present and set to “chunked”. This is an HTTP/1.1 feature, allowing the the content to be sent in “chunks” without at the outset stating the entire content length.

Returns:

  • (Boolean)


1228
1229
1230
1231
1232
# File 'lib/mechanize/net-overrides/net/http.rb', line 1228

def chunked?
  return false unless @header['transfer-encoding']
  field = self['Transfer-Encoding']
  (/(?:\A|[^\-\w])chunked(?![\-\w])/i =~ field) ? true : false
end

#content_lengthObject

Returns an Integer object which represents the Content-Length: header field or nil if that field is not provided.



1209
1210
1211
1212
1213
1214
# File 'lib/mechanize/net-overrides/net/http.rb', line 1209

def content_length
  return nil unless key?('Content-Length')
  len = self['Content-Length'].slice(/\d+/) or
      raise HTTPHeaderSyntaxError, 'wrong Content-Length format'
  len.to_i
end

#content_length=(len) ⇒ Object



1216
1217
1218
1219
1220
1221
1222
# File 'lib/mechanize/net-overrides/net/http.rb', line 1216

def content_length=(len)
  unless len
    @header.delete 'content-length'
    return nil
  end
  @header['content-length'] = [len.to_i.to_s]
end

#content_rangeObject

Returns a Range object which represents Content-Range: header field. This indicates, for a partial entity body, where this fragment fits inside the full entity body, as range of byte offsets.



1237
1238
1239
1240
1241
1242
# File 'lib/mechanize/net-overrides/net/http.rb', line 1237

def content_range
  return nil unless @header['content-range']
  m = %r<bytes\s+(\d+)-(\d+)/(\d+|\*)>i.match(self['Content-Range']) or
      raise HTTPHeaderSyntaxError, 'wrong Content-Range format'
  m[1].to_i .. m[2].to_i + 1
end

#content_typeObject



1250
1251
1252
# File 'lib/mechanize/net-overrides/net/http.rb', line 1250

def content_type
  "#{main_type()}/#{sub_type()}"
end

#delete(key) ⇒ Object

Removes a header field.



1124
1125
1126
# File 'lib/mechanize/net-overrides/net/http.rb', line 1124

def delete(key)
  @header.delete(key.downcase)
end

#each_capitalizedObject Also known as: canonical_each

As for #each_header, except the keys are provided in capitalized form.



1139
1140
1141
1142
1143
# File 'lib/mechanize/net-overrides/net/http.rb', line 1139

def each_capitalized
  @header.each do |k,v|
    yield capitalize(k), v.join(', ')
  end
end

#each_capitalized_name(&block) ⇒ Object

Iterates for each capitalized header names.



1110
1111
1112
1113
1114
# File 'lib/mechanize/net-overrides/net/http.rb', line 1110

def each_capitalized_name(&block)   #:yield: +key+
  @header.each_key do |k|
    yield capitalize(k)
  end
end

#each_headerObject Also known as: each

Iterates for each header names and values.



1094
1095
1096
1097
1098
# File 'lib/mechanize/net-overrides/net/http.rb', line 1094

def each_header   #:yield: +key+, +value+
  @header.each do |k,va|
    yield k, va.join(', ')
  end
end

#each_name(&block) ⇒ Object Also known as: each_key

Iterates for each header names.



1103
1104
1105
# File 'lib/mechanize/net-overrides/net/http.rb', line 1103

def each_name(&block)   #:yield: +key+
  @header.each_key(&block)
end

#each_valueObject

Iterates for each header values.



1117
1118
1119
1120
1121
# File 'lib/mechanize/net-overrides/net/http.rb', line 1117

def each_value   #:yield: +value+
  @header.each_value do |va|
    yield va.join(', ')
  end
end

#fetch(key, *args, &block) ⇒ Object

Returns the header field corresponding to the case-insensitive key. Returns the default value args, or the result of the block, or nil, if there’s no header field named key. See Hash#fetch



1088
1089
1090
1091
# File 'lib/mechanize/net-overrides/net/http.rb', line 1088

def fetch(key, *args, &block)   #:yield: +key+
  a = @header.fetch(key.downcase, *args, &block)
  a.join(', ')
end

#get_fields(key) ⇒ Object

Returns the header field by Array, corresponding to the case-insensitive key. This method allows you to get duplicated fields without any processing.

p response.get_fields('Set-Cookie')
  #=> ["session=al98axx; expires=Fri, 31-Dec-1999 23:58:23",
       "query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"]
p response['Set-Cookie']
  #=> "session=al98axx; expires=Fri, 31-Dec-1999 23:58:23, query=rubyscript; expires=Fri, 31-Dec-1999 23:58:23"


1080
1081
1082
1083
# File 'lib/mechanize/net-overrides/net/http.rb', line 1080

def get_fields(key)
  return nil unless @header[key.downcase]
  @header[key.downcase].dup
end

#initialize_http_header(initheader) ⇒ Object



1021
1022
1023
1024
1025
1026
1027
1028
# File 'lib/mechanize/net-overrides/net/http.rb', line 1021

def initialize_http_header(initheader)
  @header = {}
  return unless initheader
  initheader.each do |key, value|
    warn "net/http: warning: duplicated HTTP header: #{key}" if key?(key) and $VERBOSE
    @header[key.downcase] = [value.strip]
  end
end

#key?(key) ⇒ Boolean

true if key header exists.

Returns:

  • (Boolean)


1129
1130
1131
# File 'lib/mechanize/net-overrides/net/http.rb', line 1129

def key?(key)
  @header.key?(key.downcase)
end

#main_typeObject



1254
1255
1256
1257
# File 'lib/mechanize/net-overrides/net/http.rb', line 1254

def main_type
  return nil unless @header['content-type']
  self['Content-Type'].split(';').first.to_s.split('/')[0].to_s.strip
end

#proxy_basic_auth(account, password) ⇒ Object

Set Proxy-Authorization: header for “Basic” authorization.



1285
1286
1287
# File 'lib/mechanize/net-overrides/net/http.rb', line 1285

def proxy_basic_auth(, password)
  @header['proxy-authorization'] = [basic_encode(, password)]
end

#rangeObject

Returns an Array of Range objects which represents Range: header field, or nil if there is no such header.



1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
# File 'lib/mechanize/net-overrides/net/http.rb', line 1154

def range
  return nil unless @header['range']
  self['Range'].split(/,/).map {|spec|
    m = /bytes\s*=\s*(\d+)?\s*-\s*(\d+)?/i.match(spec) or
            raise HTTPHeaderSyntaxError, "wrong Range: #{spec}"
    d1 = m[1].to_i
    d2 = m[2].to_i
    if    m[1] and m[2] then  d1..d2
    elsif m[1]          then  d1..-1
    elsif          m[2] then -d2..-1
    else
      raise HTTPHeaderSyntaxError, 'range is not specified'
    end
  }
end

#range_lengthObject

The length of the range represented in Content-Range: header.



1245
1246
1247
1248
# File 'lib/mechanize/net-overrides/net/http.rb', line 1245

def range_length
  r = content_range() or return nil
  r.end - r.begin
end

#set_content_type(type, params = {}) ⇒ Object Also known as: content_type=



1273
1274
1275
# File 'lib/mechanize/net-overrides/net/http.rb', line 1273

def set_content_type(type, params = {})
  @header['content-type'] = [type + params.map{|k,v|"; #{k}=#{v}"}.join('')]
end

#set_range(r, e = nil) ⇒ Object Also known as: range=

Set Range: header from Range (arg r) or beginning index and length from it (arg idx&len).

req.range = (0..1023)
req.set_range 0, 1023


1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
# File 'lib/mechanize/net-overrides/net/http.rb', line 1176

def set_range(r, e = nil)
  unless r
    @header.delete 'range'
    return r
  end
  r = (r...r+e) if e
  case r
  when Numeric
    n = r.to_i
    rangestr = (n > 0 ? "0-#{n-1}" : "-#{-n}")
  when Range
    first = r.first
    last = r.last
    last -= 1 if r.exclude_end?
    if last == -1
      rangestr = (first > 0 ? "#{first}-" : "-#{-first}")
    else
      raise HTTPHeaderSyntaxError, 'range.first is negative' if first < 0
      raise HTTPHeaderSyntaxError, 'range.last is negative' if last < 0
      raise HTTPHeaderSyntaxError, 'must be .first < .last' if first > last
      rangestr = "#{first}-#{last}"
    end
  else
    raise TypeError, 'Range/Integer is required'
  end
  @header['range'] = ["bytes=#{rangestr}"]
  r
end

#sizeObject Also known as: length

:nodoc: obsolete



1030
1031
1032
# File 'lib/mechanize/net-overrides/net/http.rb', line 1030

def size   #:nodoc: obsolete
  @header.size
end

#sub_typeObject



1259
1260
1261
1262
# File 'lib/mechanize/net-overrides/net/http.rb', line 1259

def sub_type
  return nil unless @header['content-type']
  self['Content-Type'].split(';').first.to_s.split('/')[1].to_s.strip
end

#to_hashObject

Returns a Hash consist of header names and values.



1134
1135
1136
# File 'lib/mechanize/net-overrides/net/http.rb', line 1134

def to_hash
  @header.dup
end

#type_paramsObject



1264
1265
1266
1267
1268
1269
1270
1271
# File 'lib/mechanize/net-overrides/net/http.rb', line 1264

def type_params
  result = {}
  self['Content-Type'].to_s.split(';')[1..-1].each do |param|
    k, v = *param.split('=', 2)
    result[k.strip] = v.strip
  end
  result
end