From 0df85cc3d9d418d3abc335047c7bd2c8794685fa Mon Sep 17 00:00:00 2001
From: mhsanaei <ho3ein.sanaei@gmail.com>
Date: Mon, 16 Dec 2024 21:21:29 +0100
Subject: [PATCH] XHTTP: server & client

Remove scMinPostsIntervalMs, xmux, noGRPCHeader from the server side and add them to the client side.

Before you could have them on sub json but I decided to remove them.
---
 web/assets/js/model/inbound.js             | 26 --------------------
 web/assets/js/model/outbound.js            | 26 ++++++++++++++++++++
 web/html/xui/form/outbound.html            | 24 +++++++++++++++++++
 web/html/xui/form/stream/stream_xhttp.html | 28 ++--------------------
 4 files changed, 52 insertions(+), 52 deletions(-)

diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index a36b9db2..b728c95e 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -496,19 +496,9 @@ class xHTTPStreamSettings extends XrayCommonClass {
         headers = [],
         scMaxBufferedPosts = 30,
         scMaxEachPostBytes = "1000000",
-        scMinPostsIntervalMs = "30",
         noSSEHeader = false,
         xPaddingBytes = "100-1000",
-        xmux = {
-            maxConcurrency: "16-32",
-            maxConnections: 0,
-            cMaxReuseTimes: "64-128",
-            cMaxLifetimeMs: 0,
-            hMaxRequestTimes: "800-900",
-            hKeepAlivePeriod: 0,
-        },
         mode = MODE_OPTION.AUTO,
-        noGRPCHeader = false
     ) {
         super();
         this.path = path;
@@ -516,12 +506,9 @@ class xHTTPStreamSettings extends XrayCommonClass {
         this.headers = headers;
         this.scMaxBufferedPosts = scMaxBufferedPosts;
         this.scMaxEachPostBytes = scMaxEachPostBytes;
-        this.scMinPostsIntervalMs = scMinPostsIntervalMs;
         this.noSSEHeader = noSSEHeader;
         this.xPaddingBytes = xPaddingBytes;
-        this.xmux = xmux;
         this.mode = mode;
-        this.noGRPCHeader = noGRPCHeader;
     }
 
     addHeader(name, value) {
@@ -539,12 +526,9 @@ class xHTTPStreamSettings extends XrayCommonClass {
             XrayCommonClass.toHeaders(json.headers),
             json.scMaxBufferedPosts,
             json.scMaxEachPostBytes,
-            json.scMinPostsIntervalMs,
             json.noSSEHeader,
             json.xPaddingBytes,
-            json.xmux,
             json.mode,
-            json.noGRPCHeader,
         );
     }
 
@@ -555,19 +539,9 @@ class xHTTPStreamSettings extends XrayCommonClass {
             headers: XrayCommonClass.toV2Headers(this.headers, false),
             scMaxBufferedPosts: this.scMaxBufferedPosts,
             scMaxEachPostBytes: this.scMaxEachPostBytes,
-            scMinPostsIntervalMs: this.scMinPostsIntervalMs,
             noSSEHeader: this.noSSEHeader,
             xPaddingBytes: this.xPaddingBytes,
-            xmux: {
-                maxConcurrency: this.xmux.maxConcurrency,
-                maxConnections: this.xmux.maxConnections,
-                cMaxReuseTimes: this.xmux.cMaxReuseTimes,
-                cMaxLifetimeMs: this.xmux.cMaxLifetimeMs,
-                hMaxRequestTimes: this.xmux.hMaxRequestTimes,
-                hKeepAlivePeriod: this.xmux.hKeepAlivePeriod,
-            },
             mode: this.mode,
-            noGRPCHeader: this.noGRPCHeader,
         };
     }
 }
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index 7a53383c..fae1a879 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -287,11 +287,24 @@ class xHTTPStreamSettings extends CommonClass {
         path = '/',
         host = '',
         mode = '',
+        noGRPCHeader = false,
+        scMinPostsIntervalMs = "30",
+        xmux = {
+            maxConcurrency: "16-32",
+            maxConnections: 0,
+            cMaxReuseTimes: "64-128",
+            cMaxLifetimeMs: 0,
+            hMaxRequestTimes: "800-900",
+            hKeepAlivePeriod: 0,
+        },
     ) {
         super();
         this.path = path;
         this.host = host;
         this.mode = mode;
+        this.noGRPCHeader = noGRPCHeader;
+        this.scMinPostsIntervalMs = scMinPostsIntervalMs;
+        this.xmux = xmux;
     }
 
     static fromJson(json = {}) {
@@ -299,6 +312,9 @@ class xHTTPStreamSettings extends CommonClass {
             json.path,
             json.host,
             json.mode,
+            json.noGRPCHeader,
+            json.scMinPostsIntervalMs,
+            json.xmux
         );
     }
 
@@ -307,6 +323,16 @@ class xHTTPStreamSettings extends CommonClass {
             path: this.path,
             host: this.host,
             mode: this.mode,
+            noGRPCHeader: this.noGRPCHeader,
+            scMinPostsIntervalMs: this.scMinPostsIntervalMs,
+            xmux: {
+                maxConcurrency: this.xmux.maxConcurrency,
+                maxConnections: this.xmux.maxConnections,
+                cMaxReuseTimes: this.xmux.cMaxReuseTimes,
+                cMaxLifetimeMs: this.xmux.cMaxLifetimeMs,
+                hMaxRequestTimes: this.xmux.hMaxRequestTimes,
+                hKeepAlivePeriod: this.xmux.hKeepAlivePeriod,
+            },
         };
     }
 }
