Fix #25: add support for custom urls using get requests

This commit is contained in:
John Reese 2013-01-09 14:26:54 -08:00
parent a65def9f38
commit 1c612d6922
2 changed files with 77 additions and 0 deletions

View File

@ -11,6 +11,7 @@ conditions. ZNC Push current supports the following services:
* [Pushover][] * [Pushover][]
* [Prowl][] * [Prowl][]
* [Supertoasty][] * [Supertoasty][]
* Custom URL GET requests
This project is still a Work In Progress, but should be functional enough and stable enough This project is still a Work In Progress, but should be functional enough and stable enough
for everyday usage. Users are more than welcome to submit feature requests or patches for for everyday usage. Users are more than welcome to submit feature requests or patches for
@ -189,6 +190,7 @@ to something similar to "http://domain/#channel/2011-03-09 14:25:09", or
* "pushover" * "pushover"
* "prowl" * "prowl"
* "supertoasty" * "supertoasty"
* "url"
* `username = ""` * `username = ""`
@ -209,6 +211,12 @@ to something similar to "http://domain/#channel/2011-03-09 14:25:09", or
When using Pushover, this option allows you to specify a single device name to send When using Pushover, this option allows you to specify a single device name to send
notifications to; if blank or unset, notifications will be sent to all devices. notifications to; if blank or unset, notifications will be sent to all devices.
When using URL, this options allows you to specify the URL to send a GET request
to, and has keyword expansion performed on portions of it, including the path and
any query parameter values.
This option must be set when using URL.
### Conditions ### Conditions

View File

@ -350,6 +350,71 @@ class CPushMod : public CModule
params["image"] = "https://github.com/jreese/znc-push/raw/supertoasty/logo.png"; params["image"] = "https://github.com/jreese/znc-push/raw/supertoasty/logo.png";
params["sender"] = "ZNC Push"; params["sender"] = "ZNC Push";
} }
else if (service == "url")
{
if (options["target"] == "")
{
PutModule("Error: target (url) not set");
return;
}
int count;
VCString parts;
CString url = options["target"];
// Verify that the URL begins with either http:// or https://
count = url.Split("://", parts, false);
if (count != 2)
{
PutModule("Error: invalid url format");
return;
}
use_post = false;
if (parts[0] == "https")
{
use_ssl = true;
use_port = 443;
}
else if (parts[0] == "http")
{
use_ssl = false;
use_port = 80;
}
else
{
PutModule("Error: invalid url schema");
return;
}
// Process the remaining portion of the URL
url = parts[1];
// Split out the host and optional port number; this breaks with raw IPv6 addresses
CString host = url.Token(0, false, "/");
count = host.Split(":", parts, false);
if (count > 1)
{
use_port = parts[1].ToInt();
}
service_host = parts[0];
// Split remaining URL into path and query components
url = "/" + url.Token(1, true, "/");
service_url = expand(url.Token(0, false, "?"), replace);
// Parse and expand query parameter values
url = url.Token(1, true, "?");
url.URLSplit(params);
for (MCString::iterator i = params.begin(); i != params.end(); i++) {
i->second = expand(i->second, replace);
}
}
else else
{ {
PutModule("Error: service type not selected"); PutModule("Error: service type not selected");
@ -977,6 +1042,10 @@ class CPushMod : public CModule
{ {
PutModule("Note: Supertoasty requires setting the 'secret' option with device id"); PutModule("Note: Supertoasty requires setting the 'secret' option with device id");
} }
else if (value == "url")
{
PutModule("Note: URL requires setting the 'target' option with the full URL");
}
else else
{ {
PutModule("Error: unknown service name"); PutModule("Error: unknown service name");