Skip to content

Commit

Permalink
Добавить параметр для отключения SSL в конструкторе (#233)
Browse files Browse the repository at this point in the history
Fixes #232
  • Loading branch information
leshchenko1979 authored Mar 29, 2024
1 parent 2404226 commit fff1c4b
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 23 deletions.
1 change: 1 addition & 0 deletions API.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
20 changes: 2 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 и получаю ошибки. Что делать?
Expand Down
6 changes: 5 additions & 1 deletion fast_bitrix24/bitrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def __init__(
request_pool_size: int = 50,
requests_per_second: float = 2.0,
client: aiohttp.ClientSession = None,
ssl: bool = True,
):
"""
Создает объект для запросов к Битрикс24.
Expand All @@ -47,16 +48,19 @@ def __init__(
можно отправить на сервер без ожидания
- `requests_per_second: float = 2.0` - максимальная скорость запросов,
которая будет использоваться после переполнения пула
- `ssl: bool = True` - использовать ли проверку SSL-сертификата
при HTTP-соединениях с сервером Битрикс.
- `client: aiohttp.ClientSession = None` - использовать для HTTP-вызовов
объект aiohttp.ClientSession, инициализированнный и настроенный
пользователем.
пользователем. Ожидаеется, что пользователь сам откроет и закроет сессию.
"""

self.srh = ServerRequestHandler(
webhook=webhook,
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
Expand Down
12 changes: 9 additions & 3 deletions fast_bitrix24/srh.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def __init__(
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
Expand All @@ -68,6 +69,7 @@ def __init__(
# то будем использовать его клиента
self.client_provided_by_user = bool(client)
self.session = client
self.ssl = ssl

# лимит количества одновременных запросов,
# установленный конструктором или пользователем
Expand Down Expand Up @@ -119,16 +121,20 @@ async def run_async(self, coroutine):
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):
self.session = aiohttp.ClientSession(raise_for_status=True)
self.active_runs += 1

try:
yield True
yield

finally:
self.active_runs -= 1
Expand Down Expand Up @@ -157,7 +163,7 @@ async def request_attempt(self, method, params=None) -> dict:
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")

Expand Down
2 changes: 1 addition & 1 deletion tests/test_srh.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down

0 comments on commit fff1c4b

Please sign in to comment.