class FakeRedirectConnection(amqp.Connection): def __init__(self, sock): self.channels = {} super(amqp.Connection, self).__init__(self, 0) self.out = AMQPWriter(sock.makefile('w')) self.input = AMQPReader(sock.makefile('r')) self.method_reader = _MethodReader(self.input) def do_redirect(self, dest): if self.input.read(8) != AMQP_PROTOCOL_HEADER: print "Didn't receive AMQP 0-8 header" return # major, minor seems backwards, but that's what RabbitMQ sends self.start(8, 0, {'product': 'fake_redirect_0_8.py'}, ['AMQPLAIN'], ['en_US']) self.wait(allowed_methods=[ (10, 11), # start_ok ]) self.tune(0, 0, 0) self.wait(allowed_methods=[ (10, 31), # tune_ok ]) self.wait(allowed_methods=[ (10, 40), # open ]) if self.insist: self.close(reply_text="Can't redirect, insist was set to True") else: self.redirect(dest, '') try: self.wait(allowed_methods=[ (10, 60), # close ]) except amqp.AMQPConnectionError: pass print 'Redirect finished' def fake_op(self, args): """ We're not really much interested in what the client sends for start_ok, tune_ok """ pass ############## def _open(self, args): virtual_host = args.read_shortstr() capabilities = args.read_shortstr() self.insist = args.read_bit() def redirect(self, host, known_hosts): args = AMQPWriter() args.write_shortstr(host) args.write_shortstr(known_hosts) self._send_channel_method_frame(0, (10, 50), args) def start(self, version_major, version_minor, server_properties, mechanisms, locales): args = AMQPWriter() args.write_octet(version_major) args.write_octet(version_minor) args.write_table(server_properties) args.write_longstr(' '.join(mechanisms)) args.write_longstr(' '.join(locales)) self._send_channel_method_frame(0, (10, 10), args) def tune(self, channel_max, frame_max, heartbeat): args = AMQPWriter() args.write_short(channel_max) args.write_long(frame_max) args.write_short(heartbeat) self._send_channel_method_frame(0, (10, 30), args)