class WeChat::Bot::HTTP::Session

可保存 Cookies 的 HTTP 请求类

简单实现 Python 版本 {docs.python-requests.org/zh_CN/latest/user/advanced.html#session-objects requests.Session()}

Attributes

cookies[R]

@return [HTTP::CookieJar]

Public Class Methods

new(bot) click to toggle source
# File lib/wechat/bot/http/session.rb, line 12
def initialize(bot)
  @bot = bot

  load_cookies(@bot.config.cookies)
end

Public Instance Methods

delete(url, options = {}) click to toggle source

@return [HTTP::Response]

# File lib/wechat/bot/http/session.rb, line 34
def delete(url, options = {})
  request(:delete, url, options)
end
get(url, options = {}) click to toggle source

@return [HTTP::Response]

# File lib/wechat/bot/http/session.rb, line 19
def get(url, options = {})
  request(:get, url, options)
end
post(url, options = {}) click to toggle source

@return [HTTP::Response]

# File lib/wechat/bot/http/session.rb, line 24
def post(url, options = {})
  request(:post, url, options)
end
put(url, options = {}) click to toggle source

@return [HTTP::Response]

# File lib/wechat/bot/http/session.rb, line 29
def put(url, options = {})
  request(:put, url, options)
end
request(verb, url, options = {}) click to toggle source

@return [HTTP::Response]

# File lib/wechat/bot/http/session.rb, line 39
def request(verb, url, options = {})
  prepare_request(url)

  if options[:timeout]
    connect_timeout, read_timeout = options.delete(:timeout)
    @client = @client.timeout(connect: connect_timeout, read: read_timeout)
  end

  response = @client.request(verb, url, options)
  update_cookies(response.cookies)

  @bot.logger.verbose "[#{verb.upcase}] #{url}"
  @bot.logger.verbose "Options: #{options}"
  @bot.logger.verbose "Response: #{response.body}"

  response
end

Private Instance Methods

load_cookies(cookies) click to toggle source

加载外部的 Cookies 数据

@api private @param [String, HTTP::CooieJar] cookies @return [void]

# File lib/wechat/bot/http/session.rb, line 92
def load_cookies(cookies)
  @cookies = ::HTTP::CookieJar.new
  return if cookies.nil?

  if cookies.is_a?(String)
    @cookies.load(cookies) if File.exist?(cookies)
  else
    @cookies.add(cookies)
  end
end
prepare_request(url) click to toggle source

组装 request 基础请求参数

- 设置 User-Agent
- 设置 Cooklies

@api private @param [String] url @return [HTTP::Request]

# File lib/wechat/bot/http/session.rb, line 67
def prepare_request(url)
  @client = ::HTTP.headers(user_agent: @bot.config.user_agent, "Range" => "bytes=0-")
  return @client if @cookies.nil?
  return @client = @client.cookies(@cookies)

  # TODO: 优化处理同一顶级域名的 cookies
  # uri = URI(url)
  # unless @cookies.empty?(uri)
  #   cookies = @cookies.clone
  #   cookies.cookies.each do |cookie|
  #     cookies.delete(cookie) if uri.host != cookie.domain
  #   end

  #   unless cookies.empty?(uri)
  #     @client = @client.cookies(@cookies)
  #   end
  # end

end
update_cookies(cookies) click to toggle source

请求后更新存储的 Cookies 数据

@api private @param [String, HTTP::CooieJar] cookies @return [void]

# File lib/wechat/bot/http/session.rb, line 108
def update_cookies(cookies)
  return @cookies = cookies if @cookies.nil? || @cookies.empty?

  cookies.cookies.each do |cookie|
    @cookies.add(cookie)
  end
end