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
 | |
| }
 |