Switch all servlets from PrintWriter to OutputStreamWriter ServletResponse.getWriter() returns a PrintWriter, which has this helpful tidbit in the Javadoc: "Methods in this class never throw I/O exceptions, although some of its constructors may. The client may inquire as to whether any errors have occurred by invoking checkError()." I can count the number of times we call checkError() in the Gitiles codebase on zero hands, nor do I want to start. Use the perfectly good OutputStreamWriter class instead. Change-Id: I7c17c65d6bd657bc8dc41a2ddd7a2bda34a58033
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java index 7990267..6f1f247 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/BaseServlet.java
@@ -33,7 +33,8 @@ import org.joda.time.Instant; import java.io.IOException; -import java.io.PrintWriter; +import java.io.OutputStreamWriter; +import java.io.Writer; import java.lang.reflect.Type; import java.util.Map; @@ -223,14 +224,14 @@ setApiHeaders(res, JSON); res.setStatus(SC_OK); - PrintWriter writer = res.getWriter(); + Writer writer = getWriter(res); new GsonBuilder() .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .setPrettyPrinting() .generateNonExecutableJson() .create() .toJson(src, typeOfSrc, writer); - writer.print('\n'); + writer.write('\n'); writer.close(); } @@ -241,10 +242,10 @@ * @param contentType contentType to set. * @return the response's writer. */ - protected PrintWriter startRenderText(HttpServletRequest req, HttpServletResponse res, + protected Writer startRenderText(HttpServletRequest req, HttpServletResponse res, String contentType) throws IOException { setApiHeaders(res, contentType); - return res.getWriter(); + return getWriter(res); } /** @@ -262,10 +263,9 @@ * @param res in-progress response. * @return the response's writer. */ - protected PrintWriter startRenderText(HttpServletRequest req, HttpServletResponse res) + protected Writer startRenderText(HttpServletRequest req, HttpServletResponse res) throws IOException { - setApiHeaders(res, TEXT); - return res.getWriter(); + return startRenderText(req, res, TEXT.getMimeType()); } /** @@ -283,7 +283,7 @@ res.setStatus(statusCode); setApiHeaders(res, TEXT); setCacheHeaders(res); - PrintWriter out = res.getWriter(); + Writer out = getWriter(res); out.write(message); out.close(); } @@ -320,4 +320,8 @@ res.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + filename); setCacheHeaders(res); } + + private Writer getWriter(HttpServletResponse res) throws IOException { + return new OutputStreamWriter(res.getOutputStream(), res.getCharacterEncoding()); + } }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java index 893089e..20b0367 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/DescribeServlet.java
@@ -32,7 +32,7 @@ import org.eclipse.jgit.lib.Repository; import java.io.IOException; -import java.io.PrintWriter; +import java.io.Writer; import java.util.List; import java.util.Map; @@ -64,7 +64,7 @@ if (name == null) { return; } - PrintWriter out = startRenderText(req, res); + Writer out = startRenderText(req, res); out.write(RefServlet.sanitizeRefForText(name)); out.close(); }
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java index 366ed4d..72b3d0f 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/HostIndexServlet.java
@@ -35,7 +35,7 @@ import org.slf4j.LoggerFactory; import java.io.IOException; -import java.io.PrintWriter; +import java.io.Writer; import java.util.Arrays; import java.util.Map; import java.util.Set; @@ -123,7 +123,7 @@ return; } - PrintWriter writer = startRenderText(req, res); + Writer writer = startRenderText(req, res); for (RepositoryDescription repo : descs.values()) { for (String name : branches) { String ref = repo.branches.get(name); @@ -131,11 +131,11 @@ // Print stub (forty '-' symbols) ref = "----------------------------------------"; } - writer.print(ref); - writer.print(' '); + writer.write(ref); + writer.write(' '); } - writer.print(GitilesUrls.NAME_ESCAPER.apply(repo.name)); - writer.print('\n'); + writer.write(GitilesUrls.NAME_ESCAPER.apply(repo.name)); + writer.write('\n'); } writer.flush(); writer.close();
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java index d134460..fe2ad47 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/PathServlet.java
@@ -56,7 +56,7 @@ import java.io.IOException; import java.io.OutputStream; -import java.io.PrintWriter; +import java.io.Writer; import java.util.List; import java.util.Map; import java.util.regex.Pattern; @@ -181,7 +181,7 @@ // under the assumption that any hint we can give to a browser that // this is base64 data might cause it to try to decode it and render // as HTML, which would be bad. - PrintWriter writer = startRenderText(req, res, null); + Writer writer = startRenderText(req, res, null); res.setHeader(MODE_HEADER, String.format("%06o", wr.type.mode.getBits())); try (OutputStream out = BaseEncoding.base64().encodingStream(writer)) { rw.getObjectReader().open(wr.id).copyTo(out);
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java index 4eaf7f3..bf0f75d 100644 --- a/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java +++ b/gitiles-servlet/src/main/java/com/google/gitiles/RefServlet.java
@@ -34,7 +34,7 @@ import org.eclipse.jgit.transport.RefAdvertiser; import java.io.IOException; -import java.io.PrintWriter; +import java.io.Writer; import java.util.Collection; import java.util.List; import java.util.Map; @@ -188,9 +188,9 @@ } private static class TextRefAdvertiser extends RefAdvertiser { - private final PrintWriter writer; + private final Writer writer; - private TextRefAdvertiser(PrintWriter writer) { + private TextRefAdvertiser(Writer writer) { this.writer = writer; } @@ -201,7 +201,7 @@ @Override protected void writeOne(CharSequence line) throws IOException { - writer.print(line); + writer.append(line); } @Override