def __call__(self, handler, request_method, raw_request_data): try: callback_param = handler.environ.get("QUERY_STRING").split('=')[1] self.callback = urllib2.unquote(callback_param) except IndexError: handler.do500(message='"callback" parameter required') return if request_method == 'OPTIONS': handler.write_options(['OPTIONS', 'POST']) return [] if self.session.is_new(): handler.enable_nocache() handler.enable_cookie() handler.enable_cors() open_frame = '%s("o");\r\n' % self.callback handler.write_js(open_frame) return [] elif self.session.is_expired(): close_error = protocol.close_frame(3000, "Go away!") handler.write_text(close_error) return [] elif self.session.is_locked(): lock_error = protocol.close_frame(2010, "Another connection still open") handler.write_text(lock_error) return [] else: self.session.lock() return [gevent.spawn(self.poll, handler)]
def __call__(self, handler, request_method, raw_request_data): """ On the first poll, send back the open frame, one subsequent calls actually poll the queue. """ if request_method == 'OPTIONS': handler.write_options(['OPTIONS', 'POST']) return [] if self.session.is_new(): handler.enable_cookie() handler.enable_cors() handler.write_js(protocol.OPEN) return [] elif self.session.is_network_error(): interrupt_error = protocol.close_frame(1002, "Connection interrupted") handler.write_text(interrupt_error) return [] elif self.session.is_expired(): close_error = protocol.close_frame(3000, "Go away!") handler.write_text(close_error) return [] elif self.session.is_locked(): lock_error = protocol.close_frame(2010, "Another connection still open") self.session.network_error = True handler.write_text(lock_error) return [] else: self.session.lock() return [gevent.spawn(self.poll, handler)]
def __call__(self, handler, request_method, raw_request_data): """ """ if request_method == 'OPTIONS': handler.write_options(['OPTIONS', 'POST']) return [] elif self.session.is_network_error(): writer, written = self.write_prelude(handler) try: interrupt_error = protocol.close_frame(1002, "Connection interrupted") interrupt_error_chunk = handler.raw_chunk(interrupt_error) writer.write(interrupt_error_chunk) writer.flush() except socket.error: self.session.expire() zero_chunk = handler.raw_chunk('') writer.write(zero_chunk) self.session.network_error = True return [] elif self.session.is_locked(): writer, written = self.write_prelude(handler) try: close_error = protocol.close_frame(2010, "Another connection still open") close_error_chunk = handler.raw_chunk(close_error) writer.write(close_error_chunk) writer.flush() except socket.error: self.session.expire() zero_chunk = handler.raw_chunk('') writer.write(zero_chunk) self.session.network_error = True return [] self.session.lock() return [ gevent.spawn(self.stream, handler), ]
def poll(self, socket): """ Spin lock the thread until we have a message on the gevent queue. """ while not self.session.expired: messages = self.session.get_messages() messages = self.encode(messages) socket.send(protocol.message_frame(messages)) close_error = protocol.close_frame(3000, "Go away!", newline=False) socket.send(close_error) # Session expires, so unlock socket.close() self.session.unlock()
def __call__(self, socket, request_method, raw_request_data): socket.send('o') if self.session.is_expired(): close_error = protocol.close_frame(3000, "Go away!", newline=False) socket.send(close_error) socket.close() return [] #elif self.session.is_locked(): #lock_error = protocol.close_frame(2010, "Another connection still open") #socket.send(lock_error) #socket.close() #return [] self.session.lock() return [ gevent.spawn(self.poll, socket), gevent.spawn(self.put, socket), ]