format this object to string(byte array) to send data to server.
(self)
| 209 | return ABNF(fin, 0, 0, 0, opcode, 1, data) |
| 210 | |
| 211 | def format(self): |
| 212 | """ |
| 213 | format this object to string(byte array) to send data to server. |
| 214 | """ |
| 215 | if any(x not in (0, 1) for x in [self.fin, self.rsv1, self.rsv2, self.rsv3]): |
| 216 | raise ValueError("not 0 or 1") |
| 217 | if self.opcode not in ABNF.OPCODES: |
| 218 | raise ValueError("Invalid OPCODE") |
| 219 | length = len(self.data) |
| 220 | if length >= ABNF.LENGTH_63: |
| 221 | raise ValueError("data is too long") |
| 222 | |
| 223 | frame_header = chr(self.fin << 7 |
| 224 | | self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4 |
| 225 | | self.opcode) |
| 226 | if length < ABNF.LENGTH_7: |
| 227 | frame_header += chr(self.mask << 7 | length) |
| 228 | frame_header = six.b(frame_header) |
| 229 | elif length < ABNF.LENGTH_16: |
| 230 | frame_header += chr(self.mask << 7 | 0x7e) |
| 231 | frame_header = six.b(frame_header) |
| 232 | frame_header += struct.pack("!H", length) |
| 233 | else: |
| 234 | frame_header += chr(self.mask << 7 | 0x7f) |
| 235 | frame_header = six.b(frame_header) |
| 236 | frame_header += struct.pack("!Q", length) |
| 237 | |
| 238 | if not self.mask: |
| 239 | return frame_header + self.data |
| 240 | else: |
| 241 | mask_key = self.get_mask_key(4) |
| 242 | return frame_header + self._get_masked(mask_key) |
| 243 | |
| 244 | def _get_masked(self, mask_key): |
| 245 | s = ABNF.mask(mask_key, self.data) |