mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-04-16 12:35:54 +00:00
1. **Fixed XPadding Placement Dropdown**: - Added the missing `cookie` and `query` options to `xPaddingPlacement` (`stream_xhttp.html`). - *Why:* Previously, users wanting `cookie` obfuscation were forced to use the `header` placement string. This caused Xray-core to blindly intercept the entire monolithic HTTP Cookie header, failing internal padding-length validations and causing the inbound to silently drop the connection. 2. **Fixed Uplink Data Placement Validation**: - Replaced the unsupported `query` option with `cookie` in `uplinkDataPlacement`. - *Why:* Xray-core's `transport_internet.go` explicitly forbids `query` as an uplink placement option. Selecting it from the UI previously sent a payload that would cause Xray-core to instantly throw an `unsupported uplink data placement: query` panic. Adding `cookie` perfectly aligns the UI with Xray-core restrictions. ### Related Issues - Resolves #3992
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package log
|
|
|
|
import (
|
|
"net"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type DNSLog struct {
|
|
Server string
|
|
Domain string
|
|
Result []net.IP
|
|
Status dnsStatus
|
|
Elapsed time.Duration
|
|
Error error
|
|
}
|
|
|
|
func (l *DNSLog) String() string {
|
|
builder := &strings.Builder{}
|
|
|
|
// Server got answer: domain -> [ip1, ip2] 23ms
|
|
builder.WriteString(l.Server)
|
|
builder.WriteString(" ")
|
|
builder.WriteString(string(l.Status))
|
|
builder.WriteString(" ")
|
|
builder.WriteString(l.Domain)
|
|
builder.WriteString(" -> [")
|
|
builder.WriteString(joinNetIP(l.Result))
|
|
builder.WriteString("]")
|
|
|
|
if l.Elapsed > 0 {
|
|
builder.WriteString(" ")
|
|
builder.WriteString(l.Elapsed.String())
|
|
}
|
|
if l.Error != nil {
|
|
builder.WriteString(" <")
|
|
builder.WriteString(l.Error.Error())
|
|
builder.WriteString(">")
|
|
}
|
|
return builder.String()
|
|
}
|
|
|
|
type dnsStatus string
|
|
|
|
var (
|
|
DNSQueried = dnsStatus("got answer:")
|
|
DNSCacheHit = dnsStatus("cache HIT:")
|
|
DNSCacheOptimiste = dnsStatus("cache OPTIMISTE:")
|
|
)
|
|
|
|
func joinNetIP(ips []net.IP) string {
|
|
if len(ips) == 0 {
|
|
return ""
|
|
}
|
|
sips := make([]string, 0, len(ips))
|
|
for _, ip := range ips {
|
|
sips = append(sips, ip.String())
|
|
}
|
|
return strings.Join(sips, ", ")
|
|
}
|