Repository: leshchenko1979/fast_bitrix24 (python)

Issue:
Добавить параметр для отключения SSL в конструкторе

Pull request:
Добавить параметр для отключения SSL в конструкторе
Fixes #232

Patch:
diff --git a/API.md b/API.md
index 6060366..d7ab460 100644
--- a/API.md
+++ b/API.md
@@ -15,6 +15,7 @@
 можно отправить на сервер без ожидания
 - `requests_per_second: float = 2.0` - максимальная скорость запросов,
 которая будет использоваться после переполнения пула
+- `ssl: bool = True` - использовать ли проверку SSL-сертификата при HTTP-соединениях с сервером Битрикс.
 - `client: aiohttp.ClientSession = None` - использовать для HTTP-вызовов клиента, инициализированного и настроенного пользователем.
 
 Параметры `request_pool_size` и `requests_per_second` установлены согласно ограничениям Битрикс24.
diff --git a/README.md b/README.md
index 8896f5c..c766d18 100644
--- a/README.md
+++ b/README.md
@@ -253,25 +253,9 @@ deals.sort(key = lambda d: int(d['ID']))
 Нарушение политики Битриска по скорости запросов влечет за собой штрафы, поэтому мы рекомендуем соблюдать её (параметр `respect_velocity_policy=True`).
 
 ### Я получаю ошибку сертификата SSL. Что делать?
-Если вы получаете `SSLCertVerificationError` / `CERTIFICATE_VERIFY_FAILED`, попробуйте отключить верификацию сертификата SSL. При инициализации передайте в `BitrixAsync` параметр `client`,  где будет инициализированный вами экземпляр `aiohttp.ClientSession`, у которого будет отключена верификация SSL:
+Если вы получаете `SSLCertVerificationError` / `CERTIFICATE_VERIFY_FAILED`, попробуйте отключить верификацию сертификата SSL:
 ```python
-import aiohttp
-import asyncio
-
-from fast_bitrix24 import BitrixAsync
-
-
-async def main():
-    # Инициализировать HTTP-клиента без верификации SSL и передать его в `BitrixAsync`
-    connector = aiohttp.TCPConnector(ssl=False)
-    async with aiohttp.ClientSession(connector=connector) as client:
-        b = BitrixAsync(webhook, client=client)
-
-        # Далее ваши вызовы Битрикса
-        ...
-
-
-asyncio.run(main())
+b = BitrixAsync(webhook, ssl=False)
 ```
 
 ## Я использую вашу библиотеку из ноутбуков или из Spyder и получаю ошибки. Что делать?
diff --git a/fast_bitrix24/bitrix.py b/fast_bitrix24/bitrix.py
index 207d0b1..3514113 100644
--- a/fast_bitrix24/bitrix.py
+++ b/fast_bitrix24/bitrix.py
@@ -33,6 +33,7 @@ class BitrixAsync:
         request_pool_size: int = 50,
         requests_per_second: float = 2.0,
         client: aiohttp.ClientSession = None,
+        ssl: bool = True,
     ):
         """
         Создает объект для запросов к Битрикс24.
@@ -47,9 +48,11 @@ class BitrixAsync:
         можно отправить на сервер без ожидания
         - `requests_per_second: float = 2.0` - максимальная скорость запросов,
         которая будет использоваться после переполнения пула
+        - `ssl: bool = True` - использовать ли проверку SSL-сертификата
+        при HTTP-соединениях с сервером Битрикс.
         - `client: aiohttp.ClientSession = None` - использовать для HTTP-вызовов
         объект aiohttp.ClientSession, инициализированнный и настроенный
-        пользователем.
+        пользователем. Ожидаеется, что пользователь сам откроет и закроет сессию.
         """
 
         self.srh = ServerRequestHandler(
@@ -57,6 +60,7 @@ class BitrixAsync:
             respect_velocity_policy=respect_velocity_policy,
             request_pool_size=request_pool_size,
             requests_per_second=requests_per_second,
+            ssl=ssl,
             client=client,
         )
         self.verbose = verbose
diff --git a/fast_bitrix24/srh.py b/fast_bitrix24/srh.py
index ff3270c..ed901e7 100644
--- a/fast_bitrix24/srh.py
+++ b/fast_bitrix24/srh.py
@@ -58,6 +58,7 @@ class ServerRequestHandler:
         request_pool_size: int,
         requests_per_second: float,
         client,
+        ssl: bool = True,
     ):
         self.webhook = self.standardize_webhook(webhook)
         self.respect_velocity_policy = respect_velocity_policy
@@ -68,6 +69,7 @@ class ServerRequestHandler:
         # то будем использовать его клиента
         self.client_provided_by_user = bool(client)
         self.session = client
+        self.ssl = ssl
 
         # лимит количества одновременных запросов,
         # установленный конструктором или пользователем
@@ -119,8 +121,12 @@ class ServerRequestHandler:
     async def handle_sessions(self):
         """Открывает и закрывает сессию в зависимости от наличия
         активных запросов."""
+
+        # если клиент был задан пользователем, то ожидаем,
+        # что пользователь сам откроет и закроет сессию
+
         if self.client_provided_by_user:
-            yield True
+            yield
             return
 
         if not self.active_runs and (not self.session or self.session.closed):
@@ -128,7 +134,7 @@ class ServerRequestHandler:
         self.active_runs += 1
 
         try:
-            yield True
+            yield
 
         finally:
             self.active_runs -= 1
@@ -157,7 +163,7 @@ class ServerRequestHandler:
                 logger.debug(f"Requesting {{'method': {method}, 'params': {params}}}")
 
                 async with self.session.post(
-                    url=self.webhook + method, json=params
+                    url=self.webhook + method, json=params, ssl=self.ssl
                 ) as response:
                     json = await response.json(encoding="utf-8")
 


Test patch:
diff --git a/tests/test_srh.py b/tests/test_srh.py
index 5a7b03a..d0b827d 100644
--- a/tests/test_srh.py
+++ b/tests/test_srh.py
@@ -12,7 +12,7 @@ async def test_request_attempt():
     mock_response.json.return_value = {'time': {'operating': 1000}}
 
     @contextlib.asynccontextmanager
-    async def mock_post(url, json):
+    async def mock_post(url, json, ssl):
         yield mock_response
 
     mock_session = AsyncMock()