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