diff --git a/test/decoder_spec.js b/test/decoder_spec.js index db38821df..3ed0dbda3 100644 --- a/test/decoder_spec.js +++ b/test/decoder_spec.js @@ -2,17 +2,50 @@ var should = require('should'), needle = require('./../'), Q = require('q'), chardet = require('jschardet'), + fs = require('fs'), + http = require('http'), helpers = require('./helpers'); describe('character encoding', function() { - var url; this.timeout(5000); describe('Given content-type: "text/html; charset=EUC-JP"', function() { - before(function() { - url = 'http://www.nina.jp/server/slackware/webapp/tomcat_charset.html'; + var port = 2233; + var server; + + function createServer() { + return http.createServer(function(req, res) { + + req.on('data', function(chunk) {}) + + req.on('end', function() { + // We used to pull from a particular site that is no longer up. + // This is a local mirror pulled from archive.org + // https://web.archive.org/web/20181003202907/http://www.nina.jp/server/slackware/webapp/tomcat_charset.html + fs.readFile('test/tomcat_charset.html', function(err, data) { + if (err) { + res.writeHead(404); + res.end(JSON.stringify(err)); + return; + } + res.writeHeader(200, { 'Content-Type': 'text/html; charset=EUC-JP' }) + res.end(data); + }); + }) + + }) + } + + before(function(done) { + server = createServer(); + server.listen(port, done) + url = 'http://localhost:' + port; + }) + + after(function(done) { + server.close(done) }) describe('with decode = false', function() { diff --git a/test/output_spec.js b/test/output_spec.js index 64b7be849..ecda05c78 100644 --- a/test/output_spec.js +++ b/test/output_spec.js @@ -116,7 +116,7 @@ describe('with output option', function() { }) }) - if (process.platform != 'win32') { + if (process.platform == 'linux') { it('closes the file descriptor', function(done) { var open_descriptors = get_open_file_descriptors(); send_request(file + Math.random(), function(err, resp) { @@ -174,14 +174,16 @@ describe('with output option', function() { }) }) - it('closes the file descriptor', function(done) { - var open_descriptors = get_open_file_descriptors(); - send_request(file + Math.random(), function(err, resp) { - var current_descriptors = get_open_file_descriptors(); - open_descriptors.should.eql(current_descriptors); - done() + if (process.platform == 'linux') { + it('closes the file descriptor', function(done) { + var open_descriptors = get_open_file_descriptors(); + send_request(file + Math.random(), function(err, resp) { + var current_descriptors = get_open_file_descriptors(); + open_descriptors.should.eql(current_descriptors); + done() + }) }) - }) + } }) @@ -243,7 +245,7 @@ describe('with output option', function() { }) }) - if (process.platform != 'win32') { + if (process.platform == 'linux') { it('closes the file descriptor', function(done) { var open_descriptors = get_open_file_descriptors(); send_request(file + Math.random(), function(err, resp) { diff --git a/test/request_stream_spec.js b/test/request_stream_spec.js index 0dfcb791d..8f375339a 100644 --- a/test/request_stream_spec.js +++ b/test/request_stream_spec.js @@ -59,23 +59,6 @@ describe('request stream length', function() { }) }) - if (node_major_ver >= 10) { - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - } else { - it('doesnt work if Transfer-Encoding is set to a blank string', function(done) { - send_request({ headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - } - it('works if Transfer-Encoding is not set', function(done) { send_request({}, function(err, resp) { should.not.exist(err); @@ -86,45 +69,6 @@ describe('request stream length', function() { }) - describe('stream_length set to invalid value', function() { - - if (node_major_ver >= 10) { - - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 5, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - - it('returns 400 if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 5 }, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - - } else { - - it('doesnt work if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 5, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - it('doesnt work if Transfer-Encoding is not set', function(done) { - send_request({ stream_length: 5 }, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - - } - - }) - describe('stream_length is set to valid value', function() { it('sets Content-Length header to that value', function(done) { @@ -206,23 +150,6 @@ describe('request stream length', function() { }) }) - if (node_major_ver >= 10) { - it('returns 400 if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 0, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - should.not.exist(err); - resp.statusCode.should.eql(400); - done() - }) - }) - } else { - it('throws ECONNRESET if Transfer-Encoding is set to a blank string', function(done) { - send_request({ stream_length: 0, headers: { 'Transfer-Encoding': '' }}, function(err, resp) { - err.code.should.eql('ECONNRESET'); - done() - }) - }) - } - it('works if Transfer-Encoding is not set', function(done) { send_request({ stream_length: 0 }, function(err, resp) { should.not.exist(err); diff --git a/test/tomcat_charset.html b/test/tomcat_charset.html new file mode 100644 index 000000000..f849f7c05 --- /dev/null +++ b/test/tomcat_charset.html @@ -0,0 +1,342 @@ + + + + + + + + + + + + + + +TomcatでUTF-8/EUCを使う + + + + + + +
The Wayback Machine - https://web.archive.org/web/20181003202907/http://www.nina.jp:80/server/slackware/webapp/tomcat_charset.html
+ + +

TomcatでUTF-8/EUC-JPを使う

+

+[サーバの実験室 Slackware] +

+

+作成 : 2004/12/31 +

+
+

+"サーバの実験室"の検索 + + + +

+
+
+ +

+Tomcatから返されるキャラクタセットの情報は、httpd.confのルートで指定したAddDefaultCharsetの値と同じになるらしい。 +Directoryディレクティブの中で指定したAddDefaultCharsetは無視されるっぽい。 +ついでに、metaタグも無視されるみたい。 +(<---このへん、後述のSetCharacterEncodingFilterがちゃんと動作しないこともあり、自信なし...) +

+ +

+うちのWEBサーバはルートのAddDefaultCharsetでEUC-JP指定をしており、コンテキストパス以下はUTF-8にしたいので、なんらかの対策をしないと文字化けしてしまう。 +

+ +

サーブレットの場合

+

+response.setContentTypeでキャラクタセットを指定する。 +EUC-JPを使用するなら、response.setContentType("text/html; charset=EUC-JP")。 +UTF-8を使用するなら、response.setContentType("text/html; charset=UTF-8")。 +

+
+# HelloWorld.java
+
+import java.io.*;
+import java.text.*;
+import java.util.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
+
+public class HelloWorld extends HttpServlet {
+
+    public void doGet(HttpServletRequest request,
+                      HttpServletResponse response)
+        throws IOException, ServletException
+    {
+        response.setContentType("text/html; charset=EUC-JP");
+        PrintWriter out = response.getWriter();
+
+        out.println("<html>");
+        out.println("<head>");
+        out.println("<title>HelloWorld</title>");
+        out.println("</head>");
+        out.println("<body>");
+        out.println("<p>");
+        out.println("こんにちは世界");
+        out.println("</p>");
+        out.println("</body>");
+        out.println("</html>");
+    }
+}
+
+

+JAVAはUTF-8で処理を行うので、それ以外のEUC-JPなどを使用する場合は、コンパイルするときに-encodingをつけること。 +

+
+# javac -encoding EUC-JP -classpath .:$CATALINA_HOME/common/lib/servlet-api.jar HelloWorld.java
+
+ +

JSPの場合

+

+ディレクティブでキャラクタセットを指定する。 +EUC-JPを使用するなら、<%@ page contentType="text/html; charset=EUC-JP" %>。 +UTF-8を使用するなら、<%@ page contentType="text/html; charset=UTF-8" %>。 +

+
+# hello.jsp
+
+<%@ page contentType="text/html; charset=EUC-JP" %>
+<html>
+<head>
+<title>HelloWorld</title>
+</head>
+<body>
+<p>
+<%
+    out.println("こんにちは世界");
+%>
+</p>
+</body>
+</html>
+
+ +

静的コンテンツ(HTML)の場合

+

+workers2.propetiesファイルで、コンテキストパス以下のすべてのファイルをTomcatに渡すよう設定している場合、静的コンテンツについてもこのページの先頭に書いたようなキャラクタセット情報が返される。 +HTMLのmetaタグでcharsetを指定しても無視されるので、ドキュメントルートとコンテキストパスで異なるキャラクタセットを使用したいときは注意が必要。 +

+
+# workers2.properties
+
+[uri:/hoge/*]    <---すべてのファイルをTomcatに処理させる
+
+

+通常はSetCharacterEncodingFilterを利用するのが常套手段のようだが、どうやってもcharsetを返してくれない。 +しかたないので、web.xml<mime-mapping>でcharsetと拡張子の関連付けを指定した。 +

+
+<!--(コンテキストパス)/WEB-INF/web.xml-->
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE web-app
+     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+    "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+  <mime-mapping>
+    <extension>html</extension>
+    <mime-type>text/html; charset=UTF-8</mime-type>
+  </mime-mapping>
+</web-app>
+
+

+いちおう、SetCharacterEncodingFilterを利用する方法を書いておくと、$CATALINA_HOME/webapps/jsp-examples/WEB-INF/classes/filtersディレクトリにあるSetCharacterEncodingFilter.javaをコンパイルして、 +

+
+# cd $CATALINA_HOME/webapps/jsp-examples/WEB-INF/classes
+# javac -classpath .:$CATALINA_HOME/common/lib/servlet-api.jar filters.SetCharacterEncodingFilter.java
+
+

+生成されたクラスファイルを(コンテキストパス)/WEB-INF/classes/filtersディレクトリにコピーして、(コンテキストパス)/WEB-INF/web.xmlにフィルタの設定を記述するだけらしい。 +

+
+<!--(コンテキストパス)/WEB-INF/web.xml-->
+
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE web-app
+     PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+    "http://java.sun.com/dtd/web-app_2_3.dtd">
+<web-app>
+  <filter>
+      <filter-name>Set Character Encoding</filter-name>
+      <filter-class>filters.SetCharacterEncodingFilter</filter-class>
+      <init-param>
+          <param-name>encoding</param-name>
+          <param-value>UTF-8</param-value>
+      </init-param>
+  </filter>
+  <filter-mapping>
+      <filter-name>Set Character Encoding</filter-name>
+      <url-pattern>/*</url-pattern>
+  </filter-mapping>
+</web-app>
+
+

+うむむ... +

+ +
+

+[サーバの実験室 Slackware] +

+ + + + + \ No newline at end of file