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