Skip to content

Commit

Permalink
Dont crash when getting output on str err
Browse files Browse the repository at this point in the history
  • Loading branch information
Nyholm committed May 13, 2014
1 parent 7384e1f commit 647a4ac
Showing 1 changed file with 35 additions and 8 deletions.
43 changes: 35 additions & 8 deletions src/com/googlecode/fcgi4j/FCGIConnection.java
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -245,6 +247,12 @@ private void readResponseHeaders() {
}
}

/**
* Read IP packet headers
*
* @return
* @throws IOException
*/
private FCGIHeader readHeader() throws IOException {
IoUtils.socketRread(socketChannel, headerBuffer);

Expand Down Expand Up @@ -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;
Expand All @@ -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);

Expand Down

0 comments on commit 647a4ac

Please sign in to comment.