Ich würde gerne wissen, ob es möglich ist, Gzip-Komprimierung für Server-Gesendete Ereignisse (SSE; Content-Type: Text/Event-Stream) zu aktivieren.Ist es möglich, Gzip-Komprimierung mit Server-Sent Events (SSE) zu verwenden?
Es scheint, es möglich ist, nach diesem Buch: http://chimera.labs.oreilly.com/books/1230000000545/ch16.html
Aber ich kann kein Beispiel von SSE mit gzip-Komprimierung nicht finden. Ich habe versucht, gziped Nachrichten mit der Antwort-Header-Feld senden Content-Encoding auf "gzip" ohne Erfolg gesetzt.
Zum Experimentieren mit SSE teste ich eine kleine Webanwendung in Python mit dem bottle framework + gevent; Ich bin gerade die Flasche WSGI-Server ausgeführt wird:
@bottle.get('/data_stream')
def stream_data():
bottle.response.content_type = "text/event-stream"
bottle.response.add_header("Connection", "keep-alive")
bottle.response.add_header("Cache-Control", "no-cache")
bottle.response.add_header("Content-Encoding", "gzip")
while True:
# new_data is a gevent AsyncResult object,
# .get() just returns a data string when new
# data is available
data = new_data.get()
yield zlib.compress("data: %s\n\n" % data)
#yield "data: %s\n\n" % data
Der Code ohne Komprimierung (letzte Zeile, kommentiert) und ohne gzip Content-Encoding-Header-Feld wirkt wie ein Zauber.
EDIT: Dank der Antwort und auf diese andere Frage: Python: Creating a streaming gzip'd file-like? gelang es mir, das Problem zu lösen:
@bottle.route("/stream")
def stream_data():
compressed_stream = zlib.compressobj()
bottle.response.content_type = "text/event-stream"
bottle.response.add_header("Connection", "keep-alive")
bottle.response.add_header("Cache-Control", "no-cache, must-revalidate")
bottle.response.add_header("Content-Encoding", "deflate")
bottle.response.add_header("Transfer-Encoding", "chunked")
while True:
data = new_data.get()
yield compressed_stream.compress("data: %s\n\n" % data)
yield compressed_stream.flush(zlib.Z_SYNC_FLUSH)
Danke für Ihre Erklärung. In der Tat hilft das Ändern der Content-Encoding auf Deflate ein bisschen: die erste Nachricht wird auf der Client-Seite verarbeitet. Aber nur die erste :(Haben Sie eine Idee warum? Vielen Dank im Voraus – mguijarr
Versuchen Sie, für jeden Datenblock unabhängig compress aufzurufen? Ich denke nicht, dass das funktioniert. Alle Daten sollten in einem einzigen komprimierten Stream sein.Das bedeutet, dass gzip mit seiner Streaming-Schnittstelle tatsächlich der richtige Weg ist. Allerdings müsste ich mehr von Ihrem Code sehen, um bestimmte Zeiger zu bieten. – otus
Danke eine Million; endlich klappt es! Ich habe meine Frage bearbeitet, um zu sagen, was ich ändern musste. – mguijarr