Code: Alles auswählen
/rpc?{methoden und parameter}
Wer diese Schnittstelle mit Angular oder jQuery benutzen will, wird zunächst von der verwendeten Kompression eingeholt. Akzeptiert der Browser gzip, wird komprimiert, allerdings mit deflate.
Ursache ist ein kleiner bug on Worker.py: die Kompression wird als gzip angekündigt, tatsächlich wird zlib.compress verwendet:
Code: Alles auswählen
result.stream = stream.IByteStream(zlib.compress(toJson(response).encode('utf-8'), level))
zlib.compress kann indes nur deflate, und nicht gzip.
Weiter vorn werden die Browser capabilities abgefragt, und zwar erst deflate, und dann gzip. Kann der Browser beides, wird gzip gemeldet, und das finden die Browser (alle) nicht witzig.
Nebenbei bemerkt scheint es sowohl dem OPSI Client Agent als auch dem Winst sch...egal zu sein, ob deflate, gzip oder nix angemeldet wird - sie rechnen mir deflate und basta. Wird nämlich die Kompression ganz abgeschaltet, kommen die Browser klar, aber der Winst bricht ab. Nich gut
Mein Patch also:
Code: Alles auswählen
--- a/Service/Worker.py
+++ b/Service/Worker.py
@@ -561,10 +561,11 @@ class WorkerOpsiJsonRpc(WorkerOpsi):
encoding = None
try:
- if ('deflate' in self.request.headers.getHeader('Accept-Encoding')):
- encoding = 'deflate'
+ # UH 2015-04 the encoding done by zlib below does deflate OLNY - so please answer "deflate"
if ('gzip' in self.request.headers.getHeader('Accept-Encoding')):
encoding = 'gzip'
+ if ('deflate' in self.request.headers.getHeader('Accept-Encoding')):
+ encoding = 'deflate'
except Exception, e:
pass
if not encoding:
(Ungelöst: wenn der Browser nur gzip akzeptiert, wird weiter gzip gemeldet, aber deflate gesendet. Vielleicht sollte man gzip ganz streichen - was Winst dan macht, habe ich nicht getestet.)
happy patching!