r9677 - in helma-ng/trunk/modules/helma: . webapp
[email protected] Mon, 27 Apr 2009 16:46:13 +0200 (CEST)
| Newsgroups | gmane.comp.java.helma.cvs |
|---|---|
| Message-ID | <20090427144613.D2D9F3D0D6@mia> |
Author: hannes
Date: 2009-04-27 16:46:13 +0200 (Mon, 27 Apr 2009)
New Revision: 9677
Added:
helma-ng/trunk/modules/helma/webapp/util.js
Modified:
helma-ng/trunk/modules/helma/httpserver.js
helma-ng/trunk/modules/helma/webapp/response.js
Log:
Fix content encoding bug, add module helma/webapp/util providing method to get mime subheader, do not get inputStream on servlet request unless requested as it makes setting content encoding pointless.
Details at http://dev.helma.org/trac/helma/changeset/9677
Modified: helma-ng/trunk/modules/helma/httpserver.js
===================================================================
--- helma-ng/trunk/modules/helma/httpserver.js 2009-04-27 09:07:11 UTC (rev 9676)
+++ helma-ng/trunk/modules/helma/httpserver.js 2009-04-27 14:46:13 UTC (rev 9677)
@@ -2,7 +2,9 @@
* Module for starting and stopping the jetty http server.
*/
+include('helma/webapp/util');
var IO = require('io').IO;
+var HashP = require('hashp').HashP;
export('start', 'stop', 'initRequest', 'commitResponse');
@@ -108,8 +110,21 @@
* @param env a jack request object
*/
function initRequest(env) {
- env["jack.input"] = new IO(env['jack.servlet_request'].getInputStream(), null);
- env["jack.errors"] = new IO(null, java.lang.System.err);
+ var input, errors;
+ Object.defineProperty(env, "jack.input", {
+ get: function() {
+ if (!input)
+ input = new IO(env['jack.servlet_request'].getInputStream(), null);
+ return input;
+ }
+ });
+ Object.defineProperty(env, "jack.errors", {
+ get: function() {
+ if (!errors)
+ errors = new IO(null, java.lang.System.err);
+ return errors;
+ }
+ });
}
/**
@@ -127,17 +142,22 @@
return;
if (!(result instanceof Array)) {
// convert helma response to jack response
- if (result && typeof result.close === "function")
+ if (result && typeof result.close === "function") {
result = result.close();
- else
- return;
+ } else {
+ return; // TODO generate error page?
+ }
}
var [status, headers, body] = result;
response.status = status;
for (var name in headers) {
response.setHeader(name, headers[name]);
}
- var writer = response.writer;
+ var charset = getSubHeader(HashP.get(headers, "content-type"), "charset");
+ if (charset) {
+ response.setCharacterEncoding(charset);
+ }
+ var writer = response.getWriter();
if (body && typeof body.forEach == "function") {
body.forEach(function(chunk) {
writer.write(String(chunk));
Modified: helma-ng/trunk/modules/helma/webapp/response.js
===================================================================
--- helma-ng/trunk/modules/helma/webapp/response.js 2009-04-27 09:07:11 UTC (rev 9676)
+++ helma-ng/trunk/modules/helma/webapp/response.js 2009-04-27 14:46:13 UTC (rev 9677)
@@ -1,6 +1,6 @@
include('hashp');
include('helma/buffer');
-import('helma/system', 'system');
+include('helma/webapp/util');
export('Response', 'SkinnedResponse', 'RedirectResponse' /*, 'NotFoundResponse', 'ServerErrorResponse'*/);
@@ -125,6 +125,11 @@
Object.defineProperty(this, 'setHeader', {
value: function(key, value) {
+ key = String(key);
+ if (key.toLowerCase() == "content-type") {
+ contentType = String(value);
+ charset = getSubHeader(contentType, "charset") || charset;
+ }
HashP.set(headers, String(key), String(value));
}
});
@@ -132,11 +137,10 @@
Object.defineProperty(this, 'close', {
value: function() {
this.flushDebug();
- if (charset) {
- contentType = contentType || HashP.get('content-type') || "text/html";
- contentType += "; charset=" + charset;
- }
- if (contentType) {
+ if (contentType && !HashP.includes(headers, 'content-type')) {
+ if (charset) {
+ contentType += "; charset=" + charset;
+ }
HashP.set(headers, "Content-Type", contentType);
}
return [status, headers, buffer];
Added: helma-ng/trunk/modules/helma/webapp/util.js