change: PreferencesWindow refactor and added custom Qv2ray proxy

This commit is contained in:
Qv2ray-dev 2020-04-12 17:57:45 +08:00
parent e88413d42d
commit 796ada817d
9 changed files with 1061 additions and 1074 deletions

View File

@ -214,6 +214,17 @@ namespace Qv2ray::base::config
XTOSTRUCT(O(ignoredVersion, updateChannel))
};
struct Qv2rayNetworkConfig
{
bool useCustomProxy;
QString address;
QString type;
int port;
QString userAgent;
Qv2rayNetworkConfig() : address(""), type("http"), port(8000), userAgent("Qv2ray/" QV2RAY_VERSION_STRING " WebRequestHelper"){};
XTOSTRUCT(O(useCustomProxy, type, address, port, userAgent))
};
struct Qv2rayConfig
{
int config_version;
@ -233,18 +244,47 @@ namespace Qv2ray::base::config
Qv2rayPluginConfig pluginConfig;
Qv2rayKernelConfig kernelConfig;
Qv2rayUpdateConfig updateConfig;
Qv2rayNetworkConfig networkConfig;
Qv2rayToolBarConfig toolBarConfig;
Qv2rayInboundsConfig inboundConfig;
Qv2rayConnectionConfig connectionConfig;
Qv2rayConfig()
: config_version(QV2RAY_CONFIG_VERSION), tProxySupport(false), logLevel(), autoStartId("null"), groups(), subscriptions(),
connections(), uiConfig(), apiConfig(), pluginConfig(), kernelConfig(), updateConfig(), toolBarConfig(), inboundConfig(),
: config_version(QV2RAY_CONFIG_VERSION), //
tProxySupport(false), //
logLevel(), //
autoStartId("null"), //
groups(), //
subscriptions(), //
connections(), //
uiConfig(), //
apiConfig(), //
pluginConfig(), //
kernelConfig(), //
updateConfig(), //
networkConfig(), //
toolBarConfig(), //
inboundConfig(), //
connectionConfig()
{
}
XTOSTRUCT(O(config_version, tProxySupport, logLevel, uiConfig, pluginConfig, updateConfig, kernelConfig, groups, connections,
subscriptions, autoStartId, inboundConfig, connectionConfig, toolBarConfig, apiConfig))
XTOSTRUCT(O(config_version, //
tProxySupport, //
logLevel, //
uiConfig, //
pluginConfig, //
updateConfig, //
kernelConfig, //
networkConfig, //
groups, //
connections, //
subscriptions, //
autoStartId, //
inboundConfig, //
connectionConfig, //
toolBarConfig, //
apiConfig //
))
};
} // namespace Qv2ray::base::config

View File

