-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathОбработчикСоединений.os
86 lines (64 loc) · 3.82 KB
/
ОбработчикСоединений.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
&Пластилин Перем Настройки;
&Пластилин Перем МенеджерВходящихСоединений;
Перем ТаймаутЧтения;
&ЛогВебСервера
Перем Лог;
&Желудь
Процедура ПриСозданииОбъекта()
ТаймаутЧтения = 10;
КонецПроцедуры
Процедура Обработать(Соединение) Экспорт
Попытка
ДанныеЗапроса = ПрочитатьДвоичныеДанныеИзСоединения(Соединение);
Исключение
ЗакрытьСоединениеВПопытке(Соединение);
ТекстОшибки = ОписаниеОшибки();
Лог.Ошибка("Не удалось обработать входящее соединение: " + ТекстОшибки);
Возврат;
КонецПопытки;
Результат = МенеджерВходящихСоединений.ПринятьСоединение(Соединение, ДанныеЗапроса);
ОтправитьВПопытке(Соединение, Результат.Ответ);
Если Результат.ЗакрыватьСоединение Тогда
ЗакрытьСоединениеВПопытке(Соединение);
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьДвоичныеДанныеИзСоединения(Соединение)
Если Настройки.ЗадержкаПередЧтениемСокета > 0 Тогда
Приостановить(Настройки.ЗадержкаПередЧтениемСокета);
КонецЕсли;
ДанныеЗапроса = ВычитатьВПопыткеДвоичныеДанные(Соединение);
Возврат ДанныеЗапроса;
КонецФункции
Функция ВычитатьВПопыткеДвоичныеДанные(Соединение)
Данные = Новый Массив();
Попытка
Пока Истина Цикл
Соединение.ТаймаутЧтения = ТаймаутЧтения;
ДанныеСоединения = Соединение.ПрочитатьДвоичныеДанные(Настройки.РазмерБуфера);
Данные.Добавить(ДанныеСоединения);
КонецЦикла;
Исключение
КонецПопытки;
Возврат СоединитьДвоичныеДанные(Данные);
КонецФункции
Процедура ОтправитьВПопытке(Соединение, ДвоичныеДанныеОтвета) Экспорт
Попытка
Соединение.ОтправитьДвоичныеДанные(ДвоичныеДанныеОтвета);
Исключение
ТекстОшибки = ОписаниеОшибки();
Лог.Ошибка("Не удалось отправить ответ: " + ТекстОшибки);
КонецПопытки;
КонецПроцедуры
Процедура ЗакрытьСоединениеВПопытке(Соединение) Экспорт
Попытка
// Некоторые клиенты ломаются, когда после отправки
// в сокет данных сразу закрываемся. Ждем.
Если Настройки.ЗадержкаПередЗакрытиемСокета > 0 Тогда
Приостановить(Настройки.ЗадержкаПередЗакрытиемСокета);
КонецЕсли;
Соединение.Закрыть();
Исключение
ТекстОшибки = ОписаниеОшибки();
Лог.Ошибка("Не удалось закрыть входящее соединение: " + ТекстОшибки);
КонецПопытки;
КонецПроцедуры