9 "go.mau.fi/whatsmeow/proto/waE2E"
12 // whatsappImage downloads only supported images and stores them before the
13 // event can be acknowledged. Both the declared size and the downloaded bytes
14 // must fit the image store. Decoded bytes determine the stored format.
15 func whatsappImage(ctx context.Context, client WhatsAppClient, store *ImageStore, message *waE2E.ImageMessage) (string, error) {
16 if message.GetFileLength() > imageMaxBytes {
17 return "", errImageSize
20 switch message.GetMimetype() {
21 case "image/jpeg", "image/png", "image/webp":
23 return "", errImageFormat
27 return "", errors.New("WhatsApp client is not available")
30 data, err := client.Download(ctx, message)
32 return "", fmt.Errorf("download image: %w", whatsappImageDownloadError(err))
35 name, err := store.Save(data)
37 return "", fmt.Errorf("store image: %w", err)
43 // whatsappImageDownloadError keeps only known safe causes. Library errors can
44 // contain signed URLs or direct paths even when request preparation fails, so
45 // arbitrary error text cannot go to the daemon log.
46 func whatsappImageDownloadError(err error) error {
48 case errors.Is(err, context.Canceled):
49 return context.Canceled
50 case errors.Is(err, context.DeadlineExceeded):
51 return context.DeadlineExceeded
54 var response whatsmeow.DownloadHTTPError
56 if errors.As(err, &response) && response.Response != nil {
57 return fmt.Errorf("media server returned HTTP %d", response.StatusCode)
60 return errors.New("media download failed")