Skip to content

Commit e126292

Browse files
committed
Move batch message encoding in to _messaging_utils class BatchMessageEncoder
1 parent 71e237e commit e126292

File tree

2 files changed

+40
-28
lines changed

2 files changed

+40
-28
lines changed

firebase_admin/_messaging_utils.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,3 +773,35 @@ def default(self, obj): # pylint: disable=method-hidden
773773
if target_count != 1:
774774
raise ValueError('Exactly one of token, topic or condition must be specified.')
775775
return result
776+
777+
778+
class BatchMessageEncoder(object):
779+
"""A custom encoder for serializing JSON for Messages into batch request data."""
780+
781+
@classmethod
782+
def encode(cls, url, headers, boundary, message_data): # pylint: disable=method-hidden
783+
parts = [cls._batch_request_part(url, headers, boundary, md, index) for (index, md) in enumerate(message_data)]
784+
return '{}--{}--\r\n'.format(''.join(parts), boundary)
785+
786+
@classmethod
787+
def _batch_request_part(cls, url, headers, boundary, message_data, index):
788+
data = cls._batch_request_part_data(url, headers, message_data)
789+
part = '--{}\r\n'.format(boundary)
790+
part += 'Content-Length: {}\r\n'.format(len(data))
791+
part += 'Content-Type: application/http\r\n'
792+
part += 'content-id: {}\r\n'.format(index + 1)
793+
part += 'content-transfer-encoding: binary\r\n'
794+
part += '\r\n'
795+
part += '{}\r\n'.format(data)
796+
return part
797+
798+
@classmethod
799+
def _batch_request_part_data(cls, url, headers, message_data):
800+
body = json.dumps(message_data)
801+
data = 'POST {} HTTP/1.1\r\n'.format(url)
802+
data += 'Content-Length: {}\r\n'.format(len(body))
803+
data += 'Content-Type: application/json; charset=UTF-8\r\n'
804+
data += '\r\n'.join(['{}: {}'.format(k, v) for k, v in headers.items()])
805+
data += '\r\n\r\n'
806+
data += body
807+
return data

firebase_admin/messaging.py

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ class _MessagingService(object):
252252
IID_URL = 'https://iid.googleapis.com'
253253
IID_HEADERS = {'access_token_auth': 'true'}
254254
JSON_ENCODER = _messaging_utils.MessageEncoder()
255+
BATCH_ENCODER = _messaging_utils.BatchMessageEncoder()
255256

256257
BATCH_PART_BOUNDARY = '__END_OF_PART__'
257258

@@ -317,7 +318,13 @@ def send(self, message, dry_run=False):
317318
return resp['name']
318319

319320
def sendAll(self, messages, dry_run=False):
320-
data = self._batch_message_data(messages, dry_run)
321+
message_data = [self._message_data(message, dry_run) for message in messages]
322+
data = _MessagingService.BATCH_ENCODER.encode(
323+
url=self._fcm_url,
324+
headers=self._fcm_headers,
325+
boundary=_MessagingService.BATCH_PART_BOUNDARY,
326+
message_data=message_data
327+
)
321328
headers = {
322329
'Content-Type': 'multipart/mixed; boundary={}'.format(_MessagingService.BATCH_PART_BOUNDARY)
323330
}
@@ -386,33 +393,6 @@ def _message_data(self, message, dry_run):
386393
data['validate_only'] = True
387394
return data
388395

389-
def _batch_message_data(self, messages, dry_run):
390-
parts = [self._batch_request_part(request, dry_run, _MessagingService.BATCH_PART_BOUNDARY, index)\
391-
for (index, request) in enumerate(messages)]
392-
return '{}--{}--\r\n'.format(''.join(parts), _MessagingService.BATCH_PART_BOUNDARY)
393-
394-
def _batch_request_part(self, request, dry_run, boundary, index):
395-
data = self._batch_request_part_data(request, dry_run)
396-
part = '--{}\r\n'.format(boundary)
397-
part += 'Content-Length: {}\r\n'.format(len(data))
398-
part += 'Content-Type: application/http\r\n'
399-
part += 'content-id: {}\r\n'.format(index + 1)
400-
part += 'content-transfer-encoding: binary\r\n'
401-
part += '\r\n'
402-
part += '{}\r\n'.format(data)
403-
return part
404-
405-
def _batch_request_part_data(self, request, dry_run):
406-
body = json.dumps(self._message_data(request, dry_run))
407-
data = 'POST {} HTTP/1.1\r\n'.format(self._fcm_url)
408-
data += 'Content-Length: {}\r\n'.format(len(body))
409-
data += 'Content-Type: application/json; charset=UTF-8\r\n'
410-
data += '\r\n'.join(['{}: {}'.format(k, v) for k, v in self._fcm_headers.items()])
411-
data += '\r\n\r\n'
412-
data += body
413-
return data
414-
415-
416396
def _handle_fcm_error(self, error):
417397
"""Handles errors received from the FCM API."""
418398
data = {}

0 commit comments

Comments
 (0)