10 "go.mau.fi/whatsmeow/proto/waE2E"
13 // whatsappImageTime is the longest time of an image download.
14 const whatsappImageTime = 2 * time.Minute
16 // whatsappImage downloads only supported images and stores them before the
17 // event can be acknowledged. Both the declared size and the downloaded bytes
18 // must fit the image store. Decoded bytes determine the stored format.
19 func whatsappImage(ctx context.Context, client WhatsAppClient, store *ImageStore, message *waE2E.ImageMessage) (string, error) {
20 if message.GetFileLength() > imageMaxBytes {
21 return "", errImageSize
24 switch message.GetMimetype() {
25 case "image/jpeg", "image/png", "image/webp":
27 return "", errImageFormat
31 return "", errors.New("WhatsApp client is not available")
34 data, err := client.Download(ctx, message)
36 return "", fmt.Errorf("download image: %w", whatsappImageDownloadError(err))
39 name, err := store.Save(data)
41 return "", fmt.Errorf("store image: %w", err)
47 // whatsappImageDownloadError keeps only known safe causes. Library errors can
48 // contain signed URLs or direct paths even when request preparation fails, so
49 // arbitrary error text cannot go to the daemon log.
50 func whatsappImageDownloadError(err error) error {
52 case errors.Is(err, context.Canceled):
53 return context.Canceled
54 case errors.Is(err, context.DeadlineExceeded):
55 return context.DeadlineExceeded
58 var response whatsmeow.DownloadHTTPError
60 if errors.As(err, &response) && response.Response != nil {
61 return fmt.Errorf("media server returned HTTP %d", response.StatusCode)
64 return errors.New("media download failed")