Skip to content
Navigation Menu
{{ message }}
forked from EvilBeaver/OneScript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp.os
More file actions
596 lines (387 loc) · 34.4 KB
/
Copy pathhttp.os
File metadata and controls
596 lines (387 loc) · 34.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
Перем юТест;
Перем мАдресРесурса; // 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";
КонецФункции
You can’t perform that action at this time.