diff --git a/web/html/xui/form/outbound.html b/web/html/xui/form/outbound.html
index fb9e6f41..0293ffa8 100644
--- a/web/html/xui/form/outbound.html
+++ b/web/html/xui/form/outbound.html
@@ -377,6 +377,30 @@
               <a-select-option v-for="key in MODE_OPTION" :value="key">[[ key ]]</a-select-option>
             </a-select>
           </a-form-item>
+          <a-form-item label="No gRPC Header" v-if="outbound.stream.xhttp.mode === 'stream-up' || outbound.stream.xhttp.mode === 'stream-one'">
+            <a-switch v-model="outbound.stream.xhttp.noGRPCHeader"></a-switch>
+          </a-form-item>
+          <a-form-item label="Min Upload Interval (Ms)" v-if="outbound.stream.xhttp.mode === 'packet-up'">
+            <a-input v-model.trim="outbound.stream.xhttp.scMinPostsIntervalMs"></a-input>
+          </a-form-item>
+          <a-form-item label="Max Concurrency" v-if="!outbound.stream.xhttp.xmux.maxConnections">
+            <a-input v-model="outbound.stream.xhttp.xmux.maxConcurrency"></a-input>
+          </a-form-item>
+          <a-form-item label="Max Connections" v-if="!outbound.stream.xhttp.xmux.maxConcurrency">
+            <a-input v-model="outbound.stream.xhttp.xmux.maxConnections"></a-input>
+          </a-form-item>
+          <a-form-item label="Max Reuse Times">
+            <a-input v-model="outbound.stream.xhttp.xmux.cMaxReuseTimes"></a-input>
+          </a-form-item>
+          <a-form-item label="Max Lifetime (ms)">
+            <a-input v-model="outbound.stream.xhttp.xmux.cMaxLifetimeMs"></a-input>
+          </a-form-item>
+          <a-form-item label="Max Request Times">
+            <a-input v-model="outbound.stream.xhttp.xmux.hMaxRequestTimes"></a-input>
+          </a-form-item>
+          <a-form-item label='Keep Alive Period'>
+            <a-input v-model.number="outbound.stream.xhttp.xmux.hKeepAlivePeriod"></a-input>
+          </a-form-item>
         </template>
       </template>
 
diff --git a/web/html/xui/form/stream/stream_xhttp.html b/web/html/xui/form/stream/stream_xhttp.html
index 1dd3c15c..749bfcee 100644
--- a/web/html/xui/form/stream/stream_xhttp.html
+++ b/web/html/xui/form/stream/stream_xhttp.html
@@ -27,41 +27,17 @@
             <a-select-option v-for="key in MODE_OPTION" :value="key">[[ key ]]</a-select-option>
         </a-select>
     </a-form-item>
-    <a-form-item label="Max Buffered Upload">
+    <a-form-item label="Max Buffered Upload" v-if="inbound.stream.xhttp.mode === 'packet-up'">
         <a-input v-model.trim="inbound.stream.xhttp.scMaxBufferedPosts"></a-input>
     </a-form-item>
-    <a-form-item label="Max Upload Size (Byte)">
+    <a-form-item label="Max Upload Size (Byte)" v-if="inbound.stream.xhttp.mode === 'packet-up'">
         <a-input v-model.trim="inbound.stream.xhttp.scMaxEachPostBytes"></a-input>
     </a-form-item>
-    <a-form-item label="Min Upload Interval (Ms)">
-        <a-input v-model.trim="inbound.stream.xhttp.scMinPostsIntervalMs"></a-input>
-    </a-form-item>
     <a-form-item label="Padding Bytes">
         <a-input v-model.trim="inbound.stream.xhttp.xPaddingBytes"></a-input>
     </a-form-item>
     <a-form-item label="No SSE Header">
         <a-switch v-model="inbound.stream.xhttp.noSSEHeader"></a-switch>
     </a-form-item>
-    <a-form-item label="Max Concurrency" v-if="!inbound.stream.xhttp.xmux.maxConnections">
-        <a-input v-model="inbound.stream.xhttp.xmux.maxConcurrency"></a-input>
-    </a-form-item>
-    <a-form-item label="Max Connections" v-if="!inbound.stream.xhttp.xmux.maxConcurrency">
-        <a-input v-model="inbound.stream.xhttp.xmux.maxConnections"></a-input>
-    </a-form-item>
-    <a-form-item label="Max Reuse Times">
-        <a-input v-model="inbound.stream.xhttp.xmux.cMaxReuseTimes"></a-input>
-    </a-form-item>
-    <a-form-item label="Max Lifetime (ms)">
-        <a-input v-model="inbound.stream.xhttp.xmux.cMaxLifetimeMs"></a-input>
-    </a-form-item>
-    <a-form-item label="Max Request Times">
-        <a-input v-model="inbound.stream.xhttp.xmux.hMaxRequestTimes"></a-input>
-    </a-form-item>
-    <a-form-item label='Keep Alive Period'>
-        <a-input v-model.number="inbound.stream.xhttp.xmux.hKeepAlivePeriod"></a-input>
-    </a-form-item>
-    <a-form-item label="No gRPC Header">
-        <a-switch v-model="inbound.stream.xhttp.noGRPCHeader"></a-switch>
-    </a-form-item>
 </a-form>
 {{end}}
\ No newline at end of file