diff options
| author | Shulhan <ms@kilabit.info> | 2021-12-19 01:33:12 +0700 |
|---|---|---|
| committer | Shulhan <ms@kilabit.info> | 2021-12-19 02:13:57 +0700 |
| commit | ba9c2ea6bd2a3c39f20fe7b2cc702e7fd4c99c44 (patch) | |
| tree | b7f3db4fd854c186ed15da8dff7c8e8961b5ecc5 /lib | |
| parent | 9b8841034d7f4b6f92078f6dc682bd010fb37e72 (diff) | |
| download | pakakeh.go-ba9c2ea6bd2a3c39f20fe7b2cc702e7fd4c99c44.tar.xz | |
lib/memfs: remove field ContentEncoding from EmbedOptions and Node
The original idea for option ContentEncoding in EmbedOptions and Node
is to save spaces, compressing the content on disk on embedding and
doing transport, when the MemFS instance is used to serve the (embedded)
contents of file system.
This option turns out break the HTTP content negotiation [1] of
accept-encoding header, if the HTTP server does not handle it properly,
which default Go HTTP server does not.
In order to prevent this issue in the future, for anyone who use the
memfs for serving static HTTP contents, we remove the options and store
the embedded content as is and let the HTTP server handle how the
compression by itself.
[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Content_negotiation
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/http/server.go | 4 | ||||
| -rw-r--r-- | lib/memfs/doc.go | 1 | ||||
| -rw-r--r-- | lib/memfs/embed.go | 7 | ||||
| -rw-r--r-- | lib/memfs/embed_options.go | 9 | ||||
| -rw-r--r-- | lib/memfs/internal/test/embed/embed_test.go | 17 | ||||
| -rw-r--r-- | lib/memfs/internal/test/embed_disable_modtime/embed_test.go | 17 | ||||
| -rw-r--r-- | lib/memfs/memfs.go | 76 | ||||
| -rw-r--r-- | lib/memfs/node.go | 92 | ||||
| -rw-r--r-- | lib/memfs/node_test.go | 14 | ||||
| -rw-r--r-- | lib/memfs/template.go | 1 |
10 files changed, 10 insertions, 228 deletions
diff --git a/lib/http/server.go b/lib/http/server.go index bccc098e..a3c4e474 100644 --- a/lib/http/server.go +++ b/lib/http/server.go @@ -494,10 +494,6 @@ func (srv *Server) HandleFS(res http.ResponseWriter, req *http.Request) { res.Header().Set(HeaderContentType, node.ContentType) - if len(node.ContentEncoding) > 0 { - res.Header().Set(HeaderContentEncoding, node.ContentEncoding) - } - responseETag := strconv.FormatInt(node.ModTime().Unix(), 10) requestETag := req.Header.Get(HeaderIfNoneMatch) if requestETag == responseETag { diff --git a/lib/memfs/doc.go b/lib/memfs/doc.go index da62aed2..56aa1083 100644 --- a/lib/memfs/doc.go +++ b/lib/memfs/doc.go @@ -80,7 +80,6 @@ // PackageName: "mypackage", // VarName: "myFS", // GoFileName: "mypackage/embed.go", -// ContentEncoding: memfs.EncodingGzip, // }, // } // mfs, _ := memfs.New(opts) diff --git a/lib/memfs/embed.go b/lib/memfs/embed.go index 7cadcc47..6712fdad 100644 --- a/lib/memfs/embed.go +++ b/lib/memfs/embed.go @@ -52,13 +52,6 @@ func (mfs *MemFS) GoEmbed() (err error) { return fmt.Errorf("%s: %w", logp, err) } - if len(mfs.Opts.Embed.ContentEncoding) > 0 { - err = mfs.ContentEncode(mfs.Opts.Embed.ContentEncoding) - if err != nil { - return fmt.Errorf("%s: %w", logp, err) - } - } - names := mfs.ListNames() err = tmpl.ExecuteTemplate(f, templateNameHeader, mfs.Opts.Embed.PackageName) diff --git a/lib/memfs/embed_options.go b/lib/memfs/embed_options.go index 67d45f57..b1522276 100644 --- a/lib/memfs/embed_options.go +++ b/lib/memfs/embed_options.go @@ -21,15 +21,6 @@ type EmbedOptions struct { // in current directory from where its called. GoFileName string - // ContentEncoding if this value is not empty, it will encode the - // content of node and set the node ContentEncoding. - // - // List of available encoding is "gzip". - // - // For example, if the value is "gzip" it will compress the content of - // file using gzip and set Node.ContentEncoding to "gzip". - ContentEncoding string - // WithoutModTime if its true, the modification time for all // files and directories are not stored inside generated code, instead // all files will use the current time when the program is running. diff --git a/lib/memfs/internal/test/embed/embed_test.go b/lib/memfs/internal/test/embed/embed_test.go index d66da751..27be6ba7 100644 --- a/lib/memfs/internal/test/embed/embed_test.go +++ b/lib/memfs/internal/test/embed/embed_test.go @@ -11,7 +11,6 @@ func generate_testdata() *memfs.Node { SysPath: "testdata", Path: "/", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetModTimeUnix(1633772772, 881353676) @@ -32,7 +31,6 @@ func generate_testdata_direct() *memfs.Node { SysPath: "testdata/direct", Path: "/direct", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetModTimeUnix(1569586540, 0) @@ -47,7 +45,6 @@ func generate_testdata_direct_add() *memfs.Node { SysPath: "testdata/direct/add", Path: "/direct/add", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetModTimeUnix(1569586540, 0) @@ -63,7 +60,6 @@ func generate_testdata_direct_add_file() *memfs.Node { SysPath: "testdata/direct/add/file", Path: "/direct/add/file", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x65\x73\x74\x20\x64\x69\x72\x65\x63\x74\x20\x61\x64\x64\x20\x66\x69\x6C\x65\x2E\x0A"), } node.SetMode(420) @@ -78,7 +74,6 @@ func generate_testdata_direct_add_file2() *memfs.Node { SysPath: "testdata/direct/add/file2", Path: "/direct/add/file2", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x65\x73\x74\x20\x64\x69\x72\x65\x63\x74\x20\x61\x64\x64\x20\x66\x69\x6C\x65\x20\x32\x2E\x0A"), } node.SetMode(420) @@ -93,7 +88,6 @@ func generate_testdata_exclude() *memfs.Node { SysPath: "testdata/exclude", Path: "/exclude", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetModTimeUnix(1633792794, 467899662) @@ -110,7 +104,6 @@ func generate_testdata_exclude_index_link_css() *memfs.Node { SysPath: "testdata/exclude/index-link.css", Path: "/exclude/index-link.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -125,7 +118,6 @@ func generate_testdata_exclude_index_link_html() *memfs.Node { SysPath: "testdata/exclude/index-link.html", Path: "/exclude/index-link.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -140,7 +132,6 @@ func generate_testdata_exclude_index_link_js() *memfs.Node { SysPath: "testdata/exclude/index-link.js", Path: "/exclude/index-link.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -155,7 +146,6 @@ func generate_testdata_include() *memfs.Node { SysPath: "testdata/include", Path: "/include", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetModTimeUnix(1629623653, 749800911) @@ -172,7 +162,6 @@ func generate_testdata_include_index_css() *memfs.Node { SysPath: "testdata/include/index.css", Path: "/include/index.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -187,7 +176,6 @@ func generate_testdata_include_index_html() *memfs.Node { SysPath: "testdata/include/index.html", Path: "/include/index.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -202,7 +190,6 @@ func generate_testdata_include_index_js() *memfs.Node { SysPath: "testdata/include/index.js", Path: "/include/index.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -217,7 +204,6 @@ func generate_testdata_index_css() *memfs.Node { SysPath: "testdata/index.css", Path: "/index.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -232,7 +218,6 @@ func generate_testdata_index_html() *memfs.Node { SysPath: "testdata/index.html", Path: "/index.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -247,7 +232,6 @@ func generate_testdata_index_js() *memfs.Node { SysPath: "testdata/index.js", Path: "/index.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -262,7 +246,6 @@ func generate_testdata_plain() *memfs.Node { SysPath: "testdata/plain", Path: "/plain", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x70\x6C\x61\x69\x6E\x20\x74\x65\x78\x74\x2E\x0A"), } node.SetMode(420) diff --git a/lib/memfs/internal/test/embed_disable_modtime/embed_test.go b/lib/memfs/internal/test/embed_disable_modtime/embed_test.go index 30ea9192..42d177dd 100644 --- a/lib/memfs/internal/test/embed_disable_modtime/embed_test.go +++ b/lib/memfs/internal/test/embed_disable_modtime/embed_test.go @@ -11,7 +11,6 @@ func generate_testdata() *memfs.Node { SysPath: "testdata", Path: "/", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetName("/") @@ -31,7 +30,6 @@ func generate_testdata_direct() *memfs.Node { SysPath: "testdata/direct", Path: "/direct", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetName("direct") @@ -45,7 +43,6 @@ func generate_testdata_direct_add() *memfs.Node { SysPath: "testdata/direct/add", Path: "/direct/add", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetName("add") @@ -60,7 +57,6 @@ func generate_testdata_direct_add_file() *memfs.Node { SysPath: "testdata/direct/add/file", Path: "/direct/add/file", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x65\x73\x74\x20\x64\x69\x72\x65\x63\x74\x20\x61\x64\x64\x20\x66\x69\x6C\x65\x2E\x0A"), } node.SetMode(420) @@ -74,7 +70,6 @@ func generate_testdata_direct_add_file2() *memfs.Node { SysPath: "testdata/direct/add/file2", Path: "/direct/add/file2", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x65\x73\x74\x20\x64\x69\x72\x65\x63\x74\x20\x61\x64\x64\x20\x66\x69\x6C\x65\x20\x32\x2E\x0A"), } node.SetMode(420) @@ -88,7 +83,6 @@ func generate_testdata_exclude() *memfs.Node { SysPath: "testdata/exclude", Path: "/exclude", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetName("exclude") @@ -104,7 +98,6 @@ func generate_testdata_exclude_index_link_css() *memfs.Node { SysPath: "testdata/exclude/index-link.css", Path: "/exclude/index-link.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -118,7 +111,6 @@ func generate_testdata_exclude_index_link_html() *memfs.Node { SysPath: "testdata/exclude/index-link.html", Path: "/exclude/index-link.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -132,7 +124,6 @@ func generate_testdata_exclude_index_link_js() *memfs.Node { SysPath: "testdata/exclude/index-link.js", Path: "/exclude/index-link.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -146,7 +137,6 @@ func generate_testdata_include() *memfs.Node { SysPath: "testdata/include", Path: "/include", ContentType: "", - ContentEncoding: "", } node.SetMode(2147484141) node.SetName("include") @@ -162,7 +152,6 @@ func generate_testdata_include_index_css() *memfs.Node { SysPath: "testdata/include/index.css", Path: "/include/index.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -176,7 +165,6 @@ func generate_testdata_include_index_html() *memfs.Node { SysPath: "testdata/include/index.html", Path: "/include/index.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -190,7 +178,6 @@ func generate_testdata_include_index_js() *memfs.Node { SysPath: "testdata/include/index.js", Path: "/include/index.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -204,7 +191,6 @@ func generate_testdata_index_css() *memfs.Node { SysPath: "testdata/index.css", Path: "/index.css", ContentType: "text/css; charset=utf-8", - ContentEncoding: "", Content: []byte("\x62\x6F\x64\x79\x20\x7B\x0A\x7D\x0A"), } node.SetMode(420) @@ -218,7 +204,6 @@ func generate_testdata_index_html() *memfs.Node { SysPath: "testdata/index.html", Path: "/index.html", ContentType: "text/html; charset=utf-8", - ContentEncoding: "", Content: []byte("\x3C\x68\x74\x6D\x6C\x3E\x3C\x2F\x68\x74\x6D\x6C\x3E\x0A"), } node.SetMode(420) @@ -232,7 +217,6 @@ func generate_testdata_index_js() *memfs.Node { SysPath: "testdata/index.js", Path: "/index.js", ContentType: "text/javascript; charset=utf-8", - ContentEncoding: "", Content: []byte("\x66\x75\x6E\x63\x74\x69\x6F\x6E\x20\x58\x28\x29\x20\x7B\x7D\x0A"), } node.SetMode(420) @@ -246,7 +230,6 @@ func generate_testdata_plain() *memfs.Node { SysPath: "testdata/plain", Path: "/plain", ContentType: "text/plain; charset=utf-8", - ContentEncoding: "", Content: []byte("\x54\x68\x69\x73\x20\x69\x73\x20\x61\x20\x70\x6C\x61\x69\x6E\x20\x74\x65\x78\x74\x2E\x0A"), } node.SetMode(420) diff --git a/lib/memfs/memfs.go b/lib/memfs/memfs.go index fe924439..e1841dae 100644 --- a/lib/memfs/memfs.go +++ b/lib/memfs/memfs.go @@ -6,9 +6,7 @@ package memfs import ( "bytes" - "compress/gzip" "fmt" - "io" "log" "net/http" "os" @@ -24,12 +22,7 @@ import ( libstrings "github.com/shuLhan/share/lib/strings" ) -// -// List of valid content encoding for ContentEncode(). -// const ( - EncodingGzip = "gzip" - defContentType = "text/plain" // Default content type for empty file. ) @@ -231,64 +224,6 @@ func (mfs *MemFS) AddFile(internalPath, externalPath string) (node *Node, err er } // -// ContentEncode encode each node's content into specific encoding, in other -// words this method can be used to compress the content of file in memory -// or before being served or written. -// -// Only file with size greater than 0 will be encoded. -// -// List of known encoding is "gzip". -// -func (mfs *MemFS) ContentEncode(encoding string) (err error) { - var ( - logp = "ContentEncode" - buf bytes.Buffer - encoder io.WriteCloser - ) - - encoding = strings.ToLower(encoding) - - switch encoding { - case EncodingGzip: - encoder = gzip.NewWriter(&buf) - default: - return fmt.Errorf("%s: invalid encoding %q", logp, encoding) - } - - nodes := mfs.PathNodes.Nodes() - for _, node := range nodes { - if node.mode.IsDir() || len(node.Content) == 0 { - continue - } - - _, err = encoder.Write(node.Content) - if err != nil { - return fmt.Errorf("%s: %w", logp, err) - } - - err = encoder.Close() - if err != nil { - return fmt.Errorf("%s: %w", logp, err) - } - - node.Content = make([]byte, buf.Len()) - copy(node.Content, buf.Bytes()) - - node.ContentEncoding = encoding - node.size = int64(len(node.Content)) - - buf.Reset() - - if encoding == EncodingGzip { - gziper := encoder.(*gzip.Writer) - gziper.Reset(&buf) - } - } - - return nil -} - -// // Get the node representation of file in memory. If path is not exist it // will return os.ErrNotExist. // @@ -376,11 +311,6 @@ func (mfs *MemFS) Search(words []string, snippetLen int) (results []SearchResult snippetLen = 60 } - var ( - logp = "Search" - err error - ) - tokens := libstrings.ToBytes(words) for x := 0; x < len(tokens); x++ { tokens[x] = bytes.ToLower(tokens[x]) @@ -397,11 +327,7 @@ func (mfs *MemFS) Search(words []string, snippetLen int) (results []SearchResult } if len(node.lowerv) == 0 { - _, err = node.Decode() - if err != nil { - log.Printf("%s: %s", logp, err) - continue - } + node.plainv = node.Content if strings.HasPrefix(node.ContentType, "text/html") { node.plainv = sanitize.HTML(node.plainv) diff --git a/lib/memfs/node.go b/lib/memfs/node.go index f134f814..4311102d 100644 --- a/lib/memfs/node.go +++ b/lib/memfs/node.go @@ -6,7 +6,6 @@ package memfs import ( "bytes" - "compress/gzip" "encoding/base64" "errors" "fmt" @@ -35,14 +34,13 @@ type Node struct { os.FileInfo http.File - SysPath string // The original file path in system. - Path string // Absolute file path in memory. - Content []byte // Content of file. - ContentType string // File type per MIME, for example "application/json". - ContentEncoding string // File type encoding, for example "gzip". - Parent *Node // Pointer to parent directory. - Childs []*Node // List of files in directory. - GenFuncName string // The function name for embedded Go code. + SysPath string // The original file path in system. + Path string // Absolute file path in memory. + Content []byte // Content of file. + ContentType string // File type per MIME, for example "application/json". + Parent *Node // Pointer to parent directory. + Childs []*Node // List of files in directory. + GenFuncName string // The function name for embedded Go code. name string // File name. modTime time.Time // ModTime contains file modification time. @@ -145,77 +143,6 @@ func (node *Node) Close() error { return nil } -// -// Decode the contents of node (for example, uncompress with gzip) and return -// it. -// -func (node *Node) Decode() ([]byte, error) { - if len(node.ContentEncoding) == 0 { - node.plainv = node.Content - return node.plainv, nil - } - - logp := "Decode" - node.plainv = node.plainv[:0] - - if node.ContentEncoding == EncodingGzip { - r, err := gzip.NewReader(bytes.NewReader(node.Content)) - if err != nil { - return nil, fmt.Errorf("%s: %w", logp, err) - } - - buf := make([]byte, 1024) - for { - n, err := r.Read(buf) - if n > 0 { - node.plainv = append(node.plainv, buf[:n]...) - } - if err != nil { - if err == io.EOF { - break - } - return nil, fmt.Errorf("%s: %w", logp, err) - } - buf = buf[0:] - } - } - - return node.plainv, nil -} - -// -// Encode compress and set the content of Node. -// -func (node *Node) Encode(content []byte) (err error) { - logp := "Encode" - - node.plainv = content - node.lowerv = bytes.ToLower(content) - - switch node.ContentEncoding { - case EncodingGzip: - var buf bytes.Buffer - gz := gzip.NewWriter(&buf) - - _, err = gz.Write(content) - if err != nil { - _ = gz.Close() - return fmt.Errorf("%s: %w", logp, err) - } - - err = gz.Close() - if err != nil { - return fmt.Errorf("%s: %w", logp, err) - } - - node.Content = libbytes.Copy(buf.Bytes()) - - default: - node.Content = content - } - return nil -} - func (node *Node) IsDir() bool { return node.mode.IsDir() } @@ -319,11 +246,8 @@ func (node *Node) Save(content []byte) (err error) { if err != nil { return fmt.Errorf("%s: %w", logp, err) } - err = node.Encode(content) - if err != nil { - return fmt.Errorf("%s: %w", logp, err) - } + node.Content = content node.modTime = time.Now() node.size = int64(len(content)) return nil diff --git a/lib/memfs/node_test.go b/lib/memfs/node_test.go index 271bcbaa..0a625d03 100644 --- a/lib/memfs/node_test.go +++ b/lib/memfs/node_test.go @@ -148,24 +148,12 @@ func TestNode_Save(t *testing.T) { contentEncoding string expContent []byte }{{ - desc: "Without content encoding", + desc: "With non empty content", content: []byte("ABC"), expContent: []byte("ABC"), - }, { - desc: "With content encoding is gzip", - contentEncoding: EncodingGzip, - content: []byte("ABC"), - expContent: []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xff, 0x72, 0x74, 0x72, 0x06, 0x04, 0x00, - 0x00, 0xff, 0xff, 0x48, 0x03, 0x83, 0xa3, 0x03, - 0x00, 0x00, 0x00, - }, }} for _, c := range cases { - node.ContentEncoding = c.contentEncoding - err = node.Save(c.content) if err != nil { t.Fatal(err) diff --git a/lib/memfs/template.go b/lib/memfs/template.go index 35bf8ac4..4751408e 100644 --- a/lib/memfs/template.go +++ b/lib/memfs/template.go @@ -55,7 +55,6 @@ func {{ .Node.GenFuncName}}() *memfs.Node { SysPath: "{{.Node.SysPath}}", Path: "{{.Node.Path}}", ContentType: "{{.Node.ContentType}}", - ContentEncoding: "{{.Node.ContentEncoding}}", {{- if .Node.Content }} Content: []byte("{{range $x, $c := .Node.Content}}{{ printf "\\x%02X" $c }}{{end}}"), {{- end }} |
