def __init__(self, message=None, opcode=None, version=None, masking_key=None, final=False, rsv1=0, rsv2=0, rsv3=0): """Implements the framing protocol as defined by hybi_ specification supporting protocol version 13:: >>> f = Frame(opcode, 'hello world', os.urandom(4), fin=1) >>> data = f.build() >>> f = Frame() >>> f.parser.send(bytes[1]) >>> f.parser.send(bytes[2]) >>> f.parser.send(bytes[2:]) """ self.version = get_version(version) if opcode is None and message is not None: opcode = 0x1 if is_text_data(message) else 0x2 message = to_bytes(message or b'') self.payload_length = len(message) if opcode is None: raise WebSocketProtocolError('opcode not available') self.version = version self.opcode = opcode if masking_key: masking_key = to_bytes(masking_key) if len(masking_key) != 4: raise WebSocketProtocolError('Masking key must be 4 bytes long') self.masking_key = masking_key self.fin = 0x1 if final else 0 self.rsv1 = rsv1 self.rsv2 = rsv2 self.rsv3 = rsv3 self.body = message self.msg = self.build_frame(message)
def test_to_bytes(self): s = httpurl.to_bytes('ciao') self.assertTrue(isinstance(s, bytes)) s2 = httpurl.to_bytes(s) self.assertEqual(id(s), id(s2)) s3 = httpurl.to_bytes(s, 'latin-1') self.assertEqual(s, s3) self.assertNotEqual(id(s), id(s3))
def test_WWWAuthenticate_digest(self): H = httpurl.hexmd5 nonce = H(to_bytes('%d' % time.time()) + os.urandom(10)) auth = httpurl.WWWAuthenticate.digest('www.mydomain.org', nonce, opaque=H(os.urandom(10)), qop=('auth', 'auth-int')) self.assertEqual(auth.options['qop'], 'auth, auth-int')
def request_challenge_digest_auth(self, environ, bits): if len(bits) == 3: auth = environ.get('HTTP_AUTHORIZATION') if auth and auth.authenticated(environ, *bits[1:]): data = jsonbytes({'autheinticated': True, 'username': auth.username}) return self.response(data) nonce = hexmd5(to_bytes('%d' % time.time()) + os.urandom(10)) digest = WWWAuthenticate.digest("Fake Realm", nonce, opaque=hexmd5(os.urandom(10)), qop=bits[:1]) raise HttpException(status=401, headers=[('WWW-Authenticate', str(digest))]) else: raise HttpException(status=404)
def encode(self, msg): if isinstance(msg, ActorMessage): return msg.encode() else: return to_bytes(msg)
def challenge_response(self, key): sha1 = hashlib.sha1(to_bytes(key+WEBSOCKET_GUID)) return native_str(base64.b64encode(sha1.digest()))