/
EvilBeaver
/
OneScript
Обзор
Документация
Войти
/
EvilBeaver
/
OneScript
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
develop
tests/http.os
596 строк
34 KB
Alexey Sosnoviy
Параметр rawStream Метода ПолучитьТелоКакПоток()
12 дек 2025, 17:13
12 дек 2025, 17:13
4a702c0
Код
Авторство
О чём код?
Перем юТест; Перем мАдресРесурса; // URL ресурса (хоста) для тестирования запросов Перем ПортТестовогоСервера; Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт юТест = ЮнитТестирование; ВсеТесты = Новый Массив; // Отключено временно: см https://github.com/EvilBeaver/OneScript/pull/1018 //ВсеТесты.Добавить("ТестДолжен_ПроверитьОтключениеПеренаправления"); //ВсеТесты.Добавить("ТестДолжен_ПроверитьАвтоматическоеПеренаправление"); ВсеТесты.Добавить("ТестДолжен_ПроверитьАвтоматическуюРаспаковкуGZip"); ВсеТесты.Добавить("ТестДолжен_ПроверитьАвторизациюПрокси"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойствоПортHttpСоединения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойстваПользовательПарольHttpСоединения"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомПолучить_GET"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомЗаписать_PUT"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомОтправитьДляОбработки_POST"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомИзменить_PATCH"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомУдалить_DELETE"); ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомПолучитьЗаголовки_HEAD"); ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ВызватьHTTPМетод_СНесуществующимМетодомHTTP"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоКонструкторЗапросаВозвращаетКорректноеИсключение"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоЗапросСоздаетсяСПустымТелом"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзДвоичныхДанныхИПолучитьКакСтроку"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьКакСтрокуИПолучитьКакДвоичныеДанные"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзДвоичныхДанныхПослеЕгоУстановкиИзСтроки"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзСтрокиПослеЕгоУстановкиИзДвоичныхДанных"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоПриПолученииТелоКакПотокаПроисходитИнициализацияТела"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоСПомощьюПотокаВТелоМожноДописатьДанные"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоМожноЗадатьТелоЗапросаСПомощьюПотока"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоМетодыБезТелаПриУстановленномТелеУспешноВыполняются"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоРаботаетПолучениеДвоичныхДанныхИзОтвета"); ВсеТесты.Добавить("ТестДолженПроверитьЧтоТелоМожноПолучитьНесколькоРаз"); ВсеТесты.Добавить("ТестДолженПроверитьПолучениеТелаПослеЗакрытогоПотока"); ВсеТесты.Добавить("ТестДолженПроверитьНедоступностьЧистогоПотокаПослеПолученияТела"); ВсеТесты.Добавить("ТестДолженПроверитьПолучениеStreamEvent"); Возврат ВсеТесты; КонецФункции Процедура ПередЗапускомТеста() Экспорт Если мАдресРесурса = Неопределено Тогда мАдресРесурса = ВыбратьДоступныйХост(); Сообщить("HTTP тесты: используется ресурс " + мАдресРесурса); КонецЕсли; КонецПроцедуры Процедура ТестДолжен_ПроверитьАвтоматическуюРаспаковкуGZip() Экспорт Запрос = Новый HttpЗапрос("/gzip"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьРавенство(Истина, JsonВОбъект(ТелоОтвета)["gzipped"]); КонецПроцедуры Процедура ТестДолжен_ПроверитьОтключениеПеренаправления() Экспорт Запрос = Новый HttpЗапрос("/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fget&status_code=307"); Соединение = Новый HttpСоединение(мАдресРесурса); Соединение.РазрешитьАвтоматическоеПеренаправление = Ложь; Ответ = Соединение.Получить(Запрос); юТест.ПроверитьРавенство(307, Ответ.КодСостояния); юТест.ПроверитьРавенство("http://httpbin.org/get", Ответ.Заголовки["Location"]); КонецПроцедуры Процедура ТестДолжен_ПроверитьАвтоматическоеПеренаправление() Экспорт Запрос = Новый HttpЗапрос("/redirect-to?url=http%3A%2F%2Fhttpbin.org%2Fget&status_code=307"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); КонецПроцедуры Процедура ТестДолжен_ПроверитьАвторизациюПрокси() Экспорт Прокси = Новый ИнтернетПрокси(Ложь); Прокси.Установить("http","proxy.server.lan", 8080, "someuser", "somepassword", Ложь); юТест.ПроверитьРавенство("someuser",Прокси.Пользователь("http")); юТест.ПроверитьРавенство("somepassword",Прокси.Пароль("http")); КонецПроцедуры Процедура ТестДолжен_ПроверитьСвойствоПортHttpСоединения() Экспорт Соединение = Новый HttpСоединение("http://localhost:8080"); юТест.ПроверитьРавенство(8080, Соединение.Порт); Соединение = Новый HttpСоединение("http://localhost", 8080); юТест.ПроверитьРавенство(8080, Соединение.Порт); КонецПроцедуры Процедура ТестДолжен_ПроверитьСвойстваПользовательПарольHttpСоединения() Экспорт Соединение = Новый HttpСоединение("http://localhost"); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомПолучить_GET() Экспорт Запрос = Новый HttpЗапрос("/get?p1=v1&p2=v2"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(ТелоОтвета, """p1"": ""v1"""); юТест.ПроверитьВхождение(ТелоОтвета, """p2"": ""v2"""); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомЗаписать_PUT() Экспорт ТестовыеДанные = "Hello from 1Script!"; Запрос = Новый HttpЗапрос("/put"); Запрос.УстановитьТелоИзСтроки(ТестовыеДанные); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Записать(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), ТестовыеДанные); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомОтправитьДляОбработки_POST() Экспорт ТестовыеДанные = "Hello from 1Script!"; Запрос = Новый HttpЗапрос("/post"); Запрос.УстановитьТелоИзСтроки(ТестовыеДанные); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ОтправитьДляОбработки(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), ТестовыеДанные); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомОтправитьДляОбработки_POST_РезультатВФайл() Экспорт ВремФайл = Новый Файл(ПолучитьИмяВременногоФайла()); ТестовыеДанные = "Hello from 1Script!"; Запрос = Новый HttpЗапрос("/post"); Запрос.УстановитьТелоИзСтроки(ТестовыеДанные); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ОтправитьДляОбработки(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьИстину(ВремФайл.Существует()); СодержимоеФайла = Новый ЧтениеТекста(ВремФайл.ПолныйПуть); юТест.ПроверитьВхождение(СодержимоеФайла.Прочитать(), ТестовыеДанные); УдалитьФайлы(ВремФайл.ПолныйПуть); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомИзменить_PATCH() Экспорт ТестовыеДанные = "Hello from 1Script!"; Запрос = Новый HttpЗапрос("/patch"); Запрос.УстановитьТелоИзСтроки(ТестовыеДанные); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Изменить(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), ТестовыеДанные); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомПолучитьЗаголовки_HEAD() Экспорт Запрос = Новый HttpЗапрос("/html"); // простая HTML-страница Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ПолучитьЗаголовки(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); // Не должны получить контент, т.к. это HEAD-запрос. // Сервис к сожалению возвращает метку BOM в начале ответа и получается, что строка не пустая, // проверяем поэтому вот таким топорным, но зато работающим способом. юТест.ПроверитьРавенство(0, СтрНайти(Ответ.ПолучитьТелоКакСтроку(), "<html>")); // А заголовки - должны получить как в случае получение методом GET. юТест.ПроверитьВхождение(Ответ.Заголовки.Получить("Content-Type"), "text/html"); КонецПроцедуры Процедура ТестДолжен_ПроверитьЗапросМетодомУдалить_DELETE() Экспорт Запрос = Новый HttpЗапрос("/delete?p=v"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Удалить(Запрос); ТелоОтвета = Ответ.ПолучитьТелоКакСтроку(); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(ТелоОтвета, """p"": ""v"""); КонецПроцедуры Процедура ТестДолжен_ПроверитьМетод_ВызватьHTTPМетод_СНесуществующимМетодомHTTP() Экспорт Запрос = Новый HttpЗапрос("/get"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ВызватьHTTPМетод("POST", Запрос); юТест.ПроверитьРавенство(405, Ответ.КодСостояния); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), "Method Not Allowed"); КонецПроцедуры Процедура ТестДолженПроверитьЧтоКонструкторЗапросаВозвращаетКорректноеИсключение() Экспорт Попытка Запрос = Новый HTTPЗапрос("/url", Неопределено); Исключение Описание = ИнформацияОбОшибке().Описание; юТест.ПроверитьРавенство("Неверный тип аргумента", Описание); Возврат; КонецПопытки; ВызватьИсключение "Не было выдано исключение!"; КонецПроцедуры Процедура ТестДолженПроверитьЧтоЗапросСоздаетсяСПустымТелом() Экспорт Запрос = Новый HTTPЗапрос; юТест.ПроверитьТип(Запрос.ПолучитьИмяФайлаТела(), Тип("Неопределено")); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакДвоичныеДанные(), Тип("Неопределено")); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакСтроку(), Тип("Неопределено")); КонецПроцедуры Процедура ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзДвоичныхДанныхИПолучитьКакСтроку() Экспорт Запрос = Новый HTTPЗапрос; Запрос.УстановитьТелоИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки("Привет, Мир!", КодировкаТекста.UTF8, Ложь)); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакСтроку(), Тип("Строка")); юТест.ПроверитьРавенство(Запрос.ПолучитьТелоКакСтроку(), "Привет, Мир!"); КонецПроцедуры Процедура ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьКакСтрокуИПолучитьКакДвоичныеДанные() Экспорт Запрос = Новый HTTPЗапрос; Запрос.УстановитьТелоИзСтроки( "Привет, Мир!", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакДвоичныеДанные(), Тип("ДвоичныеДанные")); юТест.ПроверитьРавенство( Запрос.ПолучитьТелоКакДвоичныеДанные(), ПолучитьДвоичныеДанныеИзСтроки("Привет, Мир!", КодировкаТекста.UTF8, Ложь)); КонецПроцедуры Процедура ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзДвоичныхДанныхПослеЕгоУстановкиИзСтроки() Экспорт Строка = "О дивный новый мир!"; ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки(Строка, КодировкаТекста.UTF8, Ложь); Запрос = Новый HTTPЗапрос; Запрос.УстановитьТелоИзСтроки( "Привет, Мир!", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакСтроку(), Тип("Строка")); юТест.ПроверитьРавенство(Запрос.ПолучитьТелоКакСтроку(), Строка); КонецПроцедуры Процедура ТестДолженПроверитьЧтоТелоЗапросаМожноУстановитьИзСтрокиПослеЕгоУстановкиИзДвоичныхДанных() Экспорт ДвоичныеДанные = ПолучитьДвоичныеДанныеИзСтроки("О дивный новый мир!", КодировкаТекста.UTF8, Ложь); Запрос = Новый HTTPЗапрос; Запрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанные); Запрос.УстановитьТелоИзСтроки( "Привет, Мир!", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакДвоичныеДанные(), Тип("ДвоичныеДанные")); юТест.ПроверитьРавенство( Запрос.ПолучитьТелоКакДвоичныеДанные(), ПолучитьДвоичныеДанныеИзСтроки("Привет, Мир!", КодировкаТекста.UTF8, Ложь)); КонецПроцедуры Процедура ТестДолженПроверитьЧтоМожноЗадатьТелоЗапросаСПомощьюПотока() Экспорт Запрос = Новый HTTPЗапрос; Поток = Запрос.ПолучитьТелоКакПоток(); ЗаписьДанных = Новый ЗаписьДанных(Поток); ЗаписьДанных.ЗаписатьСтроку("Привет, Мир!", КодировкаТекста.UTF8, ""); ЗаписьДанных.Закрыть(); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакСтроку(), Тип("Строка")); юТест.ПроверитьРавенство(Запрос.ПолучитьТелоКакСтроку(), "Привет, Мир!"); КонецПроцедуры Процедура ТестДолженПроверитьЧтоПриПолученииТелоКакПотокаПроисходитИнициализацияТела() Экспорт Запрос = Новый HTTPЗапрос; юТест.ПроверитьТип(Запрос.ПолучитьТелоКакДвоичныеДанные(), Тип("Неопределено")); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакПоток(), Тип("Поток")); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакДвоичныеДанные(), Тип("ДвоичныеДанные")); КонецПроцедуры Процедура ТестДолженПроверитьЧтоСПомощьюПотокаВТелоМожноДописатьДанные() Экспорт Запрос = Новый HTTPЗапрос; Запрос.УстановитьТелоИзСтроки("Привет, ", КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать); Поток = Запрос.ПолучитьТелоКакПоток(); Поток.Перейти(Поток.Размер(), ПозицияВПотоке.Начало); ЗаписьДанных = Новый ЗаписьДанных(Поток); ЗаписьДанных.ЗаписатьСтроку("Мир!", КодировкаТекста.UTF8, ""); ЗаписьДанных.Закрыть(); юТест.ПроверитьРавенство(Поток.Размер(), 21); юТест.ПроверитьРавенство(Поток.ТекущаяПозиция(), 21); юТест.ПроверитьТип(Запрос.ПолучитьТелоКакСтроку(), Тип("Строка")); юТест.ПроверитьРавенство(Запрос.ПолучитьТелоКакСтроку(), "Привет, Мир!"); КонецПроцедуры Процедура ТестДолженПроверитьЧтоМетодыБезТелаПриУстановленномТелеУспешноВыполняются() Экспорт Запрос = Новый HttpЗапрос("/get"); Запрос.УстановитьТелоИзСтроки("привет"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); Ответ = Соединение.ВызватьHTTPМетод("HEAD", Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); КонецПроцедуры Процедура ТестДолженПроверитьЧтоРаботаетПолучениеДвоичныхДанныхИзОтвета() Экспорт Запрос = Новый HttpЗапрос("/bytes/10"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос); ДД = Ответ.ПолучитьТелоКакДвоичныеДанные(); юТест.ПроверитьТип(ДД, Тип("ДвоичныеДанные")); юТест.ПроверитьРавенство(ДД.Размер(), 10); КонецПроцедуры Процедура ТестДолженПроверитьЧтоТелоМожноПолучитьНесколькоРаз() Экспорт Запрос = Новый HttpЗапрос("/get?p1=v1&p2=v2"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); Ответ.ПолучитьТелоКакПоток(); юТест.ПроверитьРавенство(Ответ.ПолучитьТелоКакПоток().ДоступноЧтение, Истина); юТест.ПроверитьРавенство(ТипЗнч(Ответ.ПолучитьТелоКакДвоичныеДанные()), Тип("ДвоичныеДанные")); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), """p1"": ""v1"""); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), """p2"": ""v2"""); юТест.ПроверитьРавенство(ТипЗнч(Ответ.ПолучитьТелоКакДвоичныеДанные()), Тип("ДвоичныеДанные")); // Оригинальный поток уже вычитан вернется поддельный юТест.ПроверитьРавенство(Ответ.ПолучитьТелоКакПоток().ДоступноЧтение, Истина); КонецПроцедуры Процедура ТестДолженПроверитьПолучениеТелаПослеЗакрытогоПотока() Экспорт Запрос = Новый HttpЗапрос("/get?p1=v1&p2=v2"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); Поток = Ответ.ПолучитьТелоКакПоток(); Поток.Закрыть(); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), """p2"": ""v2"""); КонецПроцедуры Процедура ТестДолженПроверитьНедоступностьЧистогоПотокаПослеПолученияТела() Экспорт Запрос = Новый HttpЗапрос("/get?p1=v1&p2=v2"); Соединение = Новый HttpСоединение(мАдресРесурса); Ответ = Соединение.Получить(Запрос); юТест.ПроверитьРавенство(200, Ответ.КодСостояния); юТест.ПроверитьВхождение(Ответ.ПолучитьТелоКакСтроку(), """p2"": ""v2"""); // чистый поток не доступен для чтения Поток = Ответ.ПолучитьТелоКакПоток(Истина); юТест.ПроверитьРавенство(Поток.ДоступноЧтение, Ложь); // оберточный нормальный Поток = Ответ.ПолучитьТелоКакПоток(); юТест.ПроверитьРавенство(Поток.ДоступноЧтение, Истина); ЧтениеДанных = Новый ЧтениеДанных(Поток); юТест.ПроверитьВхождение( ПолучитьСтрокуИзДвоичныхДанных(ЧтениеДанных.Прочитать().ПолучитьДвоичныеДанные()), """p2"": ""v2""" ); КонецПроцедуры Процедура ТестДолженПроверитьПолучениеStreamEvent() Экспорт МенеджерФоновыхЗаданий = Новый МенеджерФоновыхЗаданий; ЗаданиеВебсервера = МенеджерФоновыхЗаданий.Выполнить(ЭтотОбъект, "Вебсервер"); ПортТестовогоСервера = 8181; Соединение = Новый HTTPСоединение("http://127.0.0.1:" + ПортТестовогоСервера); Запрос = Новый HTTPЗапрос("/"); // Подождем пока поднимится сервер Приостановить(1000); Старт = ТекущаяУниверсальнаяДатаВМиллисекундах(); Ответ = Соединение.ВызватьHTTPМетод("GET", Запрос); Прошло = ТекущаяУниверсальнаяДатаВМиллисекундах() - Старт; ютест.ПроверитьМеньше(Прошло, 600); ТелоПоток = Ответ.ПолучитьТелоКакПоток(Истина); юТест.ПроверитьТип(ТелоПоток, Тип("Поток")); ЧтениеДанных = Новый ЧтениеДанных(ТелоПоток); Таймаут = 600; Пока Истина Цикл ПрочтенныеДанные = ЧтениеДанных.Прочитать(20); Строка = ПолучитьСтрокуИзДвоичныхДанных(ПрочтенныеДанные.ПолучитьДвоичныеДанные()); Прошло = ТекущаяУниверсальнаяДатаВМиллисекундах() - Старт; ютест.ПроверитьМеньше(Прошло, Таймаут); Таймаут = Таймаут + Таймаут; Если Строка = "" ИЛИ Строка = "data: [DONE]" + Символы.ПС + Символы.ПС Тогда Прервать; КонецЕсли; юТест.ПроверитьРавенство(Строка, "data: [1]" + Символы.ПС + Символы.ПС); КонецЦикла; ТелоПоток.Закрыть(); МенеджерФоновыхЗаданий.Очистить(); КонецПроцедуры Функция ОбработчикЗапроса(Контекст, СледующийОбработчик) Экспорт Контекст.Ответ.КодСостояния = 200; Контекст.Ответ.ТипКонтента = "text/event-stream"; ПотокОтвета = ПолучитьДвоичныеДанныеИзСтроки("data: [1]" + Символы.ПС + Символы.ПС).ОткрытьПотокДляЧтения(); ПотокОтвета.КопироватьВ(Контекст.Ответ.Тело); Приостановить(500); ПотокОтвета = ПолучитьДвоичныеДанныеИзСтроки("data: [1]" + Символы.ПС + Символы.ПС).ОткрытьПотокДляЧтения(); ПотокОтвета.КопироватьВ(Контекст.Ответ.Тело); Приостановить(500); ПотокОтвета = ПолучитьДвоичныеДанныеИзСтроки("data: [DONE]" + Символы.ПС + Символы.ПС).ОткрытьПотокДляЧтения(); ПотокОтвета.КопироватьВ(Контекст.Ответ.Тело); КонецФункции Процедура Вебсервер() Экспорт Вебсервер = Новый ВебСервер(ПортТестовогоСервера); Вебсервер.ДобавитьОбработчикЗапросов(ЭтотОбъект, "ОбработчикЗапроса"); Вебсервер.Запустить(); КонецПроцедуры Функция JsonВОбъект(Json) ЧтениеJSON = Новый ЧтениеJSON; ЧтениеJSON.УстановитьСтроку(Json); Объект = ПрочитатьJSON(ЧтениеJSON, Истина); ЧтениеJSON.Закрыть(); Возврат Объект; КонецФункции Функция ПроверитьДоступность(АдресХоста) Попытка // Короткие таймауты для быстрой проверки доступности Соединение = Новый HttpСоединение(АдресХоста,,,,,5); Запрос = Новый HttpЗапрос("/get"); Ответ = Соединение.Получить(Запрос); Возврат Ответ.КодСостояния = 200; Исключение Сообщить("HTTP тесты: недоступен хост " + АдресХоста + " (" + ОписаниеОшибки() + ")"); Возврат Ложь; КонецПопытки; КонецФункции Функция ВыбратьДоступныйХост() Экспорт // Если задана переменная окружения, используем ее при наличии значения ЗначениеИзОкружения = ПолучитьПеременнуюСреды("OS_HTTP_TEST_HOST"); Если ЗначениеЗаполнено(ЗначениеИзОкружения) Тогда Если ПроверитьДоступность(ЗначениеИзОкружения) Тогда Сообщить("HTTP тесты: выбран хост из переменной окружения OS_HTTP_TEST_HOST = " + ЗначениеИзОкружения); Возврат ЗначениеИзОкружения; Иначе Сообщить("HTTP тесты: хост из переменной окружения недоступен: " + ЗначениеИзОкружения); КонецЕсли; КонецЕсли; // Пробуем типовые варианты httpbin Кандидаты = Новый Массив; Кандидаты.Добавить("http://127.0.0.1:8085"); Кандидаты.Добавить("https://connectorhttp.ru"); Кандидаты.Добавить("https://httpbin.org"); Кандидаты.Добавить("https://httpbingo.org"); Для Каждого Хост Из Кандидаты Цикл Если ПроверитьДоступность(Хост) Тогда Сообщить("HTTP тесты: автоматически выбран доступный хост " + Хост); Возврат Хост; КонецЕсли; КонецЦикла; // По умолчанию сохраняем прежнее поведение Сообщить("HTTP тесты: не удалось определить доступный хост, используется значение по умолчанию https://httpbin.org"); Возврат "https://httpbin.org"; КонецФункции