upgrade webhooks to support both form and json request.
This commit is contained in:
parent
5d57ae25ab
commit
39e594c394
5 changed files with 82 additions and 22 deletions
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
|
|
@ -17,6 +17,7 @@
|
||||||
"dotenv",
|
"dotenv",
|
||||||
"finaldir",
|
"finaldir",
|
||||||
"getpid",
|
"getpid",
|
||||||
|
"httpx",
|
||||||
"libcurl",
|
"libcurl",
|
||||||
"libx",
|
"libx",
|
||||||
"mpegts",
|
"mpegts",
|
||||||
|
|
|
||||||
1
Pipfile
1
Pipfile
|
|
@ -13,6 +13,7 @@ aiocron = ">=1.8"
|
||||||
python-dotenv = ">=1.0.1"
|
python-dotenv = ">=1.0.1"
|
||||||
python-magic = ">=0.4.27"
|
python-magic = ">=0.4.27"
|
||||||
debugpy = ">=1.8.1"
|
debugpy = ">=1.8.1"
|
||||||
|
httpx = "*"
|
||||||
|
|
||||||
[dev-packages]
|
[dev-packages]
|
||||||
|
|
||||||
|
|
|
||||||
47
Pipfile.lock
generated
47
Pipfile.lock
generated
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "6f7d266189a02316b0a7f6d1958351963de5dfa35b6e3860c1da5da875629843"
|
"sha256": "b8c580658ddc19c696fab69a5317e66edf477f5560957ab549357b25b1b70212"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
|
@ -115,6 +115,14 @@
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==1.3.1"
|
"version": "==1.3.1"
|
||||||
},
|
},
|
||||||
|
"anyio": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8",
|
||||||
|
"sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.8'",
|
||||||
|
"version": "==4.3.0"
|
||||||
|
},
|
||||||
"argparse": {
|
"argparse": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4",
|
"sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4",
|
||||||
|
|
@ -349,11 +357,11 @@
|
||||||
},
|
},
|
||||||
"croniter": {
|
"croniter": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:78bf110a2c7dbbfdd98b926318ae6c64a731a4c637c7befe3685755110834746",
|
"sha256:28763ad39c404e159140874f08010cfd8a18f4c2a7cea1ce73e9506a4380cfc1",
|
||||||
"sha256:8bff16c9af4ef1fb6f05416973b8f7cb54997c02f2f8365251f9bf1dded91866"
|
"sha256:84dc95b2eb6760144cc01eca65a6b9cc1619c93b2dc37d8a27f4319b3eb740de"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
"version": "==2.0.2"
|
"version": "==2.0.3"
|
||||||
},
|
},
|
||||||
"debugpy": {
|
"debugpy": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
|
@ -475,6 +483,23 @@
|
||||||
"markers": "python_version >= '3.7'",
|
"markers": "python_version >= '3.7'",
|
||||||
"version": "==0.14.0"
|
"version": "==0.14.0"
|
||||||
},
|
},
|
||||||
|
"httpcore": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61",
|
||||||
|
"sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.8'",
|
||||||
|
"version": "==1.0.5"
|
||||||
|
},
|
||||||
|
"httpx": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5",
|
||||||
|
"sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"
|
||||||
|
],
|
||||||
|
"index": "pypi",
|
||||||
|
"markers": "python_version >= '3.8'",
|
||||||
|
"version": "==0.27.0"
|
||||||
|
},
|
||||||
"humanfriendly": {
|
"humanfriendly": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477",
|
"sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477",
|
||||||
|
|
@ -669,12 +694,12 @@
|
||||||
},
|
},
|
||||||
"python-socketio": {
|
"python-socketio": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:bbcbd758ed8c183775cb2853ba001361e2fa018babf5cbe11a5b77e91c2ec2a2",
|
"sha256:ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37",
|
||||||
"sha256:f1a0228b8b1fbdbd93fbbedd821ebce0ef54b2b5bf6e98fcf710deaa7c574259"
|
"sha256:b9f22a8ff762d7a6e123d16a43ddb1a27d50f07c3c88ea999334f2f89b0ad52b"
|
||||||
],
|
],
|
||||||
"index": "pypi",
|
"index": "pypi",
|
||||||
"markers": "python_version >= '3.8'",
|
"markers": "python_version >= '3.8'",
|
||||||
"version": "==5.11.1"
|
"version": "==5.11.2"
|
||||||
},
|
},
|
||||||
"pytz": {
|
"pytz": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
|
|
@ -707,6 +732,14 @@
|
||||||
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
|
||||||
"version": "==1.16.0"
|
"version": "==1.16.0"
|
||||||
},
|
},
|
||||||
|
"sniffio": {
|
||||||
|
"hashes": [
|
||||||
|
"sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2",
|
||||||
|
"sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"
|
||||||
|
],
|
||||||
|
"markers": "python_version >= '3.7'",
|
||||||
|
"version": "==1.3.1"
|
||||||
|
},
|
||||||
"tzlocal": {
|
"tzlocal": {
|
||||||
"hashes": [
|
"hashes": [
|
||||||
"sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8",
|
"sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8",
|
||||||
|
|
|
||||||
|
|
@ -259,6 +259,8 @@ The `config/webhooks.json`, is a json file, which can be used to add webhook end
|
||||||
"request":{
|
"request":{
|
||||||
// (url: string) - REQUIRED- The webhook url
|
// (url: string) - REQUIRED- The webhook url
|
||||||
"url": "https://mysecert.webhook.com/endpoint",
|
"url": "https://mysecert.webhook.com/endpoint",
|
||||||
|
// (type: string) - OPTIONAL - The request type, it can be json or form.
|
||||||
|
"type": "json",
|
||||||
// (method: string) - OPTIONAL - The request method, it can be POST or PUT
|
// (method: string) - OPTIONAL - The request method, it can be POST or PUT
|
||||||
"method": "POST",
|
"method": "POST",
|
||||||
// (headers: dictionary) - OPTIONAL - Extra headers to include.
|
// (headers: dictionary) - OPTIONAL - Extra headers to include.
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ import json
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
from ItemDTO import ItemDTO
|
from ItemDTO import ItemDTO
|
||||||
from aiohttp import client
|
import httpx
|
||||||
|
from version import APP_VERSION
|
||||||
LOG = logging.getLogger('Webhooks')
|
LOG = logging.getLogger('Webhooks')
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -49,20 +49,43 @@ class Webhooks:
|
||||||
req: dict = target.get('request')
|
req: dict = target.get('request')
|
||||||
try:
|
try:
|
||||||
LOG.info(f"Sending {event=} {item.id=} to [{target.get('name')}]")
|
LOG.info(f"Sending {event=} {item.id=} to [{target.get('name')}]")
|
||||||
async with client.ClientSession() as session:
|
async with httpx.AsyncClient() as client:
|
||||||
headers = req.get('headers', {}) if 'headers' in req else {}
|
request_type = req.get('type', 'json')
|
||||||
async with session.request(method=req.get('method', 'POST'), url=req.get('url'), json=item.__dict__, headers=headers) as response:
|
|
||||||
respData = {
|
|
||||||
'url': req.get('url'),
|
|
||||||
'status': response.status,
|
|
||||||
'text': await response.text()
|
|
||||||
}
|
|
||||||
msg = f"[{target.get('name')}] Response to [{event=} {item.id=}] [status: {response.status}]."
|
|
||||||
if respData.get('text'):
|
|
||||||
msg += f" [Body: {respData.get('text','??')}]"
|
|
||||||
LOG.info(msg)
|
|
||||||
|
|
||||||
return respData
|
reqBody = {
|
||||||
|
'method': req.get('method', 'POST'),
|
||||||
|
'url': req.get('url'),
|
||||||
|
'headers': {
|
||||||
|
'User-Agent': f"YTPTube/{APP_VERSION}"
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.get('headers', None):
|
||||||
|
reqBody['headers'].update(req.get('headers'))
|
||||||
|
|
||||||
|
match(request_type):
|
||||||
|
case 'json':
|
||||||
|
reqBody['json'] = item.__dict__
|
||||||
|
reqBody['headers']['Content-Type'] = 'application/json'
|
||||||
|
case _:
|
||||||
|
reqBody['data'] = item.__dict__
|
||||||
|
reqBody['headers']['Content-Type'] = 'application/x-www-form-urlencoded'
|
||||||
|
|
||||||
|
response = await client.request(**reqBody)
|
||||||
|
|
||||||
|
respData = {
|
||||||
|
'url': req.get('url'),
|
||||||
|
'status': response.status_code,
|
||||||
|
'text': response.text
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = f"[{target.get('name')}] Response to [{event=} {item.id=}] [status: {response.status_code}]."
|
||||||
|
if respData.get('text'):
|
||||||
|
msg += f" [Body: {respData.get('text','??')}]"
|
||||||
|
|
||||||
|
LOG.info(msg)
|
||||||
|
|
||||||
|
return respData
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {
|
return {
|
||||||
'url': req.get('url'),
|
'url': req.get('url'),
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue