MCPcopy Create free account
hub / github.com/FreeOpcUa/python-opcua / message_to_chunks

Method message_to_chunks

opcua/common/connection.py:84–119  ·  view source on GitHub ↗

Pack message body (as binary string) into one or more chunks. Size of each chunk will not exceed max_chunk_size. Returns a list of MessageChunks. SequenceNumber is not initialized here, it must be set by Secure Channel driver.

(security_policy, body, max_chunk_size, message_type=ua.MessageType.SecureMessage, channel_id=1, request_id=1, token_id=1)

Source from the content-addressed store, hash-verified

82
83 @staticmethod
84 def message_to_chunks(security_policy, body, max_chunk_size, message_type=ua.MessageType.SecureMessage, channel_id=1, request_id=1, token_id=1):
85 """
86 Pack message body (as binary string) into one or more chunks.
87 Size of each chunk will not exceed max_chunk_size.
88 Returns a list of MessageChunks. SequenceNumber is not initialized here,
89 it must be set by Secure Channel driver.
90 """
91 if message_type == ua.MessageType.SecureOpen:
92 # SecureOpen message must be in a single chunk (specs, Part 6, 6.7.2)
93 chunk = MessageChunk(security_policy.asymmetric_cryptography, body, message_type, ua.ChunkType.Single)
94 chunk.SecurityHeader.SecurityPolicyURI = security_policy.URI
95 if security_policy.client_certificate:
96 chunk.SecurityHeader.SenderCertificate = security_policy.client_certificate
97 if security_policy.server_certificate:
98 chunk.SecurityHeader.ReceiverCertificateThumbPrint =\
99 hashlib.sha1(security_policy.server_certificate).digest()
100 chunk.MessageHeader.ChannelId = channel_id
101 chunk.SequenceHeader.RequestId = request_id
102 return [chunk]
103
104 crypto = security_policy.symmetric_cryptography
105 max_size = MessageChunk.max_body_size(crypto, max_chunk_size)
106
107 chunks = []
108 for i in range(0, len(body), max_size):
109 part = body[i:i + max_size]
110 if i + max_size >= len(body):
111 chunk_type = ua.ChunkType.Single
112 else:
113 chunk_type = ua.ChunkType.Intermediate
114 chunk = MessageChunk(crypto, part, message_type, chunk_type)
115 chunk.SecurityHeader.TokenId = token_id
116 chunk.MessageHeader.ChannelId = channel_id
117 chunk.SequenceHeader.RequestId = request_id
118 chunks.append(chunk)
119 return chunks
120
121 def __str__(self):
122 return "{0}({1}, {2}, {3}, {4} bytes)".format(self.__class__.__name__, self.MessageHeader, self.SequenceHeader, self.SecurityHeader, len(self.Body))

Callers 2

message_to_binaryMethod · 0.80
test_message_chunkMethod · 0.80

Calls 2

MessageChunkClass · 0.85
max_body_sizeMethod · 0.80

Tested by 1

test_message_chunkMethod · 0.64