1

HTTPリクエストを作成するため、およびREST APIを使用するためにHTTPartyを使用しています。 POSTで呼び出されたログインページで設定されたCookieを再利用したいのですが、HTTPartyでHTTPヘッダー 'set-cookie'を解析する

class SomeImporter 
    include HTTParty 

    def self.login 
    response = self.post('https://www.example.com/login', :query => {:user => 'myusername', :password => 'secret'}) 
    self.default_cookies.add_cookies(response.header['set-cookie']) 
    self.get('https://www.example.com/protected') 
    end 
end 

このコードでは、Cookieが正しく設定されていません。 HTTPartyによって与えられた 'set-cookie'ヘッダを正しく解析し、次のリクエストのためにクッキーを設定するには?

答えて

2

通常、HTTPヘッダーにはそれぞれSet-Cookieのエントリが1つあります。 HTTPartyはそれらを1つの文字列でコンマ区切りのリストとしてマージします。しかし、HTTPartyは、それらをデフォルトのクッキーに戻すときにそれらを分割しません。あなたは自分でそれらを解析する必要があります。

以下の方法で 'set-cookie'を解析することは可能です。あなたのクラスにそれを追加します。

# Parse the 'set-cookie' string 
# @param [String] all_cookies_string 
# @return [Hash] 
def self.parse_set_cookie(all_cookies_string) 
    cookies = Hash.new 

    if all_cookies_string.present? 
    # single cookies are devided with comma 
    all_cookies_string.split(',').each { 
     # @type [String] cookie_string 
     |single_cookie_string| 
     # parts of single cookie are seperated by semicolon; first part is key and value of this cookie 
     # @type [String] 
     cookie_part_string = single_cookie_string.strip.split(';')[0] 
     # remove whitespaces at beginning and end in place and split at '=' 
     # @type [Array] 
     cookie_part   = cookie_part_string.strip.split('=') 
     # @type [String] 
     key     = cookie_part[0] 
     # @type [String] 
     value    = cookie_part[1] 

     # add cookie to Hash 
     cookies[key] = value 
    } 
    end 

    cookies 
end 

クッキーは、このラインを調整することにより、リクエストを以下のためHTTPartyに追加することができます。

self.default_cookies.add_cookies(self.parse_set_cookie(response.header['set-cookie'])) 

self.parse_set_cookie内でクッキーが名前と値のみが抽出されます。あなたはPathDomainのような詳細を取得するためにそれを拡張することができます。詳細は、RFC 2109(4.2.2 Set-Cookie構文)を参照してください。

0
def cookies_to_hash(acookies) 
    vs = acookies.split(',') 
    ak = Array.new 
    # Avoiding break in expiry date comma 
    vs.each_cons(2) do |v, vn| 
     unless(vn.include?("=")) 
      ak << "#{v}#{vn}" 
     else 
      ak << v if(v.include?("=")) 
     end 
    end 
    # Cookies as array of hashes 
    all_cookies = [] 
    ak.each do |each_cookie| 
     ecookie = [] 
     each_cookie.split(';').each do |cookie_attr| 
      ecookie << cookie_attr.split("=") 
     end 
     all_cookies << Hash[ecookie] 
    end 
    all_cookies 
end 

上記の方法は、あなたがハッシュの有効な配列に応答ヘッダーのセットクッキーを変換するのに役立ちます。期限切れにカンマが追加された問題を処理しました。

関連する問題