From e45fc37c123618dce7dc29d1e092ab9854cf258c Mon Sep 17 00:00:00 2001 From: keita Date: Thu, 18 Feb 2021 11:34:23 +0900 Subject: [PATCH] =?UTF-8?q?post=E5=87=A6=E7=90=86=E3=82=92interface?= =?UTF-8?q?=E5=81=B4=E3=81=AB=E5=AE=9F=E8=A3=85(#51)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cocoatweet/api/interface/postInterface.cc | 87 ++++++++++++++++++ src/cocoatweet/api/interface/postInterface.h | 6 +- src/cocoatweet/api/status/update.cc | 88 +------------------ src/cocoatweet/api/status/update.h | 2 - 4 files changed, 91 insertions(+), 92 deletions(-) diff --git a/src/cocoatweet/api/interface/postInterface.cc b/src/cocoatweet/api/interface/postInterface.cc index da33bed..94660fa 100644 --- a/src/cocoatweet/api/interface/postInterface.cc +++ b/src/cocoatweet/api/interface/postInterface.cc @@ -1,4 +1,13 @@ #include +#include "cocoatweet/util/util.h" +#include +#include +#include +#include +#include +extern "C" { +#include +} namespace CocoaTweet::API::Interface { size_t postInterface::curlCallback_(char* _ptr, size_t _size, size_t _nmemb, @@ -7,4 +16,82 @@ size_t postInterface::curlCallback_(char* _ptr, size_t _size, size_t _nmemb, _stream->append(_ptr, realsize); return realsize; } + +void postInterface::process(std::weak_ptr _oauth, + std::function _callback) { + // エンドポイントへのパラメータにOAuthパラメータを付加して署名作成 + auto oauth = _oauth.lock(); + auto oauthParam = oauth->oauthParam(); + auto sigingParam = oauthParam; + for (const auto [k, v] : bodyParam_) { + sigingParam.insert_or_assign(k, v); + } + + auto signature = oauth->signature(sigingParam, "POST", url_); + + // 作成した署名をエンドポイントへのパラメータ及びOAuthパラメータに登録 + std::cout << "signature : " << signature["oauth_signature"] << std::endl; + oauthParam.merge(signature); + + // リクエストボディの構築 + std::string requestBody = ""; + { + std::vector tmp; + for (const auto& [key, value] : bodyParam_) { + tmp.push_back(key + "=" + value); + } + std::stringstream os; + std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, "&")); + requestBody = os.str(); + requestBody.erase(requestBody.size() - std::char_traits::length("&")); + } + std::cout << "request Body -> " << requestBody << std::endl; + + // ヘッダの構築 + std::string oauthHeader = "authorization: OAuth "; + { + std::vector tmp; + for (const auto& [key, value] : oauthParam) { + tmp.push_back(key + "=" + CocoaTweet::Util::urlEncode(value)); + } + std::stringstream os; + std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, ",")); + oauthHeader += os.str(); + oauthHeader.erase(oauthHeader.size() - std::char_traits::length(",")); + } + std::cout << "OAuth Header -> " << oauthHeader << std::endl; + + // do post + CURL* curl; + CURLcode res; + std::string rcv; + curl = curl_easy_init(); + url_ = url_; // + "?status=" + status_; + std::cout << "URL : " << url_ << std::endl; + if (curl) { + curl_easy_setopt(curl, CURLOPT_URL, url_.c_str()); + curl_easy_setopt(curl, CURLOPT_POST, 1); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBody.c_str()); + curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestBody.length()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallback_); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&rcv); + curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); + // Headerを保持するcurl_slist*を初期化 + struct curl_slist* headers = NULL; + // Authorizationをヘッダに追加 + headers = curl_slist_append(headers, oauthHeader.c_str()); + // headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); + res = curl_easy_perform(curl); + curl_easy_cleanup(curl); + } + if (res != CURLE_OK) { + std::cout << "curl error : " << res << std::endl; + exit(1); + } + + if (_callback) { + _callback(rcv); + } +} } // namespace CocoaTweet::API::Interface diff --git a/src/cocoatweet/api/interface/postInterface.h b/src/cocoatweet/api/interface/postInterface.h index a07f6e7..ea5a4a7 100644 --- a/src/cocoatweet/api/interface/postInterface.h +++ b/src/cocoatweet/api/interface/postInterface.h @@ -7,12 +7,12 @@ namespace CocoaTweet::API::Interface { class postInterface { public: - virtual void process(std::weak_ptr _oauth, - std::function _callback) = 0; + void process(std::weak_ptr _oauth, + std::function _callback); protected: std::weak_ptr oauth_; - std::map param_; + std::map bodyParam_; std::string url_; static size_t curlCallback_(char* _ptr, size_t _size, size_t _nmemb, std::string* _stream); }; diff --git a/src/cocoatweet/api/status/update.cc b/src/cocoatweet/api/status/update.cc index bc36ae4..621ef29 100644 --- a/src/cocoatweet/api/status/update.cc +++ b/src/cocoatweet/api/status/update.cc @@ -1,13 +1,4 @@ #include "cocoatweet/api/status/update.h" -#include "cocoatweet/util/util.h" -#include -#include -#include -#include -#include -extern "C" { -#include -} namespace CocoaTweet::API::Statuses { Update::Update() { @@ -15,84 +6,7 @@ Update::Update() { } void Update::status(const std::string _status) { status_ = _status; - param_.insert_or_assign("status", status_); + bodyParam_.insert_or_assign("status", status_); } -void Update::process(std::weak_ptr _oauth, - std::function _callback) { - // エンドポイントへのパラメータにOAuthパラメータを付加して署名作成 - auto oauth = _oauth.lock(); - auto oauthParam = oauth->oauthParam(); - auto sigingParam = oauthParam; - for (const auto [k, v] : param_) { - sigingParam.insert_or_assign(k, v); - } - - auto signature = oauth->signature(sigingParam, "POST", url_); - - // 作成した署名をエンドポイントへのパラメータ及びOAuthパラメータに登録 - std::cout << "signature : " << signature["oauth_signature"] << std::endl; - oauthParam.merge(signature); - - // リクエストボディの構築 - std::string requestBody = ""; - { - std::vector tmp; - for (const auto& [key, value] : param_) { - tmp.push_back(key + "=" + value); - } - std::stringstream os; - std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, "&")); - requestBody = os.str(); - requestBody.erase(requestBody.size() - std::char_traits::length("&")); - } - std::cout << "request Body -> " << requestBody << std::endl; - - // ヘッダの構築 - std::string oauthHeader = "authorization: OAuth "; - { - std::vector tmp; - for (const auto& [key, value] : oauthParam) { - tmp.push_back(key + "=" + CocoaTweet::Util::urlEncode(value)); - } - std::stringstream os; - std::copy(tmp.begin(), tmp.end(), std::ostream_iterator(os, ",")); - oauthHeader += os.str(); - oauthHeader.erase(oauthHeader.size() - std::char_traits::length(",")); - } - std::cout << "OAuth Header -> " << oauthHeader << std::endl; - - // do post - CURL* curl; - CURLcode res; - std::string rcv; - curl = curl_easy_init(); - url_ = url_; // + "?status=" + status_; - std::cout << "URL : " << url_ << std::endl; - if (curl) { - curl_easy_setopt(curl, CURLOPT_URL, url_.c_str()); - curl_easy_setopt(curl, CURLOPT_POST, 1); - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, requestBody.c_str()); - curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, requestBody.length()); - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curlCallback_); - curl_easy_setopt(curl, CURLOPT_WRITEDATA, (std::string*)&rcv); - curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); - // Headerを保持するcurl_slist*を初期化 - struct curl_slist* headers = NULL; - // Authorizationをヘッダに追加 - headers = curl_slist_append(headers, oauthHeader.c_str()); - // headers = curl_slist_append(headers, "Content-Type: application/x-www-form-urlencoded"); - curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); - res = curl_easy_perform(curl); - curl_easy_cleanup(curl); - } - if (res != CURLE_OK) { - std::cout << "curl error : " << res << std::endl; - exit(1); - } - - if (_callback) { - _callback(rcv); - } -} } // namespace CocoaTweet::API::Statuses diff --git a/src/cocoatweet/api/status/update.h b/src/cocoatweet/api/status/update.h index d3b88a6..db12d8c 100644 --- a/src/cocoatweet/api/status/update.h +++ b/src/cocoatweet/api/status/update.h @@ -11,8 +11,6 @@ class Update : public CocoaTweet::API::Interface::postInterface { public: Update(); void status(const std::string _status); - void process(std::weak_ptr _oauth, - std::function _callback); private: std::string status_;