@ -16,112 +16,71 @@ namespace Qv2ray::common
accessManager.disconnect();
}
bool QvHttpRequestHelper::setUrl(const QString &url)
{
QUrl qUrl = QUrl(url);
if (!qUrl.isValid())
{
LOG(MODULE_NETWORK, "Provided URL is invalid: " + url)
return false;
}
request.setUrl(qUrl);
return true;
}
void QvHttpRequestHelper::setHeader(const QByteArray &key, const QByteArray &value)
{
DEBUG(MODULE_NETWORK, "Adding HTTP request header: " + key + ":" + value)
request.setRawHeader(key, value);
}
QByteArray QvHttpRequestHelper::syncget(const QString &url, bool useProxy)
QByteArray QvHttpRequestHelper::Get(const QString &url, bool useProxy)
{
this->setUrl(url);
request.setUrl({ url });
if (useProxy)
{
auto proxy = QNetworkProxyFactory::systemProxyForQuery();
accessManager.setProxy(proxy.first());
LOG(MODULE_NETWORK, "Sync get is using system proxy settings")
auto p = GlobalConfig.networkConfig.useCustomProxy ?
QNetworkProxy{
GlobalConfig.networkConfig.type == "http" ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy, //
GlobalConfig.networkConfig.address, //
quint16(GlobalConfig.networkConfig.port) //
} :
QNetworkProxyFactory::systemProxyForQuery().first();
accessManager.setProxy(p);
}
else
{
LOG(MODULE_NETWORK, "Get without proxy.")
accessManager.setProxy(QNetworkProxy(QNetworkProxy::ProxyType::NoProxy));
}
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true);
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, "Mozilla/5.0 (rv:71.0) Gecko/20100101 Firefox/71.0");
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, GlobalConfig.networkConfig.userAgent);
reply = accessManager.get(request);
connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished_p);
//
QEventLoop loop;
connect(reply, &QNetworkReply::finished, &loop, &QEventLoop::quit);
loop.exec();
//
// Data or timeout?
auto data = reply->readAll();
return data;
}
void QvHttpRequestHelper::get(const QString &url)
void QvHttpRequestHelper::AsyncGet(const QString &url)
{
this->setUrl(url);
// request.setRawHeader("Content-Type",
// "application/x-www-form-urlencoded");
request.setUrl({ url });
if (GlobalConfig.networkConfig.useCustomProxy)
{
QNetworkProxy p{
GlobalConfig.networkConfig.type == "http" ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy, //
GlobalConfig.networkConfig.address, //
quint16(GlobalConfig.networkConfig.port) //
};
accessManager.setProxy(p);
}
else
{
LOG(MODULE_NETWORK, "Get without proxy.")
accessManager.setProxy(QNetworkProxy(QNetworkProxy::ProxyType::NoProxy));
}
request.setAttribute(QNetworkRequest::RedirectPolicyAttribute, QNetworkRequest::NoLessSafeRedirectPolicy);
request.setAttribute(QNetworkRequest::HTTP2AllowedAttribute, true);
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader, GlobalConfig.networkConfig.userAgent);
reply = accessManager.get(request);
connect(reply, &QNetworkReply::finished, this, &QvHttpRequestHelper::onRequestFinished_p);
connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
connect(reply, &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead_p);
}
// void QvHttpRequestHelper::post(const QString &url, const QByteArray
// &data)
//{
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.post(request, data);
// connect(reply, &QNetworkReply::finished, this,
// &QvHttpRequestHelper::onRequestFinished); connect(reply,
// &QNetworkReply::readyRead, this, &QvHttpRequestHelper::onReadyRead);
//}
// void QvHttpRequestHelper::put(const QString &url, const QByteArray
// &data)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.put(request, data);
// connect(reply, &QNetworkReply::finished, this,
// &QvHttpRequestHelper::onRequestFinished); connect(reply,
// &QNetworkReply::readyRead, this,
// &QvHttpRequestHelper::onReadyRead);
// }
// void QvHttpRequestHelper::del(const QString &url)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type", "application/json");
// reply = accessManager.deleteResource(request);
// connect(reply, &QNetworkReply::finished, this,
// &QvHttpRequestHelper::onRequestFinished); connect(reply,
// &QNetworkReply::readyRead, this,
// &QvHttpRequestHelper::onReadyRead);
// }
// void QvHttpRequestHelper::login(const QString &url, const QByteArray
// &data)
// {
// this->setUrl(url);
// request.setRawHeader("Content-Type",
// "application/x-www-form-urlencoded"); reply =
// accessManager.post(request, data); connect(reply,
// &QNetworkReply::finished, this,
// &QvHttpRequestHelper::onRequestFinished); connect(reply,
// &QNetworkReply::readyRead, this,
// &QvHttpRequestHelper::onReadyRead);
// }
void QvHttpRequestHelper::onRequestFinished_p()
{
if (reply->attribute(QNetworkRequest::HTTP2WasUsedAttribute).toBool())
@ -134,15 +93,15 @@ namespace Qv2ray::common
QString error = QMetaEnum::fromType<QNetworkReply::NetworkError>().key(reply->error());
LOG(MODULE_NETWORK, "Network request error string: " + error)
QByteArray empty;
emit httpRequestFinished(empty);
emit OnRequestFinished(empty);
}
else
{
emit httpRequestFinished(this->data);
emit OnRequestFinished(this->data);
}
}
void QvHttpRequestHelper::onReadyRead()
void QvHttpRequestHelper::onReadyRead_p()
{
DEBUG(MODULE_NETWORK, "A request is now ready read")
this->data += reply->readAll();

View File

@ -31,26 +31,18 @@ namespace Qv2ray::common
public:
explicit QvHttpRequestHelper(QObject *parent = nullptr);
~QvHttpRequestHelper();
bool setUrl(const QString &url);
void setHeader(const QByteArray &key, const QByteArray &value);
// get
QByteArray syncget(const QString &url, bool useProxy);
void get(const QString &url);
//// insert
// void post(const QString &url, const QByteArray &data);
//// update
// void put(const QString &url, const QByteArray &data);
//// delete
// void del(const QString &url);
// void login(const QString &url, const QByteArray &data);
void AsyncGet(const QString &url);
QByteArray Get(const QString &url, bool useProxy);
signals:
void httpRequestFinished(QByteArray &data);
void OnRequestFinished(QByteArray &data);
private slots:
void onRequestFinished_p();
void onReadyRead();
void onReadyRead_p();
private:
void setHeader(const QByteArray &key, const QByteArray &value);
QByteArray data;
QUrl url;
QNetworkReply *reply;

View File

@ -19,7 +19,7 @@ namespace Qv2ray::components
QvUpdateChecker::QvUpdateChecker(QObject *parent) : QObject(parent)
{
requestHelper = new QvHttpRequestHelper(this);
connect(requestHelper, &QvHttpRequestHelper::httpRequestFinished, this, &QvUpdateChecker::VersionUpdate);
connect(requestHelper, &QvHttpRequestHelper::OnRequestFinished, this, &QvUpdateChecker::VersionUpdate);
}
QvUpdateChecker::~QvUpdateChecker()
{
@ -29,7 +29,7 @@ namespace Qv2ray::components
#ifndef DISABLE_AUTO_UPDATE
auto updateChannel = GlobalConfig.updateConfig.updateChannel;
LOG(MODULE_NETWORK, "Start checking update for channel ID: " + QSTRN(updateChannel))
requestHelper->get(UpdateChannelLink[updateChannel]);
requestHelper->AsyncGet(UpdateChannelLink[updateChannel]);
#endif
}
void QvUpdateChecker::VersionUpdate(QByteArray &data)

View File

@ -467,7 +467,7 @@ namespace Qv2ray::core::handlers
return false;
}
isHttpRequestInProgress = true;
auto data = httpHelper->syncget(groups[id].address, useSystemProxy);
auto data = httpHelper->Get(groups[id].address, useSystemProxy);
isHttpRequestInProgress = false;
return CHUpdateSubscription_p(id, data);
}

