Revert "Simplified writeOutgoingMessages() and removed the call to internalProcessResponses(). Likely bugs in writeClientBoundMessage()."
This reverts commit 29ade9b7b0.
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user