From a2b3249b31b7f5b4441bca32c68b255b082413b3 Mon Sep 17 00:00:00 2001 From: Patrick Simmons Date: Thu, 20 Sep 2018 14:45:11 -0500 Subject: [PATCH] Changes to make ETrade work --- include/liboauthcpp/liboauthcpp.h | 7 +++++-- src/liboauthcpp.cpp | 14 +++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/liboauthcpp/liboauthcpp.h b/include/liboauthcpp/liboauthcpp.h index 59ccfd2..6366a45 100644 --- a/include/liboauthcpp/liboauthcpp.h +++ b/include/liboauthcpp/liboauthcpp.h @@ -203,8 +203,10 @@ class Client { std::string getHttpHeader(const Http::RequestType eType, const std::string& rawUrl, const std::string& rawData = "", + const KeyValuePairs& additional_keys = {}, const bool includeOAuthVerifierPin = false) const; - /** Build an OAuth HTTP header for the given request. This version gives a + + /** Build an OAuth HTTP header for the given request. This version gives a * fully formatted header, i.e. including the header field name. * * \param eType the HTTP request type, e.g. GET or POST @@ -270,7 +272,8 @@ class Client { const Http::RequestType eType, const std::string& rawUrl, const std::string& rawData, - const bool includeOAuthVerifierPin) const; + const bool includeOAuthVerifierPin, + const KeyValuePairs& additionalKeyPairs = {}) const; bool getSignature( const Http::RequestType eType, /* in */ const std::string& rawUrl, /* in */ diff --git a/src/liboauthcpp.cpp b/src/liboauthcpp.cpp index 72925cf..e520fb0 100644 --- a/src/liboauthcpp.cpp +++ b/src/liboauthcpp.cpp @@ -435,9 +435,10 @@ bool Client::getSignature( const Http::RequestType eType, std::string Client::getHttpHeader(const Http::RequestType eType, const std::string& rawUrl, const std::string& rawData, + const KeyValuePairs& additional_keys, const bool includeOAuthVerifierPin) const { - return Defaults::AUTHHEADER_PREFIX + buildOAuthParameterString(AuthorizationHeaderString, eType, rawUrl, rawData, includeOAuthVerifierPin); + return Defaults::AUTHHEADER_PREFIX + buildOAuthParameterString(AuthorizationHeaderString, eType, rawUrl, rawData, includeOAuthVerifierPin, additional_keys); } std::string Client::getFormattedHttpHeader(const Http::RequestType eType, @@ -461,7 +462,8 @@ std::string Client::buildOAuthParameterString( const Http::RequestType eType, const std::string& rawUrl, const std::string& rawData, - const bool includeOAuthVerifierPin) const + const bool includeOAuthVerifierPin, + const KeyValuePairs& additionalKeyPairs) const { KeyValuePairs rawKeyValuePairs; std::string rawParams; @@ -475,7 +477,7 @@ std::string Client::buildOAuthParameterString( bool do_urlencode; if (string_type == AuthorizationHeaderString) { separator = ","; - do_urlencode = false; + do_urlencode = true; } else { // QueryStringString separator = "&"; @@ -497,6 +499,9 @@ std::string Client::buildOAuthParameterString( rawKeyValuePairs = ParseKeyValuePairs(dataPart); } + for(const auto& x : additionalKeyPairs) + rawKeyValuePairs.insert(x); + // NOTE: We always request URL encoding on the first pass so that the // signature generation works properly. This *relies* on // buildOAuthTokenKeyValuePairs overwriting values when we do the second @@ -533,6 +538,9 @@ std::string Client::buildOAuthParameterString( oauth_keys.push_back(Defaults::VERIFIER_KEY); oauth_keys.push_back(Defaults::VERSION_KEY); + for(const auto& x : additionalKeyPairs) + oauth_keys.push_back(x.first); + for(size_t i = 0; i < oauth_keys.size(); i++) { assert(rawKeyValuePairs.count(oauth_keys[i]) <= 1); KeyValuePairs::iterator oauth_key_it = rawKeyValuePairs.find(oauth_keys[i]);