RestApiServlet: Leave OutputStream open when flushing base64 padding
Some Java servlet containers fail if the response's OutputStream is closed twice by the application. This appears to contradict standard behavior in Java where most streams gracefully ignore extra close. Unfortunately the container is required to power gerrit-review and as such Gerrit needs to try to tolerate its behavior. Wrap the supplied OutputStream delegating all calls except for close(). No-op the close() method so the Java 7 try-with-resources block does not automatically close the servlet OutputStream, leaving this for the caller's finally block. Change-Id: I84bd3c8031580f805d5d4ef5d70f09b89e170450
This commit is contained in:
parent
373794473a
commit
a92bcf416c
@ -103,6 +103,7 @@ import org.slf4j.LoggerFactory;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.EOFException;
|
||||
import java.io.FilterOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
@ -740,10 +741,15 @@ public class RestApiServlet extends HttpServlet {
|
||||
b64 = new BinaryResult() {
|
||||
@Override
|
||||
public void writeTo(OutputStream out) throws IOException {
|
||||
try (OutputStreamWriter w = new OutputStreamWriter(out, ISO_8859_1);
|
||||
try (OutputStreamWriter w = new OutputStreamWriter(
|
||||
new FilterOutputStream(out) {
|
||||
@Override
|
||||
public void close() {
|
||||
// Do not close out, but only w and e.
|
||||
}
|
||||
}, ISO_8859_1);
|
||||
OutputStream e = BaseEncoding.base64().encodingStream(w)) {
|
||||
src.writeTo(e);
|
||||
e.flush();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user