2016-09-01 23 views
1

私はかなり古いサーバーアプリケーションを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; 
} 
+0

コードが正常に機能している場合は、[Codereview](http://codereview.stackexchange.com)にお問い合わせください。 –

+0

@Atomic_alarmいいえ、それはありません!コンパイルして期待どおりに動作することを意味しますが、要求の本体を取得しません。質問の目的は、試みが支援するための要求の体 –

答えて

0

HTTPRequestオブジェクトはについて何も知らない:ここで

は多分それが誰かを助けたり、私がライブラリを使用する方法、より良いアイデアを与えるだろう、POCOのために(いくつかのテストHTTPデータとの)私のテストプロジェクトコードです要求の本体。したがって、HTTPRequestからこの情報を取得することはできません。リクエストボディを送信する必要がある場合は、 HTTPClientSessionを使用してください。ドキュメントから:

HTTPリクエストをHTTPサーバーに送信するには、まずHTTPClientSessionオブジェクトをインスタンス化し、サーバーのホスト名とポート番号を指定します。 次に、HTTPRequestオブジェクトを作成し、それに応じて入力し、引数としてsendRequest()メソッドに渡します。 sendRequest()は、要求本体がある場合は、その送信に使用できる出力ストリームを返します。あなたがリクエストボディを送信して行われた後 は、HttpResponseオブジェクトを作成し、receiveResponseに渡し()。 これは、応答本体を読み取るために使用できる入力ストリームを返します。

+0

感謝を取得する方法を見つけることですが、私ははっきりと問題のいくつかの場所で述べたように - 私はすでにそこに書かれている、POCOを使って何を送信するためのコードを必要としないでくださいそれのために。私は文字列ですべてのリクエスト\応答を持っていて、それを解析するだけです。それはコードスニペットから明らかにする必要があります... –

+0

@Occulta、うーん、私は質問を理解していない。たとえば、文字列を2つの部分に分割するには、regexを使用できます。 http://ideone.com/okLnIS –

+0

は、私はそれを行うにはPOCOの標準的な方法がある望ん - 要求の本文を取得します。質問から引用: 'もちろん、新しい行でリクエストを分離する方法はありますが、存在する場合はPOCO標準ツールが本当に好きです。 ' –

関連する問題