Добрый день! У меня проблема с использованием apache::thrift
Задача состоит в том, чтобы получить в request файл, он там представляется как std::string. Всё работает замечательно, но на небольших файлах, размер которых не превосходит 32 кб. Вылетает исключение с с текстом — BadRequest 7ff4. Там видимо есть внутренний буфер, который нужно как-то увеличить но я не могу понять как! Буду очень благодарен, тем кто сможет чем-то помочь!
bool DownloadPackage(__int64 package_id, __out std::string& dest_file_path)
{
TDsaDistrGetV1Result response;
TDsaDistrGetV1Args request;
request.__set_id(package_id);
try
{
boost::shared_ptr<TBinaryProtocol> protocol((new TBinaryProtocol(m_client_http)));
// тут, даже ставлю большие ограничения по несколько мегобайт.
protocol->setStringSizeLimit(MEM_SIZE_LIMIT);
protocol->setContainerSizeLimit(MEM_SIZE_LIMIT);
boost::shared_ptr<spsb::TDsaDistrGetV1Client> client(new spsb::TDsaDistrGetV1Client(protocol));
//
// Download new package.
//
m_client_http.get()->open();
client.get()->distrGet(response, request);
m_client_http.get()->close();
SaveBinaryPackage(package_id,
dest_file_path,
(const BYTE*) response.zippedDistr.data(),
response.zippedDistr.length());
printf("\nresponse size: %d\n", response.zippedDistr.length());
}
catch (TTransportException &e)
{
std::cout << "Update service is unavailable, cause is " << e.what() << std::endl;
std::cout << "Response result msg: " << response.resultMessage.code << std::endl;
std::cout << "Exception type is " << e.getType() << std::endl;
std::cout << "Last error code is " << GetLastError() << std::endl;
return false;
}
Здравствуйте, eight, Вы писали:
E>Задача состоит в том, чтобы получить в request файл, он там представляется как std::string. Всё работает замечательно, но на небольших файлах, размер которых не превосходит 32 кб. Вылетает исключение с с текстом — BadRequest 7ff4. Там видимо есть внутренний буфер, который нужно как-то увеличить но я не могу понять как! Буду очень благодарен, тем кто сможет чем-то помочь!
С thrift работал , но из Явы.
Посмотри вот сюда. Там есть возможность снять ограничение на размер
https://apache.googlesource.com/thrift/+/master/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
NO_LENGTH_LIMIT
Нет ли в С++ конструктора, принимающего размер, аналогичного
public TBinaryProtocol(TTransport trans, long stringLengthLimit, long containerLengthLimit, boolean strictRead, boolean strictWrite)
?
P.S. А почему string ? Почему не binary ?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, eight, Вы писали:
E>>Задача состоит в том, чтобы получить в request файл, он там представляется как std::string. Всё работает замечательно, но на небольших файлах, размер которых не превосходит 32 кб. Вылетает исключение с с текстом — BadRequest 7ff4. Там видимо есть внутренний буфер, который нужно как-то увеличить но я не могу понять как! Буду очень благодарен, тем кто сможет чем-то помочь!
PD>С thrift работал , но из Явы.
PD>Посмотри вот сюда. Там есть возможность снять ограничение на размер
PD>https://apache.googlesource.com/thrift/+/master/lib/java/src/org/apache/thrift/protocol/TBinaryProtocol.java
PD>NO_LENGTH_LIMIT
PD>Нет ли в С++ конструктора, принимающего размер, аналогичного
PD> public TBinaryProtocol(TTransport trans, long stringLengthLimit, long containerLengthLimit, boolean strictRead, boolean strictWrite)
PD>?
PD>P.S. А почему string ? Почему не binary ?
Ограничение снял иначе, в заголовочных файлах изменил константные значения. Но проблема не исчезла, всё осталось по-прежнему. Начал отлаживать увидел что в ответе приходит следующее.
0x00AB013F 64 0d 0a 53 65 72 76 65 72 3a 20 4a 65 74 74 79 28 d..Server: Jetty(
0x00AB0150 38 2e 31 2e 31 34 2e 76 32 30 31 33 31 30 33 31 29 8.1.14.v20131031)
0x00AB0161 0d 0a 0d 0a 38 30 30 30 0d 0a 80 01 00 02 00 00 00 ....8000..Ђ......
0x00AB0172 08 64 69 73 74 72 47 65 74 00 00 00 00 0c 00 00 0c .distrGet........
0x00AB0183 00 01 0b 00 01 00 00 00 07 53 55 43 43 45 53 53 0b .........SUCCESS.
0x00AB0194 00 02 00 00 00 32 d0 9e d0 bf d0 b5 d1 80 d0 b0 d1 .....2ОпераС
0x00AB01A5 86 d0 b8 d1 8f 20 d1 83 d1 81 d0 bf d0 b5 d1 88 d0 .РёСЏ успешР
0x00AB01B6 bd d0 be 20 d0 b2 d1 8b d0 bf d0 be d0 bb d0 bd d0 ЅРѕ РІС.полнР
0x00AB01C7 b5 d0 bd d0 b0 00 0b 00 02 00 09 34 e2 50 4b 03 04 µРЅР°......4вPK..
Вот этот число 8000 и есть те самый 32к. Получается что я не могу передавать объекты большего размера?
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, eight, Вы писали:
E>>Вот этот число 8000 и есть те самый 32к. Получается что я не могу передавать объекты большего размера?
PD>Я смутно припоминаю, что вроде как некий лимит есть. Но не уверен.
Причина обнаружена и кроется она в заголовочных файлах thrift'а. Пришлось переписать код некоторых методов, чтобы всё заработало. Чуть позже опишу детальнее суть проблемы и то как она решается.
Спасибо, за помощь!