Skip to content

Commit eb88f0e

Browse files
committed
Optimise WebSocket client processing of server HTTP responses
1 parent 9d6b87c commit eb88f0e

2 files changed

Lines changed: 12 additions & 10 deletions

File tree

java/org/apache/tomcat/websocket/WsWebSocketContainer.java

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,7 @@ private HttpResponse processResponse(ByteBuffer response, AsyncChannelWrapper ch
858858
int status = 0;
859859
boolean readStatus = false;
860860
boolean readHeaders = false;
861+
StringBuilder lineBuffer = new StringBuilder();
861862
String line = null;
862863
while (!readHeaders) {
863864
// On entering loop buffer will be empty and at the start of a new
@@ -880,14 +881,13 @@ private HttpResponse processResponse(ByteBuffer response, AsyncChannelWrapper ch
880881
}
881882
response.flip();
882883
while (response.hasRemaining() && !readHeaders) {
883-
if (line == null) {
884-
line = readLine(response);
885-
} else {
886-
line += readLine(response);
884+
if (readLine(response, lineBuffer)) {
885+
line = lineBuffer.toString();
886+
lineBuffer = new StringBuilder();
887887
}
888888
if ("\r\n".equals(line)) {
889889
readHeaders = true;
890-
} else if (line.endsWith("\r\n")) {
890+
} else if (line != null && line.endsWith("\r\n")) {
891891
if (readStatus) {
892892
parseHeaders(line, headers);
893893
} else {
@@ -937,20 +937,18 @@ private void parseHeaders(String line, Map<String,List<String>> headers) {
937937
values.add(headerValue);
938938
}
939939

940-
private String readLine(ByteBuffer response) {
940+
private boolean readLine(ByteBuffer response, StringBuilder sb) {
941941
// All ISO-8859-1
942-
StringBuilder sb = new StringBuilder();
943-
944942
char c;
945943
while (response.hasRemaining()) {
946944
c = (char) response.get();
947945
sb.append(c);
948946
if (c == 10) {
949-
break;
947+
return true;
950948
}
951949
}
952950

953-
return sb.toString();
951+
return false;
954952
}
955953

956954

webapps/docs/changelog.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,10 @@
373373
available buffer. Fix written by GPT-5.5. Test case written by Hironori
374374
Ichimiya. (markt)
375375
</fix>
376+
<fix>
377+
Optimise WebSocket client processing of server responses during
378+
WebSocket HTTP upgrade process. (markt)
379+
</fix>
376380
</changelog>
377381
</subsection>
378382
<subsection name="Web applications">

0 commit comments

Comments
 (0)