release v4.12.0-fazer-ai.44 (#253)

* fix(whatsapp): use payload filename for documents to avoid Content-Disposition parsing issues

When receiving documents via the WhatsApp Cloud API, filenames with
spaces or special characters were mangled due to the Down gem's
case-sensitive Content-Disposition header parsing. Now uses the
filename from the WhatsApp message payload when available, falling
back to Content-Disposition for other attachment types.

* fix: scope payload filename preference to document messages only

* fix: revert document-only scope, apply payload filename for all attachment types
This commit is contained in:
Gabriel Jablonski 2026-04-03 12:03:12 -03:00 committed by GitHub
parent 79c193ee9e
commit 84242aae7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 47 additions and 1 deletions

View File

@ -171,7 +171,7 @@ class Whatsapp::IncomingMessageBaseService # rubocop:disable Metrics/ClassLength
file_type: file_content_type(message_type),
file: {
io: attachment_file,
filename: attachment_file.original_filename,
filename: attachment_payload[:filename].presence || attachment_file.original_filename,
content_type: attachment_file.content_type
},
meta: ({ is_recorded_audio: true } if attachment_payload[:voice])

View File

@ -107,6 +107,52 @@ describe Whatsapp::IncomingMessageWhatsappCloudService do
end
end
context 'when document attachment has filename with spaces' do
let(:document_params) do
{
phone_number: whatsapp_channel.phone_number,
object: 'whatsapp_business_account',
entry: [{
changes: [{
value: {
contacts: [{ profile: { name: 'Sojan Jose' }, wa_id: '2423423243' }],
messages: [{
from: '2423423243',
document: {
id: 'b1c68f38-8734-4ad3-b4a1-ef0c10d683',
mime_type: 'application/pdf',
sha256: '29ed500fa64eb55fc19dc4124acb300e5dcca0f822a301ae99944db',
filename: 'Sample File Ação.pdf',
caption: 'Check this document'
},
timestamp: '1664799904', type: 'document'
}]
}
}]
}]
}.with_indifferent_access
end
it 'uses the filename from the message payload instead of Content-Disposition' do
stub_media_url_request
stub_request(:get, 'https://chatwoot-assets.local/sample.png').to_return(
status: 200,
body: File.read('spec/assets/attachment.pdf'),
headers: {
'content-type' => 'application/pdf',
'content-disposition' =>
"attachment; filename=Sample_File_Ao.pdf; filename*=utf-8''Sample%20File%20A%C3%A7%C3%A3o.pdf"
}
)
described_class.new(inbox: whatsapp_channel.inbox, params: document_params).perform
attachment = whatsapp_channel.inbox.messages.first.attachments.first
expect(attachment).to be_present
expect(attachment.file.filename.to_s).to eq('Sample File Ação.pdf')
end
end
context 'when dispatching provider events' do
let(:message_params) do
{