From a2eff483b8967fa15a589f548abe0a53d3af47e3 Mon Sep 17 00:00:00 2001 From: Mike Crute Date: Sun, 31 Dec 2023 12:12:11 -0800 Subject: image/webp: add streaming conversion --- image/webp/client.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'image') diff --git a/image/webp/client.go b/image/webp/client.go index aabf240..5037f7c 100644 --- a/image/webp/client.go +++ b/image/webp/client.go @@ -181,3 +181,36 @@ func (c *WebPConvertClient) ConvertBytes(ctx context.Context, img []byte, qualit return webp, nil } + +// ConvertBytesStreaming takes an image in any format and sends it to +// the conversion server. It returns either an error or the webp encoded +// bytes as a ReadCloser from the input image. The caller must Close the +// returned ReadCloser or it will leak. +func (c *WebPConvertClient) ConvertBytesStreaming(ctx context.Context, img []byte, quality int, lossless, exact bool) (io.ReadCloser, error) { + if c.c == nil { + return nil, fmt.Errorf("WebPConvertClient has not been started") + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, "http://unix/", bytes.NewReader(img)) + if err != nil { + return nil, err + } + req.Header.Add("quality", strconv.Itoa(quality)) + req.Header.Add("lossless", fmt.Sprintf("%t", lossless)) + req.Header.Add("exact", fmt.Sprintf("%t", exact)) + + res, err := c.c.Do(req) + if err != nil { + return nil, err + } + + if res.StatusCode != http.StatusOK { + e, err := io.ReadAll(res.Body) + if err != nil { + return nil, err + } + return nil, fmt.Errorf("WebPConvertClient server error: %s", e) + } + + return res.Body, nil +} -- cgit v1.2.3