From 647a4acbc5fa62288576099e2ebf368e18f96951 Mon Sep 17 00:00:00 2001 From: Nyholm Date: Tue, 13 May 2014 09:01:25 +0200 Subject: [PATCH] Dont crash when getting output on str err --- src/com/googlecode/fcgi4j/FCGIConnection.java | 43 +++++++++++++++---- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/com/googlecode/fcgi4j/FCGIConnection.java b/src/com/googlecode/fcgi4j/FCGIConnection.java index aff34b6..854a8e9 100644 --- a/src/com/googlecode/fcgi4j/FCGIConnection.java +++ b/src/com/googlecode/fcgi4j/FCGIConnection.java @@ -48,6 +48,7 @@ public class FCGIConnection implements GatheringByteChannel, ScatteringByteChann private FCGIEndRequest endRequest; private boolean readStarted; private boolean bufferEmpty; + private boolean cleanStdErr; private SocketChannel socketChannel; private FCGIConnection() { @@ -166,6 +167,7 @@ public void beginRequest(String scriptFilename, String queryString, boolean keep stdinsWritten = false; stdinsFlushed = false; readStarted = false; + cleanStdErr = true; bufferEmpty = true; dataBuffer.clear(); @@ -245,6 +247,12 @@ private void readResponseHeaders() { } } + /** + * Read IP packet headers + * + * @return + * @throws IOException + */ private FCGIHeader readHeader() throws IOException { IoUtils.socketRread(socketChannel, headerBuffer); @@ -498,20 +506,30 @@ private void readyRead() throws IOException { flushParams(); flushStdins(); + FCGIHeader firstHeader; try { - FCGIHeader firstHeader = readHeader(); - if (firstHeader.getType() == FCGIHeaderType.FCGI_STDOUT) { - bufferStdoutData(firstHeader.getLength(), firstHeader.getPadding()); - } + firstHeader = readHeader(); } catch (FCGIUnKnownHeaderException e) { throw e; } - try { - readResponseHeaders(); - } catch (BufferUnderflowException e) { - throw new FCGIInvalidHeaderException(); + if (firstHeader.getType() == FCGIHeaderType.FCGI_STDOUT) { + bufferStdoutData(firstHeader.getLength(), firstHeader.getPadding()); + + try { + readResponseHeaders(); + } catch (BufferUnderflowException e) { + throw new FCGIInvalidHeaderException(); + } + } + + //if error + if (firstHeader.getType() == FCGIHeaderType.FCGI_STDERR) { + bufferStdoutData(firstHeader.getLength(), firstHeader.getPadding()); + + //Make a note that this request has errors + cleanStdErr = false; } readStarted = true; @@ -526,6 +544,15 @@ private void checkRequestFinished() { } } + /** + * Has this request posted anything on stderr? + * + * @return boolean + */ + public boolean hasOutputOnStdErr() { + return !cleanStdErr; + } + private int bufferStdoutData(int available, int padding) throws IOException { int read = readStdoutData(dataBuffer, available, padding);