def send(): if session.state == STATE_CLOSING: websocket.send(close_frame(3000, 'Go away!')) websocket.close() session.closed() return while True: try: message = [session.get_transport_message(timeout=TIMING)] except Empty: message = 'h' session.heartbeat() else: message = message_frame(message) if session.state == STATE_CLOSING: try: websocket.send(close_frame(3000, 'Go away!')) websocket.close() except: pass session.closed() break elif session.state == STATE_CLOSED: break try: websocket.send(message) except: session.close() session.closed() break
def process(self, session, request): response = request.response response.content_type = "application/javascript; charset=UTF-8" response.headerlist.extend(cors_headers(request)) response.headerlist.append(("Cache-Control", "no-store, no-cache, must-revalidate, max-age=0")) def finish(request): session.release() request.add_finished_callback(finish) try: session.acquire(request) except: # should use specific exception response.body = close_frame(2010, "Another connection still open", "\n") return if session.state == STATE_NEW: response.body = OPEN session.open() return if session.state in (STATE_CLOSING, STATE_CLOSED): response.body = close_frame(3000, "Go away!", "\n") if session.state == STATE_CLOSING: session.closed() return response.body = get_messages(session, self.timing, self.heartbeat)
def process(self, session, request): response = request.response response.content_type = 'application/javascript; charset=UTF-8' response.headerlist.extend(cors_headers(request)) response.headerlist.append( ('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')) def finish(request): session.release() request.add_finished_callback(finish) try: session.acquire(request) except: # should use specific exception response.body = close_frame(2010, "Another connection still open", '\n') return if session.state == STATE_NEW: response.body = OPEN session.open() return if session.state in (STATE_CLOSING, STATE_CLOSED): response.body = close_frame(3000, 'Go away!', '\n') if session.state == STATE_CLOSING: session.closed() return response.body = get_messages(session, self.timing, self.heartbeat)
def process(self, session, request): response = request.response response.content_type = 'application/javascript; charset=UTF-8' response.headerlist.extend(cors_headers(request)) def finish(request): session.release() request.add_finished_callback(finish) try: session.acquire(request) except: # should use specific exception response.body = close_frame( 2010, "Another connection still open", '\n') return if session.state == STATE_NEW: response.body = OPEN session.open() return if session.state in (STATE_CLOSING, STATE_CLOSED): response.body = close_frame(3000, 'Go away!', '\n') if session.state == STATE_CLOSING: session.closed() return response.body = get_messages(session, self.timing, self.heartbeat)
def __call__(self, environ, start_response): request = self.request callback = request.GET.get('c', None) if callback is None: self.status = 500 self.body = '"callback" parameter required' return super(HTMLFileTransport, self).__call__( environ, start_response) write = start_response(self.status, self.headerlist) prelude = PRELUDE % callback.encode('UTF-8') prelude += ' ' * 1024 write(prelude) timing = self.timing session = self.session if session.state == STATE_NEW: write('<script>\np("o");\n</script>\r\n') session.open() size = 0 try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message) if session.state == STATE_CLOSING: try: write("<script>\np(%s);\n</script>\r\n" % encode(close_frame('session closed','connection expired'))) except Exception as e: print "Error closing html streaming sockjs protocol" session.closed() break message = "<script>\np(%s);\n</script>\r\n" % encode(message) try: write(message) except: session.closed() raise StopStreaming() size += len(message) if size > self.maxsize: break finally: session.release() return []
def __call__(self, environ, start_response): request = self.request callback = request.GET.get('c', None) if callback is None: self.status = 500 self.body = '"callback" parameter required' return super(HTMLFileTransport, self).__call__(environ, start_response) write = start_response(self.status, self.headerlist) prelude = PRELUDE % callback prelude += ' ' * 1024 write(prelude) timing = self.timing session = self.session if session.state == STATE_NEW: write('<script>\np("o");\n</script>\r\n') session.open() size = 0 try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message) if session.state == STATE_CLOSING: write("<script>\np(%s);\n</script>\r\n" % encode(close_frame('Go away!'))) session.closed() break message = "<script>\np(%s);\n</script>\r\n" % encode(message) try: write(message) except: session.closed() raise StopStreaming() size += len(message) if size > self.maxsize: break finally: session.release() return []
def __call__(self, environ, start_response): write = start_response( self.status, [('Content-Type','text/event-stream; charset=UTF-8'), ('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'), session_cookie(self.request)]) write('\r\n') timing = self.timing session = self.session if session.state == STATE_NEW: write("data: o\r\n\r\n") session.open() size = 0 try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message) if session.state == STATE_CLOSING: write("data: %s\r\n\r\n"%close_frame(1000, 'Go away!')) session.closed() break if session.state != STATE_OPEN: break try: write("data: %s\r\n\r\n" % message) except: session.closed() raise StopStreaming() size += len(message) if size >= self.maxsize: break finally: session.release() return []
def __call__(self, environ, start_response): write = start_response( self.status, [('Content-Type', 'text/event-stream; charset=UTF-8'), ('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0'), session_cookie(self.request)]) write('\r\n') timing = self.timing session = self.session if session.state == STATE_NEW: write("data: o\r\n\r\n") session.open() size = 0 try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message) if session.state == STATE_CLOSING: write("data: %s\r\n\r\n" % close_frame(1000, 'Go away!')) session.closed() break if session.state != STATE_OPEN: break try: write("data: %s\r\n\r\n" % message) except: session.closed() raise StopStreaming() size += len(message) if size >= self.maxsize: break finally: session.release() return []
def receive(): while True: try: message = websocket.receive() except: session.close() break if session.state == STATE_CLOSING: try: websocket.send(close_frame(3000, 'Go away!')) websocket.close() except: pass session.closed() break elif session.state == STATE_CLOSED: break if message == '': continue if message is None: session.close() session.closed() websocket.close() break try: if message.startswith('['): message = message[1:-1] decoded_message = decode(message) except: try: websocket.close(message='broken json') except: pass session.close() session.closed() break if decoded_message: session.message(decoded_message) session.release()
def __call__(self, environ, start_response): write = start_response( self.status, self._abs_headerlist(environ)) write(self.body) try: self.session.acquire(self.request) except: # should use specific exception self.websocket.send('o') self.websocket.send( close_frame(2010, "Another connection still open", '\n')) self.websocket.close() return StopStreaming() if self.open(): gevent.joinall((gevent.spawn(self.send), gevent.spawn(self.receive))) raise StopStreaming()
def __call__(self, environ, start_response): # WebsocketHixie76 handshake (test_haproxy) if environ['wsgi.websocket_version'] == 'hixie-76': part1, part2, socket = environ['wsgi.hixie-keys'] towrite = [ 'HTTP/1.1 %s\r\n' % self.status, 'Date: %s\r\n' % format_date_time(time.time()) ] for header in self._abs_headerlist(environ): towrite.append("%s: %s\r\n" % header) towrite.append("\r\n") socket.sendall(''.join(towrite)) key3 = environ['wsgi.input'].read(8) if not key3: key3 = environ['wsgi.input'].rfile.read(8) socket.sendall( md5(struct.pack("!II", part1, part2) + key3).digest()) else: write = start_response(self.status, self._abs_headerlist(environ)) write(self.body) try: self.session.acquire(self.request) except: # should use specific exception self.websocket.send('o') self.websocket.send( close_frame(2010, "Another connection still open", '\n')) self.websocket.close() return StopStreaming() if self.open(): gevent.joinall( (gevent.spawn(self.send), gevent.spawn(self.receive))) raise StopStreaming()
def __call__(self, environ, start_response): # WebsocketHixie76 handshake (test_haproxy) if environ['wsgi.websocket_version'] == 'hixie-76': part1, part2, socket = environ['wsgi.hixie-keys'] towrite = [ 'HTTP/1.1 %s\r\n'%self.status, 'Date: %s\r\n'%format_date_time(time.time())] for header in self._abs_headerlist(environ): towrite.append("%s: %s\r\n" % header) towrite.append("\r\n") socket.sendall(''.join(towrite)) key3 = environ['wsgi.input'].read(8) if not key3: key3 = environ['wsgi.input'].rfile.read(8) socket.sendall( md5(struct.pack("!II", part1, part2) + key3).digest()) else: write = start_response( self.status, self._abs_headerlist(environ)) write(self.body) try: self.session.acquire(self.request) except: # should use specific exception self.websocket.send('o') self.websocket.send( close_frame(2010, "Another connection still open", '\n')) self.websocket.close() return StopStreaming() if self.open(): gevent.joinall((gevent.spawn(self.send), gevent.spawn(self.receive))) raise StopStreaming()
def JSONPolling(session, request): meth = request.method response = request.response response.headers['Content-Type'] = 'application/javascript; charset=UTF-8' response.headerlist.append( ('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')) session_cookie(request) if session.state == STATE_NEW: callback = request.GET.get('c', None) if callback is None: return HTTPServerError('"callback" parameter required') response.text = '%s("o");\r\n' % callback session.open() session.release() elif meth == "GET": callback = request.GET.get('c', None) if callback is None: return HTTPServerError('"callback" parameter required') if session.state in (STATE_CLOSING, STATE_CLOSED): response.text = "%s(%s);\r\n"%( callback, encode(close_frame(3000, 'Go away!'))) if session.state == STATE_CLOSING: session.closed() else: messages = [] try: messages.append(session.get_transport_message(timeout=timing)) while True: try: messages.append( session.get_transport_message(block=False)) except Empty: break except Empty: messages = HEARTBEAT session.heartbeat() else: messages = message_frame(messages) response.text = "%s(%s);\r\n"%(callback, encode(messages)) session.release() elif meth == "POST": data = request.body_file.read() ctype = request.headers.get('Content-Type', '').lower() if ctype == 'application/x-www-form-urlencoded': if not data.startswith('d='): return HTTPServerError("Payload expected.") data = unquote_plus(data[2:]) if not data: return HTTPServerError("Payload expected.") try: messages = decode(data) except: return HTTPServerError("Broken JSON encoding.") for msg in messages: session.message(msg) response.status = 200 response.headers['Content-Type'] = 'text/plain; charset=UTF-8' response.body = 'ok' else: raise Exception("No support for such method: %s"%meth) return response
def test_close_frame_endline(self): from pyramid_sockjs import protocol msg = protocol.close_frame(1000, 'Internal error', '\n') self.assertEqual(msg, 'c[1000,"Internal error"]\n')
def JSONPolling(session, request): meth = request.method response = request.response response.headers['Content-Type'] = 'application/javascript; charset=UTF-8' response.headerlist.append( ('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')) session_cookie(request) if session.state == STATE_NEW: callback = request.GET.get('c', None) if callback is None: return HTTPServerError('"callback" parameter required') response.text = '%s("o");\r\n' % callback session.open() session.release() elif meth == "GET": callback = request.GET.get('c', None) if callback is None: return HTTPServerError('"callback" parameter required') if session.state in (STATE_CLOSING, STATE_CLOSED): response.text = "%s(%s);\r\n" % ( callback, encode(close_frame(3000, 'Go away!'))) if session.state == STATE_CLOSING: session.closed() else: messages = [] try: messages.append(session.get_transport_message(timeout=timing)) while True: try: messages.append( session.get_transport_message(block=False)) except Empty: break except Empty: messages = HEARTBEAT session.heartbeat() else: messages = message_frame(messages) response.text = "%s(%s);\r\n" % (callback, encode(messages)) session.release() elif meth == "POST": data = request.body_file.read() ctype = request.headers.get('Content-Type', '').lower() if ctype == 'application/x-www-form-urlencoded': if not data.startswith('d='): return HTTPServerError("Payload expected.") data = unquote_plus(data[2:]) if not data: return HTTPServerError("Payload expected.") try: messages = decode(data) except: return HTTPServerError("Broken JSON encoding.") for msg in messages: session.message(msg) response.status = 200 response.headers['Content-Type'] = 'text/plain; charset=UTF-8' response.body = 'ok' else: raise Exception("No support for such method: %s" % meth) return response
def __call__(self, environ, start_response): request = self.request if request.method == 'OPTIONS': self.status = 204 self.content_type = 'application/javascript; charset=UTF-8' self.headerlist.append( ("Access-Control-Allow-Methods", "OPTIONS, POST")) self.headerlist.extend(cache_headers(request)) return super(XHRStreamingTransport, self).__call__( environ, start_response) write = start_response( self.status, self._abs_headerlist(environ)) write(self.open_seq) session = self.session #if session.state == STATE_CLOSED: # write('%s\n'%close_frame(1002, "Connection interrupted")) # return () try: session.acquire(self.request) except: # should use specific exception write(close_frame(2010, "Another connection still open", '\n')) return () if session.state == STATE_NEW: write(OPEN) session.open() if session.state in (STATE_CLOSING, STATE_CLOSED): write(close_frame(3000, 'Go away!', '\n')) if session.state == STATE_CLOSING: session.closed() return () stream_size = 0 timing = self.timing try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message, '\n') if session.state == STATE_CLOSING: write(close_frame(3000, 'Go away!', '\n')) session.closed() raise StopStreaming() if session.state != STATE_OPEN: break try: write(message) except: session.closed() raise StopStreaming() stream_size += len(message) if stream_size > self.maxsize: break finally: session.release() return []
def __call__(self, environ, start_response): request = self.request if request.method == 'OPTIONS': self.status = 204 self.content_type = 'application/javascript; charset=UTF-8' self.headerlist.append( ("Access-Control-Allow-Methods", "OPTIONS, POST")) self.headerlist.extend(cache_headers(request)) return super(XHRStreamingTransport, self).__call__(environ, start_response) write = start_response(self.status, self._abs_headerlist(environ)) write(self.open_seq) session = self.session #if session.state == STATE_CLOSED: # write('%s\n'%close_frame(1002, "Connection interrupted")) # return () try: session.acquire(self.request) except: # should use specific exception write(close_frame(2010, "Another connection still open", '\n')) return () if session.state == STATE_NEW: write(OPEN) session.open() if session.state in (STATE_CLOSING, STATE_CLOSED): write(close_frame(3000, 'Go away!', '\n')) if session.state == STATE_CLOSING: session.closed() return () stream_size = 0 timing = self.timing try: while True: try: message = [session.get_transport_message(timeout=timing)] except Empty: message = HEARTBEAT session.heartbeat() else: message = message_frame(message, '\n') if session.state == STATE_CLOSING: write(close_frame(3000, 'Go away!', '\n')) session.closed() raise StopStreaming() if session.state != STATE_OPEN: break try: write(message) except: session.closed() raise StopStreaming() stream_size += len(message) if stream_size > self.maxsize: break finally: session.release() return []