示例#1
0
	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)
示例#2
0
	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())