74 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package mdns
 | 
						|
 | 
						|
import (
 | 
						|
	"bytes"
 | 
						|
	"compress/zlib"
 | 
						|
	"encoding/hex"
 | 
						|
	"encoding/json"
 | 
						|
	"io/ioutil"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
func encode(txt *mdnsTxt) ([]string, error) {
 | 
						|
	b, err := json.Marshal(txt)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	var buf bytes.Buffer
 | 
						|
	defer buf.Reset()
 | 
						|
 | 
						|
	w := zlib.NewWriter(&buf)
 | 
						|
	if _, err := w.Write(b); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	w.Close()
 | 
						|
 | 
						|
	encoded := hex.EncodeToString(buf.Bytes())
 | 
						|
 | 
						|
	// individual txt limit
 | 
						|
	if len(encoded) <= 255 {
 | 
						|
		return []string{encoded}, nil
 | 
						|
	}
 | 
						|
 | 
						|
	// split encoded string
 | 
						|
	var record []string
 | 
						|
 | 
						|
	for len(encoded) > 255 {
 | 
						|
		record = append(record, encoded[:255])
 | 
						|
		encoded = encoded[255:]
 | 
						|
	}
 | 
						|
 | 
						|
	record = append(record, encoded)
 | 
						|
 | 
						|
	return record, nil
 | 
						|
}
 | 
						|
 | 
						|
func decode(record []string) (*mdnsTxt, error) {
 | 
						|
	encoded := strings.Join(record, "")
 | 
						|
 | 
						|
	hr, err := hex.DecodeString(encoded)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	br := bytes.NewReader(hr)
 | 
						|
	zr, err := zlib.NewReader(br)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	rbuf, err := ioutil.ReadAll(zr)
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	var txt *mdnsTxt
 | 
						|
 | 
						|
	if err := json.Unmarshal(rbuf, &txt); err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return txt, nil
 | 
						|
}
 |