View File

@ -131,6 +131,11 @@ PreferencesWindow::PreferencesWindow(QWidget *parent) : QDialog(parent), Current
pluginKernelV2rayIntegrationCB->setChecked(CurrentConfig.pluginConfig.v2rayIntegration);
pluginKernelPortAllocateCB->setValue(CurrentConfig.pluginConfig.portAllocationStart);
//
qvProxyPortCB->setValue(CurrentConfig.networkConfig.port);
qvProxyAddressTxt->setText(CurrentConfig.networkConfig.address);
qvProxyTypeCombo->setCurrentText(CurrentConfig.networkConfig.type);
qvNetworkUATxt->setText(CurrentConfig.networkConfig.userAgent);
qvUseProxyCB->setChecked(CurrentConfig.networkConfig.useCustomProxy);
//
DNSListTxt->clear();
for (auto dnsStr : CurrentConfig.connectionConfig.dnsList)
@ -1113,3 +1118,34 @@ void PreferencesWindow::on_pluginKernelPortAllocateCB_valueChanged(int arg1)
LOADINGCHECK
CurrentConfig.pluginConfig.portAllocationStart = arg1;
}
void PreferencesWindow::on_qvProxyAddressTxt_textEdited(const QString &arg1)
{
LOADINGCHECK
CurrentConfig.networkConfig.address = arg1;
}
void PreferencesWindow::on_qvProxyTypeCombo_currentTextChanged(const QString &arg1)
{
LOADINGCHECK
CurrentConfig.networkConfig.type = arg1.toLower();
}
void PreferencesWindow::on_qvProxyPortCB_valueChanged(int arg1)
{
LOADINGCHECK
CurrentConfig.networkConfig.port = arg1;
}
void PreferencesWindow::on_qvNetworkUATxt_textEdited(const QString &arg1)
{
LOADINGCHECK
CurrentConfig.networkConfig.userAgent = arg1;
}
void PreferencesWindow::on_qvUseProxyCB_stateChanged(int arg1)
{
LOADINGCHECK
CurrentConfig.networkConfig.useCustomProxy = arg1 == Qt::Checked;
}

