github.com/v2fly/v2ray-core/v5@v5.16.2-0.20240507031116-8191faa6e095/app/subscription/containers/base64urlline/parser.go (about) 1 package base64urlline 2 3 import ( 4 "bufio" 5 "bytes" 6 "encoding/base64" 7 "io" 8 9 "github.com/v2fly/v2ray-core/v5/app/subscription/containers" 10 "github.com/v2fly/v2ray-core/v5/common" 11 ) 12 13 func newBase64URLLineParser() containers.SubscriptionContainerDocumentParser { 14 return &parser{} 15 } 16 17 type parser struct{} 18 19 func (p parser) ParseSubscriptionContainerDocument(rawConfig []byte) (*containers.Container, error) { 20 result := &containers.Container{} 21 result.Kind = "Base64URLLine" 22 result.Metadata = make(map[string]string) 23 24 bodyDecoder := base64.NewDecoder(base64.StdEncoding, bytes.NewReader(rawConfig)) 25 decoded, err := io.ReadAll(bodyDecoder) 26 if err != nil { 27 return nil, newError("failed to decode base64url body base64").Base(err) 28 } 29 scanner := bufio.NewScanner(bytes.NewReader(decoded)) 30 31 const maxCapacity int = 1024 * 256 32 buf := make([]byte, maxCapacity) 33 scanner.Buffer(buf, maxCapacity) 34 35 for scanner.Scan() { 36 result.ServerSpecs = append(result.ServerSpecs, containers.UnparsedServerConf{ 37 KindHint: "URL", 38 Content: scanner.Bytes(), 39 }) 40 } 41 return result, nil 42 } 43 44 func init() { 45 common.Must(containers.RegisterParser("Base64URLLine", newBase64URLLineParser())) 46 }