2015-07-16 7 views
2

В настоящее время я использую curlpp для выполнения HTTP-запроса, но curlpp сообщает, что в URL есть недопустимые символы. Я сузил проблему URL-адреса для переменной, которая считывается из файла конфигурации (одна строка, она просто содержит необходимую информацию). Еще одна странность в том, что это происходит только при установке Fedora x64bits (я не пробовал другие дистрибутивы x64bits). На моих двух машинах разработки он отлично работает (Ubuntu и OpenSuse, 32 бит). Я пробовал распечатать код ASCII символов, считанных из файла, и все выглядит совершенно нормально, однако в конце строки есть символ линии. Теперь этот символ встречается во всех системах, но в системе Fedora он сообщается как незаконный символ. Замена этого символа символом нулевой остановки заставляет программу работать отлично.Проблема с символом перевода строки в libcurl (curlpp)

Мне было интересно, есть ли возможность заставить curlpp игнорировать символ линии. Я также попытался избежать строки с помощью функции curl_easy_escape, но она преобразует символ линии строки в процентную кодировку% 0A. Это, в свою очередь, не распознается HTTP-сервером как существующий URL (он выдает ошибку 404).

Неужели кто-нибудь сталкивался с этой проблемой раньше? Можно ли игнорировать этот символ или лучше всего подходит для его замены?

Заранее благодарим за вашу помощь!

С наилучшими пожеланиями,

PS: Во всех системах, версии библиотеки одинаковы (что несколько странно). Версия curlpp is (0.7.3)

EDIT: Из-за популярного спроса я отправляю код, который читает переменную из файла.

std::ifstream keyfile (pathToFile.c_str()); 
    std::stringstream buffer; 
    buffer << keyfile.rdbuf(); 
+1

Share код, который считывает значение из конф файла. Проблема, кажется, в вашем файле conf или чтении, а не в Curl. –

+1

Символ строки не должен быть частью URL-адреса, я думаю, вам нужно посмотреть, как извлекается URL-адрес из файла конфигурации - почему он читает строку? – Galik

+1

P.S. Вы можете использовать его, обрезая строку перед ее использованием: http://stackoverflow.com/a/25385766/3807729, но вы действительно должны исправить функцию, которая читает файл конфигурации. – Galik

ответ

0

Как вы прочитать файл ключа будет сваливать все в вашем std::stringstream включая конец строки.

Одна вещь, которую вы можете сделать, это использовать >>, который будет читать первое слово целиком он находит пропуская ведущие пробелы:

std::ifstream keyfile(pathToFile.c_str()); 
std::string api_key; 

// will skip leading spaces and only read up to the next space 
// or end of line 
keyfile >> api_key; 
+0

Прежде всего, я хотел бы поблагодарить вас (@Galik) и @NTN за вашу огромную помощь в этом вопросе. Ваш ответ исправил мою проблему, конечно.У меня был аналогичный код (по функциональности), который заменил последний символ (str.length -1) на «\ 0», эффективно удалив символ LF. Теперь я хотел бы отправить еще два вопроса, если можно: Во-первых, почему вы думаете, что это происходит только на одной конкретной системе, так как версии curlpp одинаковы? Во-вторых, почему rdbuff читает LF, когда его нет? Я имею в виду, что вызов od -c в файле выводит ключ и \ n, не более того. Спасибо за вашу помощь – user3124955

+0

@ user3124955 Мое предположение было бы на других системах, файл данных просто не имел в них концевого символа конца строки. Используя 'rdbuff()' читает весь файл, поэтому я предполагаю, что в некоторых системах api-key был введен вместе с новой строкой, а в других системах он был введен без новой строки. Если это не проблема, я понятия не имею :) – Galik