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  }