LoginSignup
2
2

More than 5 years have passed since last update.

Cocos2d-x v2.2.5 のCCHttpRequestのレスポンスにNULL終端文字が付加されない問題

Last updated at Posted at 2014-11-18

今更だけどCocos2d-x v2.2.5のCCHttpRequest::getResponseData()でレスポンスを受け取り、JSONに解析するコードを書いてたんだけど、JSON文字列の末尾に変な文字列が付加されてしまう。これは前述のメソッドがレスポンスボディ終端にNULL文字を付加しないためらしい。

void HelloWorld::sendReqeust()
{
    std::string url = "http://example.com/path/to/api";

    CCHttpRequest *request = new CCHttpRequest();
    request->setUrl(url.c_str());
    request->setRequestType(CCHttpRequest::kHttpGet);
    request->setResponseCallback(this, httpresponse_selector(HellowWorld::requestHandler));

    CCHttpClient *client = CCHttpClient::getInstance();
    client->send(request);
    request->release();
}

void HelloWorld::requestHandler(CCHttpClient *sender, CCHttpResponse *response)
{
    int responseCode = response->getResponseCode();
    if ( responseCode != 200 )
    {
        CCLOG("Request Error: Code: %d", responseCode);
        return;
    }

    // レスポンス取得
    std::vector<char> *buffer = response->getResponseData();

    // 手動で終端NULL文字を追加するとうまくいく(これはつらい)
    buffer->push_back('\0');

    CCLOG("Response string: %s", &(*buffer)[0]);

    // parse json
    rapidjson::Document json;
    json<rapidjson::kParseDefaultFlags>(&(*buffer)[0]);
    if ( settings.HasParseError() )
    {
        CCLOG("JSON Parse Error");
        return;
    }

    ….
}

3系では起こらないみたいだけど、何かの役に立つかもしれないのでメモ。

追記と理由

終端文字列を付加しないのは、画像のレスポンスを考慮してのことかもしれない、らしい。
なのでこれはこれで正しい実装なのかもしれない

または、

std::string(buffer->begin(), buffer->end());

とすればうまくいくみたい。

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2