|
|
@@ -0,0 +1,44 @@
|
|
|
+package dataurlsingle
|
|
|
+
|
|
|
+import (
|
|
|
+ "bytes"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ "github.com/vincent-petithory/dataurl"
|
|
|
+
|
|
|
+ "github.com/v2fly/v2ray-core/v5/app/subscription/containers"
|
|
|
+ "github.com/v2fly/v2ray-core/v5/common"
|
|
|
+)
|
|
|
+
|
|
|
+//go:generate go run github.com/v2fly/v2ray-core/v5/common/errors/errorgen
|
|
|
+
|
|
|
+func newSingularDataURLParser() containers.SubscriptionContainerDocumentParser {
|
|
|
+ return &parser{}
|
|
|
+}
|
|
|
+
|
|
|
+type parser struct{}
|
|
|
+
|
|
|
+func (p parser) ParseSubscriptionContainerDocument(rawConfig []byte) (*containers.Container, error) {
|
|
|
+ dataURL, err := dataurl.Decode(bytes.NewReader(rawConfig))
|
|
|
+ if err != nil {
|
|
|
+ return nil, newError("unable to decode dataURL").Base(err)
|
|
|
+ }
|
|
|
+ if dataURL.MediaType.Type != "application" {
|
|
|
+ return nil, newError("unsupported media type: ", dataURL.MediaType.Type)
|
|
|
+ }
|
|
|
+ if !strings.HasPrefix(dataURL.MediaType.Subtype, "vnd.v2ray.subscription-singular") {
|
|
|
+ return nil, newError("unsupported media subtype: ", dataURL.MediaType.Subtype)
|
|
|
+ }
|
|
|
+ result := &containers.Container{}
|
|
|
+ result.Kind = "DataURLSingle"
|
|
|
+ result.Metadata = make(map[string]string)
|
|
|
+ result.ServerSpecs = append(result.ServerSpecs, containers.UnparsedServerConf{
|
|
|
+ KindHint: "",
|
|
|
+ Content: dataURL.Data,
|
|
|
+ })
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+func init() {
|
|
|
+ common.Must(containers.RegisterParser("DataURLSingle", newSingularDataURLParser()))
|
|
|
+}
|