View File

@ -160,6 +160,16 @@ class PreferencesWindow
void on_pluginKernelPortAllocateCB_valueChanged(int arg1);
void on_qvProxyAddressTxt_textEdited(const QString &arg1);
void on_qvProxyTypeCombo_currentTextChanged(const QString &arg1);
void on_qvProxyPortCB_valueChanged(int arg1);
void on_qvNetworkUATxt_textEdited(const QString &arg1);
void on_qvUseProxyCB_stateChanged(int arg1);
private:
//
RouteSettingsMatrixWidget *routeSettingsWidget;

File diff suppressed because it is too large Load Diff

View File

@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>600</width>
<height>409</height>
<width>582</width>
<height>404</height>
</rect>
</property>
<property name="windowTitle">
@ -45,93 +45,84 @@
</layout>
</item>
<item>
<widget class="QGroupBox" name="groupBox">
<property name="title">
<string>Route Settings</string>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Lines start with &quot;geoip:&quot; or &quot;geosite:&quot; will have its autocompletion from geoip.dat and geosite.dat</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QLabel" name="label_3">
<property name="text">
<string>Lines start with &quot;geoip:&quot; or &quot;geosite:&quot; will have its autocompletion from geoip.dat and geosite.dat</string>
</property>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1">
<item row="0" column="3">
<widget class="QLabel" name="label_82">
<property name="text">
<string>Block</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="3">
<layout class="QGridLayout" name="blockTxtLayout"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_80">
<property name="text">
<string>Direct</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Domain</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QGridLayout" name="directTxtLayout"/>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="proxyIPLayout"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_81">
<property name="text">
<string>Proxy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<layout class="QGridLayout" name="proxyTxtLayout"/>
</item>
<item row="1" column="3">
<layout class="QGridLayout" name="blockIPLayout"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>IP</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QGridLayout" name="directIPLayout"/>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QGridLayout" name="gridLayout" rowstretch="0,1,1" columnstretch="0,1,1,1">
<item row="0" column="3">
<widget class="QLabel" name="label_82">
<property name="text">
<string>Block</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="3">
<layout class="QGridLayout" name="blockTxtLayout"/>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_80">
<property name="text">
<string>Direct</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Domain</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<layout class="QGridLayout" name="directTxtLayout"/>
</item>
<item row="1" column="2">
<layout class="QGridLayout" name="proxyIPLayout"/>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_81">
<property name="text">
<string>Proxy</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="2" column="2">
<layout class="QGridLayout" name="proxyTxtLayout"/>
</item>
<item row="1" column="3">
<layout class="QGridLayout" name="blockIPLayout"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>IP</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QGridLayout" name="directIPLayout"/>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>