mirror of
https://github.com/caronc/apprise.git
synced 2024-12-29 10:09:10 +01:00
negative/minus (-) parameter sets GET Parms on xml, json, and form URLs
This commit is contained in:
parent
41b4ddb942
commit
cb7f51d82a
@ -123,9 +123,13 @@ class NotifyForm(NotifyBase):
|
||||
'name': _('Payload Extras'),
|
||||
'prefix': ':',
|
||||
},
|
||||
'params': {
|
||||
'name': _('GET Params'),
|
||||
'prefix': '-',
|
||||
},
|
||||
}
|
||||
|
||||
def __init__(self, headers=None, method=None, payload=None, **kwargs):
|
||||
def __init__(self, headers=None, method=None, payload=None, params=None, **kwargs):
|
||||
"""
|
||||
Initialize Form Object
|
||||
|
||||
@ -147,6 +151,11 @@ class NotifyForm(NotifyBase):
|
||||
self.logger.warning(msg)
|
||||
raise TypeError(msg)
|
||||
|
||||
self.params = {}
|
||||
if params:
|
||||
# Store our extra headers
|
||||
self.params.update(params)
|
||||
|
||||
self.headers = {}
|
||||
if headers:
|
||||
# Store our extra headers
|
||||
@ -175,6 +184,9 @@ class NotifyForm(NotifyBase):
|
||||
# Append our headers into our parameters
|
||||
params.update({'+{}'.format(k): v for k, v in self.headers.items()})
|
||||
|
||||
# Append our GET params into our parameters
|
||||
params.update({'-{}'.format(k): v for k, v in self.params.items()})
|
||||
|
||||
# Append our payload extra's into our parameters
|
||||
params.update(
|
||||
{':{}'.format(k): v for k, v in self.payload_extras.items()})
|
||||
@ -212,6 +224,7 @@ class NotifyForm(NotifyBase):
|
||||
Perform Form Notification
|
||||
"""
|
||||
|
||||
# Prepare HTTP Headers
|
||||
headers = {
|
||||
'User-Agent': self.app_id,
|
||||
}
|
||||
@ -289,6 +302,7 @@ class NotifyForm(NotifyBase):
|
||||
|
||||
if self.method == 'GET':
|
||||
method = requests.get
|
||||
payload.update(self.params)
|
||||
|
||||
elif self.method == 'PUT':
|
||||
method = requests.put
|
||||
@ -307,7 +321,7 @@ class NotifyForm(NotifyBase):
|
||||
url,
|
||||
files=None if not files else files,
|
||||
data=payload if self.method != 'GET' else None,
|
||||
params=payload if self.method == 'GET' else None,
|
||||
params=payload if self.method == 'GET' else self.params,
|
||||
headers=headers,
|
||||
auth=auth,
|
||||
verify=self.verify_certificate,
|
||||
@ -377,6 +391,10 @@ class NotifyForm(NotifyBase):
|
||||
results['headers'] = {NotifyForm.unquote(x): NotifyForm.unquote(y)
|
||||
for x, y in results['qsd+'].items()}
|
||||
|
||||
# Add our GET paramters in the event the user wants to pass these along
|
||||
results['params'] = {NotifyForm.unquote(x): NotifyForm.unquote(y)
|
||||
for x, y in results['qsd-'].items()}
|
||||
|
||||
# Set method if not otherwise set
|
||||
if 'method' in results['qsd'] and len(results['qsd']['method']):
|
||||
results['method'] = NotifyForm.unquote(results['qsd']['method'])
|
||||
|
@ -125,9 +125,14 @@ class NotifyJSON(NotifyBase):
|
||||
'name': _('Payload Extras'),
|
||||
'prefix': ':',
|
||||
},
|
||||
'params': {
|
||||
'name': _('GET Params'),
|
||||
'prefix': '-',
|
||||
},
|
||||
}
|
||||
|
||||
def __init__(self, headers=None, method=None, payload=None, **kwargs):
|
||||
def __init__(self, headers=None, method=None, payload=None, params=None,
|
||||
**kwargs):
|
||||
"""
|
||||
Initialize JSON Object
|
||||
|
||||
@ -149,6 +154,11 @@ class NotifyJSON(NotifyBase):
|
||||
self.logger.warning(msg)
|
||||
raise TypeError(msg)
|
||||
|
||||
self.params = {}
|
||||
if params:
|
||||
# Store our extra headers
|
||||
self.params.update(params)
|
||||
|
||||
self.headers = {}
|
||||
if headers:
|
||||
# Store our extra headers
|
||||
@ -177,6 +187,9 @@ class NotifyJSON(NotifyBase):
|
||||
# Append our headers into our parameters
|
||||
params.update({'+{}'.format(k): v for k, v in self.headers.items()})
|
||||
|
||||
# Append our GET params into our parameters
|
||||
params.update({'-{}'.format(k): v for k, v in self.params.items()})
|
||||
|
||||
# Append our payload extra's into our parameters
|
||||
params.update(
|
||||
{':{}'.format(k): v for k, v in self.payload_extras.items()})
|
||||
@ -214,6 +227,7 @@ class NotifyJSON(NotifyBase):
|
||||
Perform JSON Notification
|
||||
"""
|
||||
|
||||
# Prepare HTTP Headers
|
||||
headers = {
|
||||
'User-Agent': self.app_id,
|
||||
'Content-Type': 'application/json'
|
||||
@ -307,6 +321,7 @@ class NotifyJSON(NotifyBase):
|
||||
r = method(
|
||||
url,
|
||||
data=dumps(payload),
|
||||
params=self.params,
|
||||
headers=headers,
|
||||
auth=auth,
|
||||
verify=self.verify_certificate,
|
||||
@ -364,6 +379,10 @@ class NotifyJSON(NotifyBase):
|
||||
results['headers'] = {NotifyJSON.unquote(x): NotifyJSON.unquote(y)
|
||||
for x, y in results['qsd+'].items()}
|
||||
|
||||
# Add our GET paramters in the event the user wants to pass these along
|
||||
results['params'] = {NotifyJSON.unquote(x): NotifyJSON.unquote(y)
|
||||
for x, y in results['qsd-'].items()}
|
||||
|
||||
# Set method if not otherwise set
|
||||
if 'method' in results['qsd'] and len(results['qsd']['method']):
|
||||
results['method'] = NotifyJSON.unquote(results['qsd']['method'])
|
||||
|
@ -130,9 +130,13 @@ class NotifyXML(NotifyBase):
|
||||
'name': _('Payload Extras'),
|
||||
'prefix': ':',
|
||||
},
|
||||
'params': {
|
||||
'name': _('GET Params'),
|
||||
'prefix': '-',
|
||||
},
|
||||
}
|
||||
|
||||
def __init__(self, headers=None, method=None, payload=None, **kwargs):
|
||||
def __init__(self, headers=None, method=None, payload=None, params=None, **kwargs):
|
||||
"""
|
||||
Initialize XML Object
|
||||
|
||||
@ -167,6 +171,11 @@ class NotifyXML(NotifyBase):
|
||||
self.logger.warning(msg)
|
||||
raise TypeError(msg)
|
||||
|
||||
self.params = {}
|
||||
if params:
|
||||
# Store our extra headers
|
||||
self.params.update(params)
|
||||
|
||||
self.headers = {}
|
||||
if headers:
|
||||
# Store our extra headers
|
||||
@ -203,6 +212,9 @@ class NotifyXML(NotifyBase):
|
||||
# Append our headers into our parameters
|
||||
params.update({'+{}'.format(k): v for k, v in self.headers.items()})
|
||||
|
||||
# Append our GET params into our parameters
|
||||
params.update({'-{}'.format(k): v for k, v in self.params.items()})
|
||||
|
||||
# Append our payload extra's into our parameters
|
||||
params.update(
|
||||
{':{}'.format(k): v for k, v in self.payload_extras.items()})
|
||||
@ -240,7 +252,7 @@ class NotifyXML(NotifyBase):
|
||||
Perform XML Notification
|
||||
"""
|
||||
|
||||
# prepare XML Object
|
||||
# Prepare HTTP Headers
|
||||
headers = {
|
||||
'User-Agent': self.app_id,
|
||||
'Content-Type': 'application/xml'
|
||||
@ -417,6 +429,10 @@ class NotifyXML(NotifyBase):
|
||||
results['headers'] = {NotifyXML.unquote(x): NotifyXML.unquote(y)
|
||||
for x, y in results['qsd+'].items()}
|
||||
|
||||
# Add our GET paramters in the event the user wants to pass these along
|
||||
results['params'] = {NotifyXML.unquote(x): NotifyXML.unquote(y)
|
||||
for x, y in results['qsd-'].items()}
|
||||
|
||||
# Set method if not otherwise set
|
||||
if 'method' in results['qsd'] and len(results['qsd']['method']):
|
||||
results['method'] = NotifyXML.unquote(results['qsd']['method'])
|
||||
|
@ -1,109 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Copyright (C) 2021 Chris Caron <lead2gold@gmail.com>
|
||||
# All rights reserved.
|
||||
#
|
||||
# This code is licensed under the MIT License.
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files(the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions :
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
|
||||
import os
|
||||
import sys
|
||||
from unittest import mock
|
||||
|
||||
import requests
|
||||
from apprise import plugins
|
||||
from apprise import Apprise
|
||||
from apprise import AppriseAttachment
|
||||
from apprise import NotifyType
|
||||
|
||||
# Disable logging for a cleaner testing output
|
||||
import logging
|
||||
logging.disable(logging.CRITICAL)
|
||||
|
||||
# Attachment Directory
|
||||
TEST_VAR_DIR = os.path.join(os.path.dirname(__file__), 'var')
|
||||
|
||||
|
||||
@mock.patch('requests.post')
|
||||
def test_notify_json_plugin_attachments(mock_post):
|
||||
"""
|
||||
NotifyJSON() Attachments
|
||||
|
||||
"""
|
||||
# Disable Throttling to speed testing
|
||||
plugins.NotifyBase.request_rate_per_sec = 0
|
||||
|
||||
okay_response = requests.Request()
|
||||
okay_response.status_code = requests.codes.ok
|
||||
okay_response.content = ""
|
||||
|
||||
# Assign our mock object our return value
|
||||
mock_post.return_value = okay_response
|
||||
|
||||
obj = Apprise.instantiate('json://localhost.localdomain/')
|
||||
assert isinstance(obj, plugins.NotifyJSON)
|
||||
|
||||
# Test Valid Attachment
|
||||
path = os.path.join(TEST_VAR_DIR, 'apprise-test.gif')
|
||||
attach = AppriseAttachment(path)
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is True
|
||||
|
||||
# Test invalid attachment
|
||||
path = os.path.join(TEST_VAR_DIR, '/invalid/path/to/an/invalid/file.jpg')
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=path) is False
|
||||
|
||||
# Get a appropriate "builtin" module name for pythons 2/3.
|
||||
if sys.version_info.major >= 3:
|
||||
builtin_open_function = 'builtins.open'
|
||||
|
||||
else:
|
||||
builtin_open_function = '__builtin__.open'
|
||||
|
||||
# Test Valid Attachment (load 3)
|
||||
path = (
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
)
|
||||
attach = AppriseAttachment(path)
|
||||
|
||||
# Return our good configuration
|
||||
mock_post.side_effect = None
|
||||
mock_post.return_value = okay_response
|
||||
with mock.patch(builtin_open_function, side_effect=OSError()):
|
||||
# We can't send the message we can't open the attachment for reading
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is False
|
||||
|
||||
# test the handling of our batch modes
|
||||
obj = Apprise.instantiate('json://no-reply@example.com/')
|
||||
assert isinstance(obj, plugins.NotifyJSON)
|
||||
|
||||
# Now send an attachment normally without issues
|
||||
mock_post.reset_mock()
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is True
|
||||
assert mock_post.call_count == 1
|
@ -112,6 +112,11 @@ apprise_url_tests = (
|
||||
# Our expected url(privacy=True) startswith() response:
|
||||
'privacy_url': 'forms://user:****@localhost:8080',
|
||||
}),
|
||||
# Test our GET params
|
||||
('form://localhost:8080/path?-ParamA=Value', {
|
||||
'instance': plugins.NotifyForm,
|
||||
}),
|
||||
# Test our Headers
|
||||
('form://localhost:8080/path?+HeaderKey=HeaderValue', {
|
||||
'instance': plugins.NotifyForm,
|
||||
}),
|
||||
|
@ -22,17 +22,25 @@
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
# THE SOFTWARE.
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
from unittest import mock
|
||||
|
||||
import requests
|
||||
from apprise import plugins
|
||||
from apprise import Apprise
|
||||
from apprise import AppriseAttachment
|
||||
from apprise import NotifyType
|
||||
from helpers import AppriseURLTester
|
||||
|
||||
# Disable logging for a cleaner testing output
|
||||
import logging
|
||||
logging.disable(logging.CRITICAL)
|
||||
|
||||
# Attachment Directory
|
||||
TEST_VAR_DIR = os.path.join(os.path.dirname(__file__), 'var')
|
||||
|
||||
# Our Testing URLs
|
||||
apprise_url_tests = (
|
||||
('json://:@/', {
|
||||
@ -95,12 +103,17 @@ apprise_url_tests = (
|
||||
# Our expected url(privacy=True) startswith() response:
|
||||
'privacy_url': 'jsons://localhost:8080/path/',
|
||||
}),
|
||||
# Test our GET params
|
||||
('json://localhost:8080/path?-ParamA=Value', {
|
||||
'instance': plugins.NotifyJSON,
|
||||
}),
|
||||
('jsons://user:password@localhost:8080', {
|
||||
'instance': plugins.NotifyJSON,
|
||||
|
||||
# Our expected url(privacy=True) startswith() response:
|
||||
'privacy_url': 'jsons://user:****@localhost:8080',
|
||||
}),
|
||||
# Test our Headers
|
||||
('json://localhost:8080/path?+HeaderKey=HeaderValue', {
|
||||
'instance': plugins.NotifyJSON,
|
||||
}),
|
||||
@ -194,3 +207,71 @@ def test_plugin_custom_json_edge_cases(mock_get, mock_post):
|
||||
for k in ('user', 'password', 'port', 'host', 'fullpath', 'path', 'query',
|
||||
'schema', 'url', 'method'):
|
||||
assert new_results[k] == results[k]
|
||||
|
||||
|
||||
@mock.patch('requests.post')
|
||||
def test_notify_json_plugin_attachments(mock_post):
|
||||
"""
|
||||
NotifyJSON() Attachments
|
||||
|
||||
"""
|
||||
# Disable Throttling to speed testing
|
||||
plugins.NotifyBase.request_rate_per_sec = 0
|
||||
|
||||
okay_response = requests.Request()
|
||||
okay_response.status_code = requests.codes.ok
|
||||
okay_response.content = ""
|
||||
|
||||
# Assign our mock object our return value
|
||||
mock_post.return_value = okay_response
|
||||
|
||||
obj = Apprise.instantiate('json://localhost.localdomain/')
|
||||
assert isinstance(obj, plugins.NotifyJSON)
|
||||
|
||||
# Test Valid Attachment
|
||||
path = os.path.join(TEST_VAR_DIR, 'apprise-test.gif')
|
||||
attach = AppriseAttachment(path)
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is True
|
||||
|
||||
# Test invalid attachment
|
||||
path = os.path.join(TEST_VAR_DIR, '/invalid/path/to/an/invalid/file.jpg')
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=path) is False
|
||||
|
||||
# Get a appropriate "builtin" module name for pythons 2/3.
|
||||
if sys.version_info.major >= 3:
|
||||
builtin_open_function = 'builtins.open'
|
||||
|
||||
else:
|
||||
builtin_open_function = '__builtin__.open'
|
||||
|
||||
# Test Valid Attachment (load 3)
|
||||
path = (
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
os.path.join(TEST_VAR_DIR, 'apprise-test.gif'),
|
||||
)
|
||||
attach = AppriseAttachment(path)
|
||||
|
||||
# Return our good configuration
|
||||
mock_post.side_effect = None
|
||||
mock_post.return_value = okay_response
|
||||
with mock.patch(builtin_open_function, side_effect=OSError()):
|
||||
# We can't send the message we can't open the attachment for reading
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is False
|
||||
|
||||
# test the handling of our batch modes
|
||||
obj = Apprise.instantiate('json://no-reply@example.com/')
|
||||
assert isinstance(obj, plugins.NotifyJSON)
|
||||
|
||||
# Now send an attachment normally without issues
|
||||
mock_post.reset_mock()
|
||||
assert obj.notify(
|
||||
body='body', title='title', notify_type=NotifyType.INFO,
|
||||
attach=attach) is True
|
||||
assert mock_post.call_count == 1
|
||||
|
@ -125,6 +125,11 @@ apprise_url_tests = (
|
||||
('xmls://user:pass@localhost:8080', {
|
||||
'instance': plugins.NotifyXML,
|
||||
}),
|
||||
# Test our GET params
|
||||
('xml://localhost:8080/path?-ParamA=Value', {
|
||||
'instance': plugins.NotifyXML,
|
||||
}),
|
||||
# Test our Headers
|
||||
('xml://localhost:8080/path?+HeaderKey=HeaderValue', {
|
||||
'instance': plugins.NotifyXML,
|
||||
}),
|
||||
|
Loading…
Reference in New Issue
Block a user