Commit
Using Charset configured in Eclipse when reading local files. Fallback to UTF-8 if charset is unknown Fixed the "content-length" response header value Also, the returned content is encoded with the charset provided in the request's "accept" header.
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,6 +13,7 @@ | |
|
||
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.nio.charset.Charset; | ||
|
||
import javax.servlet.ServletException; | ||
import javax.servlet.http.HttpServlet; | ||
|
@@ -21,6 +22,7 @@ | |
|
||
import org.apache.commons.io.IOUtils; | ||
import org.jboss.tools.livereload.core.internal.JBossLiveReloadCoreActivator; | ||
import org.jboss.tools.livereload.core.internal.util.HttpUtils; | ||
import org.jboss.tools.livereload.core.internal.util.Logger; | ||
|
||
/** | ||
|
@@ -33,13 +35,26 @@ public class LiveReloadScriptFileServlet extends HttpServlet { | |
private static final long serialVersionUID = 163695311668462503L; | ||
|
||
@Override | ||
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { | ||
Logger.info("Serving embedded /livereload.js"); | ||
HttpServletResponse httpServletResponse = (HttpServletResponse) response; | ||
final InputStream scriptContent = JBossLiveReloadCoreActivator.getDefault().getResourceContent("/script/livereload.js"); | ||
httpServletResponse.getOutputStream().write(IOUtils.toByteArray(scriptContent)); | ||
httpServletResponse.setStatus(200); | ||
httpServletResponse.setContentType("text/javascript"); | ||
protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException { | ||
InputStream scriptContent = null; | ||
try { | ||
Logger.info("Serving embedded /livereload.js"); | ||
final HttpServletResponse httpServletResponse = (HttpServletResponse) response; | ||
scriptContent = JBossLiveReloadCoreActivator.getDefault().getResourceContent("/script/livereload.js"); | ||
if(scriptContent == null) { | ||
httpServletResponse.setStatus(404); | ||
} else { | ||
final Charset charset = HttpUtils.getContentCharSet(request.getHeader("accept"), "UTF-8"); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
xcoulon
Author
Member
|
||
httpServletResponse.setContentType("text/javascript; charset=" + charset.name()); | ||
// output content will use the charset defined in the content type above. | ||
httpServletResponse.getOutputStream().write(IOUtils.toByteArray(scriptContent)); | ||
httpServletResponse.setStatus(200); | ||
} | ||
} finally { | ||
if(scriptContent != null) { | ||
scriptContent.close(); | ||
} | ||
} | ||
} | ||
|
||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,6 +14,9 @@ | |
import java.io.IOException; | ||
import java.io.InputStream; | ||
import java.net.UnknownHostException; | ||
import java.nio.ByteBuffer; | ||
import java.nio.CharBuffer; | ||
import java.nio.charset.Charset; | ||
|
||
import javax.servlet.Filter; | ||
import javax.servlet.FilterChain; | ||
|
@@ -122,7 +125,8 @@ private void terminate(final HttpServletRequest httpRequest, | |
returnedContentType); | ||
final InputStream responseStream = responseWrapper.getResponseAsStream(); | ||
final char[] modifiedResponseContent = ScriptInjectionUtils.injectContent(responseStream, scriptContent); | ||
responseWrapper.terminate(modifiedResponseContent); | ||
final Charset charset = HttpUtils.getContentCharSet(returnedContentType, "UTF-8"); | ||
responseWrapper.terminate(modifiedResponseContent, charset); | ||
} | ||
// finalize the responseWrapper by copying the wrapper's | ||
// outputstream into the response outputstream that will be returned | ||
|
@@ -184,24 +188,29 @@ public ServletOutputStream getOutputStream() throws IOException { | |
public InputStream getResponseAsStream() throws IOException { | ||
final byte[] byteArray = responseOutputStream.toByteArray(); | ||
responseOutputStream.close(); | ||
return IOUtils.toInputStream(new String(byteArray), getCharacterEncoding()); | ||
final String characterEncoding = getCharacterEncoding(); | ||
return IOUtils.toInputStream(new String(byteArray, characterEncoding), characterEncoding); | ||
} | ||
|
||
/** | ||
* Writes the given content into the wrapped {@link HttpServletResponse} | ||
* and adjust the 'content-length' response header as well (in case | ||
* content modification occurred in the response entity). | ||
* | ||
* @param responseContent the content of the response. | ||
* @param encoding the ecnoding to use when writing the char[] content into the response's outputstream. | ||
* | ||
* @throws IOException | ||
*/ | ||
public void terminate(final char[] responseContent) throws IOException { | ||
((HttpServletResponse) getResponse()).setHeader("Content-length", Integer.toString(responseContent.length)); | ||
IOUtils.write(responseContent, getResponse().getOutputStream()); | ||
// getResponse().getOutputStream().flush(); | ||
// getResponse().getOutputStream().close(); | ||
public void terminate(final char[] responseContent, final Charset charset) throws IOException { | ||
// see http://mark.koli.ch/2009/09/remember-kids-an-http-content-length-is-the-number-of-bytes-not-the-number-of-characters.html | ||
final CharBuffer charBuffer = CharBuffer.wrap(responseContent); | ||
final ByteBuffer byteBuffer = charset.encode(charBuffer); | ||
((HttpServletResponse) getResponse()).setHeader("Content-length", Integer.toString(byteBuffer.array().length)); | ||
IOUtils.write(responseContent, getResponse().getOutputStream(), charset.name()); | ||
This comment has been minimized.
Sorry, something went wrong.
tan9
|
||
responseOutputStream.close(); | ||
} | ||
|
||
/** | ||
* Writes the content of the internal and temporary | ||
* {@link ByteArrayOutputStream} into the wrapped | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
eclipse.preferences.version=1 | ||
encoding//projects/sample-static-site/WebContent/chinese.html=UTF-8 | ||
encoding//src/org/jboss/tools/livereload/internal/server/jetty/LiveReloadServerTestCase.java=UTF-8 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="UTF-8"> | ||
</head> | ||
<body> | ||
中文 | ||
</body> | ||
</html> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
<!DOCTYPE html> | ||
<html> | ||
<head> | ||
<meta charset="UTF-8"> | ||
</head> | ||
<body> | ||
中文 | ||
</body> | ||
</html> |
Can we set the default encoding form hard-coded "UTF-8" to the encoding set in eclipse project Properties / Resource / Text file encoding or eclipse Preferences / General / Workspace / Text file encoding?