diff --git a/radicale/__init__.py b/radicale/__init__.py index 185d2c0..b1f2d97 100644 --- a/radicale/__init__.py +++ b/radicale/__init__.py @@ -265,6 +265,28 @@ class Application: """Manage a request.""" def response(status, headers={}, answer=None): + headers = headers.copy() + # Set content length + if answer: + self.logger.debug("Response content:\n%s", answer) + answer = answer.encode(self.encoding) + accept_encoding = [ + encoding.strip() for encoding in + environ.get("HTTP_ACCEPT_ENCODING", "").split(",") + if encoding.strip()] + + if "gzip" in accept_encoding: + zcomp = zlib.compressobj(wbits=16 + zlib.MAX_WBITS) + answer = zcomp.compress(answer) + zcomp.flush() + headers["Content-Encoding"] = "gzip" + + headers["Content-Length"] = str(len(answer)) + + # Add extra headers set in configuration + if self.configuration.has_section("headers"): + for key in self.configuration.options("headers"): + headers[key] = self.configuration.get("headers", key) + # Start response status = "%i %s" % ( status, client.responses.get(status, "Unknown")) @@ -359,31 +381,11 @@ class Application: self.logger.info("%s refused" % (user or "Anonymous user")) status = client.UNAUTHORIZED realm = self.configuration.get("server", "realm") + headers = headers.copy() headers.update ({ "WWW-Authenticate": "Basic realm=\"%s\"" % realm}) - # Set content length - if answer: - self.logger.debug("Response content:\n%s", answer) - answer = answer.encode(self.encoding) - accept_encoding = [ - encoding.strip() for encoding in - environ.get("HTTP_ACCEPT_ENCODING", "").split(",") - if encoding.strip()] - - if "gzip" in accept_encoding: - zcomp = zlib.compressobj(wbits=16 + zlib.MAX_WBITS) - answer = zcomp.compress(answer) + zcomp.flush() - headers["Content-Encoding"] = "gzip" - - headers["Content-Length"] = str(len(answer)) - - # Add extra headers set in configuration - if self.configuration.has_section("headers"): - for key in self.configuration.options("headers"): - headers[key] = self.configuration.get("headers", key) - return response(status, headers, answer) def _access(self, user, path, permission, item=None):