私はかなり古いサーバーアプリケーションをC++で書いています。私はこれをサポートし、開発しなければなりません。そのコード履歴は15年以上の開発から成っています。ほとんどのコードは、ネット部分を含め、手動で記述されています。ホイールを再発明する多くの部分がある。 Unicodeのサポートなど文字列からHTTPリクエストを解析し、POCOを使用して本文を取得する方法はありますか?
私の主な目標は、バックグラウンドリファクタリングプロセスとして、うまく設計されてサポートされているオープンソースの代替案で、バグが発生しやすいホイールアイ部分を徐々に置き換えることです。ネットコードが優先されます。しかし、私はそれを一歩にすることはできません。
現在、私が必要とするのは、文字列からHTTPリクエストを解析する機能です。私はデータを送受信する必要はありません。古いコードはそれを行い、少なくとも今のところはそれを統合する必要があります。私はさまざまなヘッダーを読み、URIを取得し、それを解析する必要があります - クエリパラメータを含む。
私はとのトラブルを抱えている部分がリクエストボディを取得することです。 HTTPRequest
クラスでそれを達成する方法はありません。 HTTPServerRequestImpl
クラスにはstream()
というメソッドがありますが、そのクラスはHTTPServer
の内部的なものであるようです。セッション、ソケット、いくつかのパラメータなしで構築する方法はありません。
問題は次のとおりです。少なくとも、今のところはPOCOでネットワーク要求を行う必要はありません。私の現在の仕事を(httpxx、CPP-NETLIB)自分の欠けている機能を持つ各が、それは堅牢で、非常に汎用性の高いと思われるので、初期の段階からPOCOを統合する、本当に素晴らしいことだと交換することができます(I解決することができますいくつかの他のライブラリがあります。考えてみてください)。もちろん、リクエストを新しい行で区切る方法はありますが、POCO標準ツールがあればそれを好むでしょう。
#include <sstream>
#include <iostream>
#include <Poco/Net/HTTPRequest.h>
#include <Poco/URI.h>
int main()
{
std::stringstream str;
str <<
"POST http://www.example.com/ajax/gw-light.php?api_version=1.0&api_token=1111&input=3&cid=23232 HTTP/1.1\n"
"Host: www.example.com\n"
"User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0\n"
"Accept: */*\n"
"Accept-Language: en-US,en;q=0.7,uk;q=0.3\n"
"Accept-Encoding: gzip, deflate\n"
"Content-Type: text/plain;charset=UTF-8\n"
"Origin: http://www.example.com\n"
"Referer: http://www.example.com/album/10658860\n"
"Content-Length: 331\n"
"Cookie: __qca=dsgsfdgds; __utma=1234534543.5654604.1452342360.14123253.146543.84\n"
"Connection: keep-alive\n"
"\n"
"[{\"method\":\"log.listen\",\"params\":{\"params\":{\"media\":{\"id\":\"72192840\",\"type\":\"song\"},\"type\":0,\"stat\":{\"seek\":0,\"pause\":0},\"lt\":235,\"ctxt\":{\"t\":\"artist_discography\",\"id\":7094080},\"payload\":{},\"dev\":{\"v\":\"00350497\",\"t\":0},\"ls\":[],\"ts_listen\":1472135022,\"timestamp\":1472747105},\"next_media\":{\"media\":{\"id\":\"72192841\",\"type\":\"song\"}}}}]\n";
Poco::Net::HTTPRequest req;
req.read(str);
std::cout << "Host: " << req.getHost() << "\nMethod: " << req.getMethod() <<
"\nUser-Agent: " << req.get("User-Agent") << "\nURI: " << req.getURI() << std::endl;
Poco::Net::NameValueCollection cookies;
req.getCookies(cookies);
for(auto curCookieIt = cookies.begin(); curCookieIt != cookies.end(); ++curCookieIt)
std::cout << "Cookie: " << curCookieIt->first << "\n\tValue: " << curCookieIt->second << std::endl;
Poco::URI uri(req.getURI());
auto params = uri.getQueryParameters();
for(auto curParamIt = params.cbegin(); curParamIt != params.cend(); ++curParamIt)
std::cout << curParamIt->first << " : " << curParamIt->second << std::endl;
return 0;
}
コードが正常に機能している場合は、[Codereview](http://codereview.stackexchange.com)にお問い合わせください。 –
@Atomic_alarmいいえ、それはありません!コンパイルして期待どおりに動作することを意味しますが、要求の本体を取得しません。質問の目的は、試みが支援するための要求の体 –