mirror of
https://github.com/WarmUpTill/SceneSwitcher.git
synced 2026-03-21 17:34:57 -05:00
Rework HTTP action URL input
The URL to be accessed can now be passed as a single URL instead of it being split into a host and path component
This commit is contained in:
parent
daeb9275a3
commit
79a8ad57af
|
|
@ -1095,7 +1095,7 @@ AdvSceneSwitcher.action.http.type.post="POST"
|
|||
AdvSceneSwitcher.action.http.type.put="PUT"
|
||||
AdvSceneSwitcher.action.http.type.patch="PATCH"
|
||||
AdvSceneSwitcher.action.http.type.delete="DELETE"
|
||||
AdvSceneSwitcher.action.http.layout.method="Send{{method}}to URL{{url}}at path{{path}}"
|
||||
AdvSceneSwitcher.action.http.layout.method="Send{{method}}to URL{{url}}"
|
||||
AdvSceneSwitcher.action.http.layout.contentType="Content type:{{contentType}}"
|
||||
AdvSceneSwitcher.action.http.layout.timeout="Timeout:{{timeout}}seconds"
|
||||
AdvSceneSwitcher.action.http.entry.line1="Send{{method}}to{{url}}"
|
||||
|
|
|
|||
|
|
@ -65,20 +65,47 @@ void MacroActionHttp::SetupTempVars()
|
|||
"AdvSceneSwitcher.tempVar.http.error.description"));
|
||||
}
|
||||
|
||||
struct URLInfo {
|
||||
std::string host;
|
||||
std::string path;
|
||||
};
|
||||
|
||||
static URLInfo getURLInfo(const std::string &input)
|
||||
{
|
||||
if (input.empty()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
QString urlInput = QString::fromStdString(input);
|
||||
if (!urlInput.contains("://")) {
|
||||
urlInput = "http://" + urlInput;
|
||||
}
|
||||
|
||||
const QUrl url(urlInput);
|
||||
auto host =
|
||||
url.scheme().toStdString() + "://" + url.host().toStdString();
|
||||
int port = url.port();
|
||||
if (port != -1) {
|
||||
host += ":" + std::to_string(port);
|
||||
}
|
||||
auto path = url.path().toStdString();
|
||||
if (path.empty()) {
|
||||
path = "/";
|
||||
}
|
||||
|
||||
return {host, path};
|
||||
}
|
||||
|
||||
bool MacroActionHttp::PerformAction()
|
||||
{
|
||||
httplib::Client cli(_url);
|
||||
const auto [host, path] = getURLInfo(_url);
|
||||
|
||||
httplib::Client cli(host);
|
||||
setTimeout(cli, _timeout);
|
||||
const auto params = _setParams ? getParams(_params) : httplib::Params();
|
||||
const auto headers = _setHeaders ? getHeaders(_headers)
|
||||
: httplib::Headers();
|
||||
|
||||
// This copy is necessary for some reason for MacOS but not Linux or
|
||||
// Windows.
|
||||
// Without it all requests fail with "Invalid argument" or
|
||||
// "Failed to write connection" when sending out the data.
|
||||
std::string path = _path;
|
||||
|
||||
httplib::Result response;
|
||||
switch (_method) {
|
||||
case MacroActionHttp::Method::GET:
|
||||
|
|
@ -167,13 +194,12 @@ void MacroActionHttp::LogAction() const
|
|||
ablog(LOG_INFO,
|
||||
"sent HTTP request (%s) "
|
||||
"to URL \"%s\" "
|
||||
"to path \"%s\" "
|
||||
"with content type \"%s\" "
|
||||
"with body \"%s\" "
|
||||
"with headers \"%s\" "
|
||||
"with parameters \"%s\" "
|
||||
"with timeout \"%s\"",
|
||||
methodToString(_method).data(), _url.c_str(), _path.c_str(),
|
||||
methodToString(_method).data(), _url.c_str(),
|
||||
_contentType.c_str(), _body.c_str(),
|
||||
_setHeaders ? stringListToString(_headers).c_str() : "-",
|
||||
_setParams ? stringListToString(_params).c_str() : "-",
|
||||
|
|
@ -184,7 +210,6 @@ bool MacroActionHttp::Save(obs_data_t *obj) const
|
|||
{
|
||||
MacroAction::Save(obj);
|
||||
_url.Save(obj, "url");
|
||||
_path.Save(obj, "path");
|
||||
_contentType.Save(obj, "contentType");
|
||||
_body.Save(obj, "body");
|
||||
obs_data_set_bool(obj, "setHeaders", _setHeaders);
|
||||
|
|
@ -200,7 +225,11 @@ bool MacroActionHttp::Load(obs_data_t *obj)
|
|||
{
|
||||
MacroAction::Load(obj);
|
||||
_url.Load(obj, "url");
|
||||
_path.Load(obj, "path");
|
||||
if (obs_data_has_user_value(obj, "path")) {
|
||||
std::string url = _url.UnresolvedValue();
|
||||
url += obs_data_get_string(obj, "path");
|
||||
_url = url;
|
||||
}
|
||||
_contentType.Load(obj, "contentType");
|
||||
_body.Load(obj, "body");
|
||||
_setHeaders = obs_data_get_bool(obj, "setHeaders");
|
||||
|
|
@ -230,7 +259,6 @@ std::shared_ptr<MacroAction> MacroActionHttp::Copy() const
|
|||
void MacroActionHttp::ResolveVariablesToFixedValues()
|
||||
{
|
||||
_url.ResolveVariables();
|
||||
_path.ResolveVariables();
|
||||
_contentType.ResolveVariables();
|
||||
_body.ResolveVariables();
|
||||
_headers.ResolveVariables();
|
||||
|
|
@ -263,7 +291,6 @@ MacroActionHttpEdit::MacroActionHttpEdit(
|
|||
QWidget *parent, std::shared_ptr<MacroActionHttp> entryData)
|
||||
: QWidget(parent),
|
||||
_url(new VariableLineEdit(this)),
|
||||
_path(new VariableLineEdit(this)),
|
||||
_contentType(new VariableLineEdit(this)),
|
||||
_contentTypeLayout(new QHBoxLayout()),
|
||||
_methods(new QComboBox()),
|
||||
|
|
@ -306,7 +333,6 @@ void MacroActionHttpEdit::UpdateEntryData()
|
|||
}
|
||||
|
||||
_url->setText(_entryData->_url);
|
||||
_path->setText(_entryData->_path);
|
||||
_contentType->setText(_entryData->_contentType);
|
||||
_body->setPlainText(_entryData->_body);
|
||||
_setHeaders->setChecked(_entryData->_setHeaders);
|
||||
|
|
@ -326,12 +352,6 @@ void MacroActionHttpEdit::URLChanged()
|
|||
emit(HeaderInfoChanged(_url->text()));
|
||||
}
|
||||
|
||||
void MacroActionHttpEdit::PathChanged()
|
||||
{
|
||||
GUARD_LOADING_AND_LOCK();
|
||||
_entryData->_path = _path->text().toStdString();
|
||||
}
|
||||
|
||||
void MacroActionHttpEdit::ContentTypeChanged()
|
||||
{
|
||||
GUARD_LOADING_AND_LOCK();
|
||||
|
|
@ -395,8 +415,6 @@ void MacroActionHttpEdit::SetWidgetSignalConnections()
|
|||
{
|
||||
QWidget::connect(_url, SIGNAL(editingFinished()), this,
|
||||
SLOT(URLChanged()));
|
||||
QWidget::connect(_path, SIGNAL(editingFinished()), this,
|
||||
SLOT(PathChanged()));
|
||||
QWidget::connect(_contentType, SIGNAL(editingFinished()), this,
|
||||
SLOT(ContentTypeChanged()));
|
||||
QWidget::connect(_body, SIGNAL(textChanged()), this,
|
||||
|
|
@ -420,18 +438,15 @@ void MacroActionHttpEdit::SetWidgetSignalConnections()
|
|||
void MacroActionHttpEdit::SetWidgetLayout()
|
||||
{
|
||||
const std::unordered_map<std::string, QWidget *> widgets = {
|
||||
{"{{url}}", _url},
|
||||
{"{{path}}", _path},
|
||||
{"{{contentType}}", _contentType},
|
||||
{"{{method}}", _methods},
|
||||
{"{{body}}", _body},
|
||||
{"{{url}}", _url}, {"{{contentType}}", _contentType},
|
||||
{"{{method}}", _methods}, {"{{body}}", _body},
|
||||
{"{{timeout}}", _timeout},
|
||||
};
|
||||
|
||||
auto actionLayout = new QHBoxLayout;
|
||||
PlaceWidgets(
|
||||
obs_module_text("AdvSceneSwitcher.action.http.layout.method"),
|
||||
actionLayout, widgets);
|
||||
actionLayout, widgets, false);
|
||||
|
||||
PlaceWidgets(obs_module_text(
|
||||
"AdvSceneSwitcher.action.http.layout.contentType"),
|
||||
|
|
|
|||
|
|
@ -33,7 +33,6 @@ public:
|
|||
};
|
||||
|
||||
StringVariable _url = "127.0.0.1:8080";
|
||||
StringVariable _path = "/";
|
||||
StringVariable _body = obs_module_text("AdvSceneSwitcher.enterText");
|
||||
StringVariable _contentType = "application/json";
|
||||
bool _setHeaders = false;
|
||||
|
|
@ -68,7 +67,6 @@ public:
|
|||
|
||||
private slots:
|
||||
void URLChanged();
|
||||
void PathChanged();
|
||||
void BodyChanged();
|
||||
void ContentTypeChanged();
|
||||
void MethodChanged(int);
|
||||
|
|
@ -86,7 +84,6 @@ private:
|
|||
void SetWidgetVisibility();
|
||||
|
||||
VariableLineEdit *_url;
|
||||
VariableLineEdit *_path;
|
||||
VariableLineEdit *_contentType;
|
||||
QHBoxLayout *_contentTypeLayout;
|
||||
QComboBox *_methods;
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user