-
Notifications
You must be signed in to change notification settings - Fork 108
/
Copy pathhttp.os
388 lines (244 loc) · 22.8 KB
/
http.os
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
Перем юТест;
Перем мАдресРесурса; // URL ресурса (хоста) httpbin.org для тестирования запросов
Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
юТест = ЮнитТестирование;
ВсеТесты = Новый Массив;
// Отключено временно: см https://github.com/EvilBeaver/OneScript/pull/1018
//ВсеТесты.Добавить("ТестДолжен_ПроверитьОтключениеПеренаправления");
//ВсеТесты.Добавить("ТестДолжен_ПроверитьАвтоматическоеПеренаправление");
ВсеТесты.Добавить("ТестДолжен_ПроверитьАвтоматическуюРаспаковкуGZip");
ВсеТесты.Добавить("ТестДолжен_ПроверитьАвторизациюПрокси");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойствоПортHttpСоединения");
ВсеТесты.Добавить("ТестДолжен_ПроверитьСвойстваПользовательПарольHttpСоединения");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомПолучить_GET");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомЗаписать_PUT");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомОтправитьДляОбработки_POST");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомИзменить_PATCH");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомУдалить_DELETE");
ВсеТесты.Добавить("ТестДолжен_ПроверитьЗапросМетодомПолучитьЗаголовки_HEAD");
ВсеТесты.Добавить("ТестДолжен_ПроверитьМетод_ВызватьHTTPМетод_СНесуществующимМетодом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, Ответ.КодСостояния);
КонецПроцедуры
Функция JsonВОбъект(Json)
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(Json);
Объект = ПрочитатьJSON(ЧтениеJSON, Истина);
ЧтениеJSON.Закрыть();
Возврат Объект;
КонецФункции
///////////////////////////////////////////////////////////////////
/// ИНИЦИАЛИЗАЦИЯ
///////////////////////////////////////////////////////////////////
мАдресРесурса = "httpbin.org";