Revert "Simplified writeOutgoingMessages() and removed the call to internalProcessResponses(). Likely bugs in writeClientBoundMessage()."

This reverts commit 29ade9b7b0.
This commit is contained in:
wcrisman
2014-12-26 10:17:15 -08:00
parent 72fa63028e
commit 6c9931d4f9

View File

@@ -1651,100 +1651,24 @@ public class WebServer {
* @see com.foundation.web.server.WebServer.AbstractSocketContext#processResponses() * @see com.foundation.web.server.WebServer.AbstractSocketContext#processResponses()
*/ */
protected void writeOutgoingMessages() throws IOException { protected void writeOutgoingMessages() throws IOException {
Debug.log(id + "," + System.nanoTime() + "," + "Writing outgoing messages."); if(getPassThroughSocketContext() != null) {
if(key.channel().isOpen() && currentOutboundMessage != null) { //Synchronized to avoid multiple threads accessing the pendingOutboundMessage chain at one time and updating the write flag out of order (could happen if we enabled request chaining over a single socket).//
writeClientBoundMessage(); synchronized(this) {
writeClientBoundMessage();
}//synchronized//
}//if// }//if//
else if(isWebsocket) {
//Right after upgrading the socket we have one last HTTP response to process.//
if(currentResponse != null) {
internalProcessResponses();
}//if//
internalProcessWebsocketMessages();
}//else if//
else { else {
Debug.log(id + "," + System.nanoTime() + "," + "No outgoing messages to write!."); //Go directly to writing the client response if we are just passing everything through to another process.//
internalProcessResponses();
}//else// }//else//
//OLD CODE
// if(getPassThroughSocketContext() != null) {
// //Synchronized to avoid multiple threads accessing the pendingOutboundMessage chain at one time and updating the write flag out of order (could happen if we enabled request chaining over a single socket).//
// synchronized(this) {
// writeClientBoundMessage();
// }//synchronized//
// }//if//
// else if(isWebsocket) {
// //Right after upgrading the socket we have one last HTTP response to process.//
// if(currentResponse != null) {
// writeClientBoundMessage();
// }//if//
//
// internalProcessWebsocketMessages();
// }//else if//
// else {
// //Go directly to writing the client response if we are just passing everything through to another process.//
// internalProcessResponses();
// }//else//
//NEW CODE
// boolean keepSending = true;
//
// //Synchronized to avoid multiple threads accessing the currentOutboundMessage chain at one time.//
// synchronized(this) {
// keepSending = currentOutboundMessage != null;
// }//synchronized//
//
// //Keep sending responses while the buffers are not full and there is another response to send.//
// while(key.channel().isOpen() && keepSending) {
// //Send the pending response object's prepared buffer of data.//
// writeClientBoundMessage();
//
// //If we finished the message then load the next message, otherwise flag that we need to stop sending (buffers full - flag a write on the socket's key and wait).//
// if(currentOutboundMessage.isClosed()) {
// //Synchronized to avoid multiple threads accessing the currentOutboundMessage chain at one time.//
// synchronized(this) {
// currentOutboundMessage = currentOutboundMessage.getNext();
// keepSending = currentOutboundMessage != null;
// }//synchronized//
// }//if//
// else {
// keepSending = false;
// }//else//
// }//while//
}//writeOutgoingMessages()//
/**
* @return
*/
private synchronized void internalProcessResponses() {
boolean finishedSending = true;
//Keep sending responses while the buffers are not full and there is another response to send.//
while(finishedSending && currentResponse != null) {
//If the socket is open then send the next buffer of data.//
if(key.channel().isOpen()) {
//Send the pending response object's prepared buffer of data.//
finishedSending = writeClientBoundMessage();
}//if//
//Close the response if successfully sent, or if the socket is closed.//
if(finishedSending || !key.channel().isOpen()) {
try {currentResponse.close();} catch(Throwable e) {}
}//if//
//If we finished sending the current response then load the next one.//
if(finishedSending) {
currentResponse = currentResponse.getNextResponse();
if(currentResponse == null) {
lastResponse = null;
}//if//
else if(key.channel().isOpen()) {
//Prep the next response object for sending.//
prepareResponse();
}//else//
else {
//Clean up after all the left over responses.//
while(currentResponse != null) {
currentResponse.close();
currentResponse = currentResponse.getNextResponse();
}//while//
currentResponse = null;
lastResponse = null;
}//else//
}//if//
}//while//
}//processCurrentResponse()// }//processCurrentResponse()//
/** /**
* Loads the next outbound websocket message and attempts to write it to the socket until all outbound messages have been sent, or the socket's buffers are full and a wait is required. * Loads the next outbound websocket message and attempts to write it to the socket until all outbound messages have been sent, or the socket's buffers are full and a wait is required.
@@ -1870,6 +1794,49 @@ public class WebServer {
websocketStreamingMessage = null; websocketStreamingMessage = null;
}//else// }//else//
}//loadNextWebsocketMessage()// }//loadNextWebsocketMessage()//
/**
* @return
*/
private synchronized void internalProcessResponses() {
boolean finishedSending = true;
//Keep sending responses while the buffers are not full and there is another response to send.//
while(finishedSending && currentResponse != null) {
//If the socket is open then send the next buffer of data.//
if(key.channel().isOpen()) {
//Send the pending response object's prepared buffer of data.//
finishedSending = writeClientBoundMessage();
}//if//
//Close the response if successfully sent, or if the socket is closed.//
if(finishedSending || !key.channel().isOpen()) {
try {currentResponse.close();} catch(Throwable e) {}
}//if//
//If we finished sending the current response then load the next one.//
if(finishedSending) {
currentResponse = currentResponse.getNextResponse();
if(currentResponse == null) {
lastResponse = null;
}//if//
else if(key.channel().isOpen()) {
//Prep the next response object for sending.//
prepareResponse();
}//else//
else {
//Clean up after all the left over responses.//
while(currentResponse != null) {
currentResponse.close();
currentResponse = currentResponse.getNextResponse();
}//while//
currentResponse = null;
lastResponse = null;
}//else//
}//if//
}//while//
}//processCurrentResponse()//
/** /**
* Sends a response to the client. * Sends a response to the client.
* @return Whether the response could be fully sent. This will be false if there is still more data to be written when the call returns. * @return Whether the response could be fully sent. This will be false if there is still more data to be written when the call returns.