def incoming_loop(self): while self.should_run: try: message = self.ws_client.receive() except: self.close() return if message == None: break event = events.parse_event_json(message) if event == None: event_json = simplejson.loads(message) raise Exception('Unknown event type: %s' % event_json['type']) if isinstance(event, events.AuthenticationResponse): if event.authenticated: self.username = event.username elif isinstance(event, events.SubscribeResponse): if event.joined: self.channel_id = event.channel_id elif event.__class__ in Client.IGNORED_EVENTS: pass # don't care else: pass #print 'Unhandled incoming event: %s' % event if self.event_handler: self.event_handler(event)
def handle_incoming_frame(self, frame_data): print 'Incoming: %s' % repr(frame_data) event = events.parse_event_json(frame_data) if not event: print "Could not read an event from the data: %s" % frame_data return response_event = None if isinstance(event, events.Heartbeat): pass # ignore for now, eventually maybe track dead connections? elif isinstance(event, events.AuthenticationRequest): if event.session_id == settings.WEB_SOCKETS_SECRET: self.user = User.objects.filter(is_staff=True)[0] response_event = events.AuthenticationResponse(True, self.user.username) else: user = self.user_from_session_key(event.session_id) if user.is_authenticated(): self.user = user response_event = events.AuthenticationResponse(True, user.username) else: response_event = events.AuthenticationResponse(False) elif isinstance(event, events.ServerInfoRequest): if not self.user: print 'Attemped unauthed info request' else: response_event = events.ServerInfo({ 'status':'ok', 'connections':len(self.server.ws_connections), 'channel count':len(self.server.channels), 'channels':[key for key in self.server.channels.keys()] }) elif isinstance(event, events.ChannelListRequest): if self.user: channel_list = [] for channel_id, channel in self.server.channels.items(): channel_list.append([channel.channel_id, channel.name]) response_event = events.ChannelList(channel_list) else: print 'Attempted unauthed channel list request' elif isinstance(event, events.CreateChannelRequest): if self.user and self.user.is_staff: # TODO fix this massive race condition if not self.server.channels.has_key(event.channel_id): if event.class_name: try: module_name = '.'.join(event.class_name.split('.')[0:-1]) class_name = event.class_name.split('.')[-1] __import__(module_name) modu = sys.modules[module_name] clz = getattr(modu, class_name) if issubclass(clz, events.Channel): channel = clz(self.server, event.channel_id, options=event.options) self.server.channels[channel.channel_id] = channel response_event = events.ChannelCreated(channel.channel_id) else: print 'Tried to create Channel using a non Channel class:', clz except: traceback.print_exc() else: channel = events.Channel(self.server, event.channel_id) self.server.channels[channel.channel_id] = channel response_event = events.ChannelCreated(channel.channel_id) else: response_event = events.ChannelExists(event.channel_id) print 'already have that key', event.channel_id else: print 'Attempted unauthed channel list request' elif isinstance(event, events.DeleteChannelRequest): if self.user and self.user.is_staff: # TODO fix this massive race condition if self.server.channels.has_key(event.channel_id): del(self.server.channels[event.channel_id]) response_event = events.ChannelDeleted(event.channel_id) else: print 'Attempted unauthed channel list request' elif isinstance(event, events.SubscribeRequest): if self.channel: print 'Attempted to subscribe to more than one channel' response_event = events.SubscribeResponse(event.channel_id, False) elif not self.server.channels.has_key(event.channel_id): print 'Attemped subscription to unknown channel: %s' % event.channel_id response_event = events.SubscribeResponse(event.channel_id, False) else: channel = self.server.channels[event.channel_id] success, response_event = channel.handle_subscribe_request(self, event) if success: self.channel = channel elif hasattr(event, 'service'): try: response_event = event.service(self) except: pass traceback.print_exc() #print 'error servicing event:', event else: print "Received unhandled event %s" % event.to_json() if response_event: print 'Outgoing: %s' % repr(to_json(response_event)) self.handler.send(response_event.to_json())