newCompressedFSFileCache use memory cache compressed files.
(f fs.File, fileInfo fs.FileInfo, filePath, fileEncoding string)
| 1765 | |
| 1766 | // newCompressedFSFileCache use memory cache compressed files. |
| 1767 | func (h *fsHandler) newCompressedFSFileCache(f fs.File, fileInfo fs.FileInfo, filePath, fileEncoding string) (*fsFile, error) { |
| 1768 | var ( |
| 1769 | w = &bytebufferpool.ByteBuffer{} |
| 1770 | err error |
| 1771 | ) |
| 1772 | |
| 1773 | switch fileEncoding { |
| 1774 | case "br": |
| 1775 | zw := acquireStacklessBrotliWriter(w, CompressDefaultCompression) |
| 1776 | _, err = copyZeroAlloc(zw, f) |
| 1777 | if errf := zw.Flush(); err == nil { |
| 1778 | err = errf |
| 1779 | } |
| 1780 | releaseStacklessBrotliWriter(zw, CompressDefaultCompression) |
| 1781 | case "gzip": |
| 1782 | zw := acquireStacklessGzipWriter(w, CompressDefaultCompression) |
| 1783 | _, err = copyZeroAlloc(zw, f) |
| 1784 | if errf := zw.Flush(); err == nil { |
| 1785 | err = errf |
| 1786 | } |
| 1787 | releaseStacklessGzipWriter(zw, CompressDefaultCompression) |
| 1788 | case "zstd": |
| 1789 | zw := acquireStacklessZstdWriter(w, CompressZstdDefault) |
| 1790 | _, err = copyZeroAlloc(zw, f) |
| 1791 | if errf := zw.Flush(); err == nil { |
| 1792 | err = errf |
| 1793 | } |
| 1794 | releaseStacklessZstdWriter(zw, CompressZstdDefault) |
| 1795 | } |
| 1796 | defer func() { _ = f.Close() }() |
| 1797 | |
| 1798 | if err != nil { |
| 1799 | return nil, fmt.Errorf("error when compressing file %q: %w", filePath, err) |
| 1800 | } |
| 1801 | |
| 1802 | seeker, ok := f.(io.Seeker) |
| 1803 | if !ok { |
| 1804 | return nil, errors.New("not implemented io.Seeker") |
| 1805 | } |
| 1806 | if _, err = seeker.Seek(0, io.SeekStart); err != nil { |
| 1807 | return nil, err |
| 1808 | } |
| 1809 | |
| 1810 | ext := fileExtension(fileInfo.Name(), false, h.compressedFileSuffixes[fileEncoding]) |
| 1811 | contentType := mime.TypeByExtension(ext) |
| 1812 | if contentType == "" { |
| 1813 | data, err := readFileHeader(f, false, fileEncoding) |
| 1814 | if err != nil { |
| 1815 | return nil, fmt.Errorf("cannot read header of the file %q: %w", fileInfo.Name(), err) |
| 1816 | } |
| 1817 | contentType = http.DetectContentType(data) |
| 1818 | } |
| 1819 | |
| 1820 | dirIndex := w.B |
| 1821 | lastModified := fileInfo.ModTime() |
| 1822 | ff := &fsFile{ |
| 1823 | h: h, |
| 1824 | dirIndex: dirIndex, |
no test coverage detected