apache::thrift чтение файлов по http
От: eight Россия  
Дата: 24.10.14 17:45
Оценка:
Добрый день! У меня проблема с использованием 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;
        }
Re: apache::thrift чтение файлов по http
От: Pavel Dvorkin Россия  
Дата: 25.10.14 16:27
Оценка:
Здравствуйте, 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 ?
With best regards
Pavel Dvorkin
Отредактировано 25.10.2014 16:30 Pavel Dvorkin . Предыдущая версия .
Re[2]: apache::thrift чтение файлов по http
От: eight Россия  
Дата: 26.10.14 14:50
Оценка:
Здравствуйте, 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к. Получается что я не могу передавать объекты большего размера?
Re[3]: apache::thrift чтение файлов по http
От: Pavel Dvorkin Россия  
Дата: 26.10.14 16:51
Оценка:
Здравствуйте, eight, Вы писали:

E>Вот этот число 8000 и есть те самый 32к. Получается что я не могу передавать объекты большего размера?


Я смутно припоминаю, что вроде как некий лимит есть. Но не уверен.
With best regards
Pavel Dvorkin
Re[4]: apache::thrift чтение файлов по http
От: eight Россия  
Дата: 26.10.14 17:27
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, eight, Вы писали:


E>>Вот этот число 8000 и есть те самый 32к. Получается что я не могу передавать объекты большего размера?


PD>Я смутно припоминаю, что вроде как некий лимит есть. Но не уверен.


Причина обнаружена и кроется она в заголовочных файлах thrift'а. Пришлось переписать код некоторых методов, чтобы всё заработало. Чуть позже опишу детальнее суть проблемы и то как она решается.

Спасибо, за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.