mirror of
https://github.com/SagerNet/sing-box.git
synced 2025-04-04 20:37:37 +03:00
56 lines
1.7 KiB
Go
56 lines
1.7 KiB
Go
package jsc
|
|
|
|
import (
|
|
"net/http"
|
|
"reflect"
|
|
|
|
"github.com/sagernet/sing/common"
|
|
F "github.com/sagernet/sing/common/format"
|
|
|
|
"github.com/dop251/goja"
|
|
)
|
|
|
|
func HeadersToValue(runtime *goja.Runtime, headers http.Header) goja.Value {
|
|
object := runtime.NewObject()
|
|
for key, value := range headers {
|
|
if len(value) == 1 {
|
|
object.Set(key, value[0])
|
|
} else {
|
|
object.Set(key, ArrayToValue(runtime, value))
|
|
}
|
|
}
|
|
return object
|
|
}
|
|
|
|
func ArrayToValue[T any](runtime *goja.Runtime, values []T) goja.Value {
|
|
return runtime.NewArray(common.Map(values, func(it T) any { return it })...)
|
|
}
|
|
|
|
func ObjectToHeaders(vm *goja.Runtime, object *goja.Object, name string) http.Header {
|
|
headers := make(http.Header)
|
|
for _, key := range object.Keys() {
|
|
valueObject := object.Get(key)
|
|
switch headerValue := valueObject.(type) {
|
|
case goja.String:
|
|
headers.Set(key, headerValue.String())
|
|
case *goja.Object:
|
|
values := headerValue.Export()
|
|
valueArray, isArray := values.([]any)
|
|
if !isArray {
|
|
panic(vm.NewTypeError(F.ToString("invalid value: ", name, ".", key, "expected string or string array, got ", valueObject.String())))
|
|
}
|
|
newValues := make([]string, 0, len(valueArray))
|
|
for _, value := range valueArray {
|
|
stringValue, isString := value.(string)
|
|
if !isString {
|
|
panic(vm.NewTypeError(F.ToString("invalid value: ", name, ".", key, " expected string or string array, got array item type: ", reflect.TypeOf(value))))
|
|
}
|
|
newValues = append(newValues, stringValue)
|
|
}
|
|
headers[key] = newValues
|
|
default:
|
|
panic(vm.NewTypeError(F.ToString("invalid value: ", name, ".", key, " expected string or string array, got ", valueObject.String())))
|
|
}
|
|
}
|
|
return headers
|
|
}
|