mirror of
https://github.com/MatsuriDayo/nekoray.git
synced 2025-12-17 20:44:38 +03:00
fix: h2 -> http
fix: edit profile ui
This commit is contained in:
@@ -6,9 +6,7 @@ namespace NekoRay::fmt {
|
|||||||
// https://sing-box.sagernet.org/configuration/shared/v2ray-transport
|
// https://sing-box.sagernet.org/configuration/shared/v2ray-transport
|
||||||
|
|
||||||
if (network != "tcp") {
|
if (network != "tcp") {
|
||||||
QJsonObject transport{
|
QJsonObject transport{{"type", network},};
|
||||||
{"type", network.replace("h2", "http")},
|
|
||||||
};
|
|
||||||
if (network == "ws") {
|
if (network == "ws") {
|
||||||
if (!path.isEmpty()) transport["path"] = path;
|
if (!path.isEmpty()) transport["path"] = path;
|
||||||
if (!host.isEmpty()) transport["headers"] = QJsonObject{{"Host", host}};
|
if (!host.isEmpty()) transport["headers"] = QJsonObject{{"Host", host}};
|
||||||
|
|||||||
@@ -22,11 +22,11 @@ namespace NekoRay::fmt {
|
|||||||
ws["earlyDataHeaderName"] = ws_early_data_name;
|
ws["earlyDataHeaderName"] = ws_early_data_name;
|
||||||
}
|
}
|
||||||
streamSettings["wsSettings"] = ws;
|
streamSettings["wsSettings"] = ws;
|
||||||
} else if (network == "h2") {
|
} else if (network == "http") {
|
||||||
QJsonObject h2;
|
QJsonObject http;
|
||||||
if (!path.isEmpty()) h2["path"] = path;
|
if (!path.isEmpty()) http["path"] = path;
|
||||||
if (!host.isEmpty()) h2["host"] = QList2QJsonArray(host.split(","));
|
if (!host.isEmpty()) http["host"] = QList2QJsonArray(host.split(","));
|
||||||
streamSettings["httpSettings"] = h2;
|
streamSettings["httpSettings"] = http;
|
||||||
} else if (network == "grpc") {
|
} else if (network == "grpc") {
|
||||||
QJsonObject grpc;
|
QJsonObject grpc;
|
||||||
if (!path.isEmpty()) grpc["serviceName"] = path;
|
if (!path.isEmpty()) grpc["serviceName"] = path;
|
||||||
|
|||||||
@@ -33,9 +33,9 @@ namespace NekoRay::fmt {
|
|||||||
if (!name.isEmpty()) url.setFragment(UrlSafe_encode(name));
|
if (!name.isEmpty()) url.setFragment(UrlSafe_encode(name));
|
||||||
if (!stream->sni.isEmpty()) query.addQueryItem("sni", stream->sni);
|
if (!stream->sni.isEmpty()) query.addQueryItem("sni", stream->sni);
|
||||||
query.addQueryItem("security", "tls");
|
query.addQueryItem("security", "tls");
|
||||||
query.addQueryItem("type", stream->network.replace("h2", "http"));
|
query.addQueryItem("type", stream->network);
|
||||||
|
|
||||||
if (stream->network == "ws" || stream->network == "h2") {
|
if (stream->network == "ws" || stream->network == "http") {
|
||||||
if (!stream->path.isEmpty()) query.addQueryItem("path", stream->path);
|
if (!stream->path.isEmpty()) query.addQueryItem("path", stream->path);
|
||||||
if (!stream->host.isEmpty()) query.addQueryItem("host", stream->host);
|
if (!stream->host.isEmpty()) query.addQueryItem("host", stream->host);
|
||||||
} else if (stream->network == "grpc") {
|
} else if (stream->network == "grpc") {
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ namespace NekoRay::fmt {
|
|||||||
password = url.userName();
|
password = url.userName();
|
||||||
if (serverPort == -1) serverPort = 443;
|
if (serverPort == -1) serverPort = 443;
|
||||||
|
|
||||||
stream->network = GetQueryValue(query, "type", "tcp").replace("http", "h2");
|
stream->network = GetQueryValue(query, "type", "tcp");
|
||||||
stream->security = GetQueryValue(query, "security", "tls");
|
stream->security = GetQueryValue(query, "security", "tls");
|
||||||
auto sni1 = GetQueryValue(query, "sni");
|
auto sni1 = GetQueryValue(query, "sni");
|
||||||
auto sni2 = GetQueryValue(query, "peer");
|
auto sni2 = GetQueryValue(query, "peer");
|
||||||
@@ -64,7 +64,7 @@ namespace NekoRay::fmt {
|
|||||||
if (stream->network == "ws") {
|
if (stream->network == "ws") {
|
||||||
stream->path = GetQueryValue(query, "path", "");
|
stream->path = GetQueryValue(query, "path", "");
|
||||||
stream->host = GetQueryValue(query, "host", "");
|
stream->host = GetQueryValue(query, "host", "");
|
||||||
} else if (stream->network == "h2") {
|
} else if (stream->network == "http") {
|
||||||
stream->path = GetQueryValue(query, "path", "");
|
stream->path = GetQueryValue(query, "path", "");
|
||||||
stream->host = GetQueryValue(query, "host", "").replace("|", ",");
|
stream->host = GetQueryValue(query, "host", "").replace("|", ",");
|
||||||
} else if (stream->network == "grpc") {
|
} else if (stream->network == "grpc") {
|
||||||
@@ -119,7 +119,7 @@ namespace NekoRay::fmt {
|
|||||||
stream->path = objN["path"].toString();
|
stream->path = objN["path"].toString();
|
||||||
stream->sni = objN["sni"].toString();
|
stream->sni = objN["sni"].toString();
|
||||||
stream->header_type = objN["type"].toString();
|
stream->header_type = objN["type"].toString();
|
||||||
auto net = objN["net"].toString().replace("http", "h2");
|
auto net = objN["net"].toString();
|
||||||
if (!net.isEmpty()) stream->network = net;
|
if (!net.isEmpty()) stream->network = net;
|
||||||
auto scy = objN["scy"].toString();
|
auto scy = objN["scy"].toString();
|
||||||
if (!scy.isEmpty()) security = scy;
|
if (!scy.isEmpty()) security = scy;
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace NekoRay::fmt {
|
|||||||
QString network = "tcp";
|
QString network = "tcp";
|
||||||
QString security = "";
|
QString security = "";
|
||||||
QString packet_encoding = "";
|
QString packet_encoding = "";
|
||||||
// ws/h2/grpc/tcp-http
|
// ws/http/grpc/tcp-http
|
||||||
QString path = "";
|
QString path = "";
|
||||||
QString host = "";
|
QString host = "";
|
||||||
// kcp/quic/tcp-http
|
// kcp/quic/tcp-http
|
||||||
|
|||||||
@@ -250,7 +250,7 @@ namespace NekoRay::sub {
|
|||||||
bean->uuid = Node2QString(proxy["uuid"]);
|
bean->uuid = Node2QString(proxy["uuid"]);
|
||||||
bean->aid = Node2Int(proxy["alterId"]);
|
bean->aid = Node2Int(proxy["alterId"]);
|
||||||
bean->security = Node2QString(proxy["cipher"]);
|
bean->security = Node2QString(proxy["cipher"]);
|
||||||
bean->stream->network = Node2QString(proxy["network"], "tcp");
|
bean->stream->network = Node2QString(proxy["network"], "tcp").replace("h2", "http");
|
||||||
bean->stream->sni = FIRST_OR_SECOND(Node2QString(proxy["sni"]), Node2QString(proxy["servername"]));
|
bean->stream->sni = FIRST_OR_SECOND(Node2QString(proxy["sni"]), Node2QString(proxy["servername"]));
|
||||||
if (Node2Bool(proxy["tls"])) bean->stream->security = "tls";
|
if (Node2Bool(proxy["tls"])) bean->stream->security = "tls";
|
||||||
if (Node2Bool(proxy["skip-cert-verify"])) bean->stream->allow_insecure = true;
|
if (Node2Bool(proxy["skip-cert-verify"])) bean->stream->allow_insecure = true;
|
||||||
@@ -273,7 +273,7 @@ namespace NekoRay::sub {
|
|||||||
|
|
||||||
auto h2 = NodeChild(proxy, {"h2-opts", "h2-opt"});
|
auto h2 = NodeChild(proxy, {"h2-opts", "h2-opt"});
|
||||||
if (h2.IsMap()) {
|
if (h2.IsMap()) {
|
||||||
auto hosts = ws["host"];
|
auto hosts = h2["host"];
|
||||||
for (auto host: hosts) {
|
for (auto host: hosts) {
|
||||||
bean->stream->host = Node2QString(host);
|
bean->stream->host = Node2QString(host);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -30,7 +30,8 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
|
|||||||
network_title_base = ui->network_box->title();
|
network_title_base = ui->network_box->title();
|
||||||
connect(ui->network, &QComboBox::currentTextChanged, this, [=](const QString &txt) {
|
connect(ui->network, &QComboBox::currentTextChanged, this, [=](const QString &txt) {
|
||||||
ui->network_box->setTitle(network_title_base.arg(txt));
|
ui->network_box->setTitle(network_title_base.arg(txt));
|
||||||
if (txt == "tcp" || txt == "quic") {
|
// 传输设置
|
||||||
|
if (txt == "tcp" || (!IS_NEKO_BOX && txt == "quic")) {
|
||||||
ui->header_type->setVisible(true);
|
ui->header_type->setVisible(true);
|
||||||
ui->header_type_l->setVisible(true);
|
ui->header_type_l->setVisible(true);
|
||||||
ui->path->setVisible(true);
|
ui->path->setVisible(true);
|
||||||
@@ -44,7 +45,7 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
|
|||||||
ui->path_l->setVisible(true);
|
ui->path_l->setVisible(true);
|
||||||
ui->host->setVisible(false);
|
ui->host->setVisible(false);
|
||||||
ui->host_l->setVisible(false);
|
ui->host_l->setVisible(false);
|
||||||
} else if (txt == "ws" || txt == "h2") {
|
} else if (txt == "ws" || txt == "http") {
|
||||||
ui->header_type->setVisible(false);
|
ui->header_type->setVisible(false);
|
||||||
ui->header_type_l->setVisible(false);
|
ui->header_type_l->setVisible(false);
|
||||||
ui->path->setVisible(true);
|
ui->path->setVisible(true);
|
||||||
@@ -59,6 +60,7 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
|
|||||||
ui->host->setVisible(false);
|
ui->host->setVisible(false);
|
||||||
ui->host_l->setVisible(false);
|
ui->host_l->setVisible(false);
|
||||||
}
|
}
|
||||||
|
// 传输设置 ED
|
||||||
if (txt == "ws") {
|
if (txt == "ws") {
|
||||||
ui->ws_early_data_length->setVisible(true);
|
ui->ws_early_data_length->setVisible(true);
|
||||||
ui->ws_early_data_length_l->setVisible(true);
|
ui->ws_early_data_length_l->setVisible(true);
|
||||||
@@ -70,6 +72,17 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
|
|||||||
ui->ws_early_data_name->setVisible(false);
|
ui->ws_early_data_name->setVisible(false);
|
||||||
ui->ws_early_data_name_l->setVisible(false);
|
ui->ws_early_data_name_l->setVisible(false);
|
||||||
}
|
}
|
||||||
|
// 传输设置 for NekoBox
|
||||||
|
if (IS_NEKO_BOX) {
|
||||||
|
ui->header_type->setVisible(false);
|
||||||
|
ui->header_type_l->setVisible(false);
|
||||||
|
}
|
||||||
|
// 传输设置 是否可见
|
||||||
|
int networkBoxVisible = 0;
|
||||||
|
for (auto label: ui->network_box->findChildren<QLabel *>()) {
|
||||||
|
if (!label->isHidden()) networkBoxVisible++;
|
||||||
|
}
|
||||||
|
ui->network_box->setVisible(networkBoxVisible);
|
||||||
ADJUST_SIZE
|
ADJUST_SIZE
|
||||||
});
|
});
|
||||||
ui->network->removeItem(0);
|
ui->network->removeItem(0);
|
||||||
@@ -83,6 +96,7 @@ DialogEditProfile::DialogEditProfile(const QString &_type, int profileOrGroupId,
|
|||||||
}
|
}
|
||||||
ADJUST_SIZE
|
ADJUST_SIZE
|
||||||
});
|
});
|
||||||
|
emit ui->security->currentTextChanged(ui->security->currentText());
|
||||||
|
|
||||||
// 确定模式和 ent
|
// 确定模式和 ent
|
||||||
newEnt = _type != "";
|
newEnt = _type != "";
|
||||||
@@ -240,10 +254,8 @@ void DialogEditProfile::typeSelected(const QString &newType) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 设置 for NekoBox
|
||||||
if (IS_NEKO_BOX) {
|
if (IS_NEKO_BOX) {
|
||||||
ui->header_type->hide();
|
|
||||||
ui->header_type_l->hide();
|
|
||||||
//
|
|
||||||
if (type == "vmess" || type == "vless") {
|
if (type == "vmess" || type == "vless") {
|
||||||
ui->packet_encoding->setVisible(true);
|
ui->packet_encoding->setVisible(true);
|
||||||
ui->packet_encoding_l->setVisible(true);
|
ui->packet_encoding_l->setVisible(true);
|
||||||
@@ -267,7 +279,7 @@ void DialogEditProfile::typeSelected(const QString &newType) {
|
|||||||
ui->security->setVisible(false);
|
ui->security->setVisible(false);
|
||||||
ui->security_l->setVisible(false);
|
ui->security_l->setVisible(false);
|
||||||
}
|
}
|
||||||
//
|
// 设置 是否可见
|
||||||
int streamBoxVisible = 0;
|
int streamBoxVisible = 0;
|
||||||
for (auto label: ui->stream_box->findChildren<QLabel *>()) {
|
for (auto label: ui->stream_box->findChildren<QLabel *>()) {
|
||||||
if (!label->isHidden()) streamBoxVisible++;
|
if (!label->isHidden()) streamBoxVisible++;
|
||||||
@@ -275,7 +287,8 @@ void DialogEditProfile::typeSelected(const QString &newType) {
|
|||||||
ui->stream_box->setVisible(streamBoxVisible);
|
ui->stream_box->setVisible(streamBoxVisible);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto rightNoBox = (ui->stream_box->isHidden() && ui->security_box->isHidden() && ui->network_box->isHidden());
|
// 载入 type 之后,有些类型没有右边的设置
|
||||||
|
auto rightNoBox = (ui->stream_box->isHidden() && ui->network_box->isHidden() && ui->security_box->isHidden());
|
||||||
if (rightNoBox && !ui->right_all_w->isHidden()) {
|
if (rightNoBox && !ui->right_all_w->isHidden()) {
|
||||||
ui->right_all_w->setVisible(false);
|
ui->right_all_w->setVisible(false);
|
||||||
}
|
}
|
||||||
@@ -285,7 +298,7 @@ void DialogEditProfile::typeSelected(const QString &newType) {
|
|||||||
|
|
||||||
// 第一次显示
|
// 第一次显示
|
||||||
if (isHidden()) {
|
if (isHidden()) {
|
||||||
show();
|
runOnUiThread([=] { show(); }, this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -240,7 +240,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string notr="true">h2</string>
|
<string notr="true">http</string>
|
||||||
</property>
|
</property>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -314,7 +314,7 @@
|
|||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="path_l">
|
<widget class="QLabel" name="path_l">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string notr="true">http path (ws/h2/伪装http)
|
<string notr="true">http path (ws/http/伪装http)
|
||||||
serviceName (gRPC)
|
serviceName (gRPC)
|
||||||
key (QUIC)</string>
|
key (QUIC)</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -329,7 +329,7 @@ key (QUIC)</string>
|
|||||||
<item row="2" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QLabel" name="host_l">
|
<widget class="QLabel" name="host_l">
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string notr="true">http host (ws/h2/伪装http)
|
<string notr="true">http host (ws/http/伪装http)
|
||||||
security (QUIC)</string>
|
security (QUIC)</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
|
|||||||
Reference in New Issue
Block a user