@armadillo-cld

InternetReadFile добавляет ересь в конец строки. Что делать?

Всем привет.
Есть встроенный класс Requests.
Я использую в нём функцию GetRequest.
Собственно, вот она:
string GetRequest(string url, string path = "", string ContentType = "") {
		InternetSetOption(0, 42, NULL, 0);

		HINTERNET hSocket = InternetOpen(TEXT("FORMATC"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL);
		if (hSocket != NULL) {
			HINTERNET hConnection = InternetConnect(hSocket, TEXT(url.c_str()), INTERNET_DEFAULT_HTTPS_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
			if (hConnection != NULL) {
				HINTERNET hRequest;
				if (path == "") {
					hRequest = HttpOpenRequest(hConnection, TEXT("GET"), NULL, NULL, NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 1);
				}
				else {
					hRequest = HttpOpenRequest(hConnection, TEXT("GET"), TEXT(path.c_str()), NULL, NULL, 0, INTERNET_FLAG_RELOAD | INTERNET_FLAG_SECURE, 1);
				}

				if (hRequest != NULL) {
					if (ContentType == "") {
						HttpSendRequest(hRequest, NULL, 0, NULL, 0);
					}
					else {
						HttpSendRequest(hRequest, ContentType.c_str(), ContentType.length(), NULL, NULL);
					}
					char strContent[1024];
					DWORD dwByteRead;
					InternetReadFile(hRequest, strContent, sizeof(strContent) - 1, &dwByteRead);

					return string(strContent);
				}
				InternetCloseHandle(hRequest);
			}
			InternetCloseHandle(hConnection);
		}
		InternetCloseHandle(hSocket);
		return "";
	}

Спустя некоторое время в конец строки начались добавляться какие-то символы.
Первые 10-15 раз всё работало нормально, выводило вот так:
{"response":"ok"}
И я парсил json, и получал значение response.
Но потом через отладку я заметил, что выдаёт не такую строку {"response":"ok"}, а такую: {"response":"ok"}(*@D. Ну там не такие символы, но думаю, вы поняли. В общем из-за этих символов крашится nlohmann::json, и я не могу нормально спарсить. Помогите, что делать?

Обновил. Вот два скрина результата запроса: https://imgur.com/a/2d1E3nm
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
@armadillo-cld Автор вопроса
Кхм-кхм...
Мне, наверное, пора идти спать, 5 часов утра как-никак.
Решение возникло сразу же, когда я посмотрел на массив.
Объявлен был так:
strContent[1024];
По сути там же ничего нет, так что было достаточно заполнить его нулями:
strContent[1024] = {0};
И всё заработало.
Не расценивайте как спам, просто был невнимателен, а решение оставлю, вдруг у кого то тоже такое будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@none7
Неправильное Вы выбрали решение проблемы.
InternetReadFile(hRequest, strContent, sizeof(strContent)/* - 1*/, &dwByteRead);
return string(strContent, dwByteRead);

InternetReadFile это не строковая функция, она не добавляет ноль в конец массива и более того, может добавить их в любое место массива, если читается двоичный файл. Есть к слову такой класс уязвимостей, когда строка то массив символов вроде std::string, то null-terminated. Проверки одного совершенно ничего не значат, для другого, так как std::string может хранить нулевой символ!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы