Skip to content

Commit ebade38

Browse files
Change Charset encoding to use method compatible with JRE < 6 and Android < 9
1 parent 7454f31 commit ebade38

File tree

7 files changed

+51
-14
lines changed

7 files changed

+51
-14
lines changed

android/net/rcode/wsclient/AndroidWebSocket.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public void run() {
4242
*/
4343
public AndroidWebSocket(Handler handler, String url, String... requestedProtocols) {
4444
super(url, requestedProtocols);
45-
handler=new Handler();
45+
this.handler=new Handler();
4646
}
4747

4848
@Override
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.rcode.wsclient;
2+
3+
import org.junit.Test;
4+
import static org.junit.Assert.*;
5+
6+
public class UtilTest {
7+
8+
@Test
9+
public void testGetUTF8Bytes() {
10+
byte[] buffer=Util.getUTF8Bytes("123");
11+
assertEquals(3, buffer.length);
12+
assertEquals((byte)'1', buffer[0]);
13+
assertEquals((byte)'2', buffer[1]);
14+
assertEquals((byte)'3', buffer[2]);
15+
}
16+
}

src/net/rcode/wsclient/Message.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package net.rcode.wsclient;
22

3-
import java.nio.charset.Charset;
43

54
public class Message {
65
private static final byte[] EMPTY_BYTES=new byte[0];
7-
private static final Charset UTF8=Charset.forName("UTF8");
86

97
// -- message opcodes
108
public static final int OPCODE_CONTINUATION=0;
@@ -26,7 +24,7 @@ public Message(int opcode, byte[] messageData, boolean userMessage) {
2624
}
2725

2826
public Message(String textMessage) {
29-
this(OPCODE_TEXT, textMessage.getBytes(UTF8), true);
27+
this(OPCODE_TEXT, Util.getUTF8Bytes(textMessage), true);
3028
}
3129

3230
public Message(byte[] binaryMessage) {
@@ -52,8 +50,8 @@ public boolean isText() {
5250
return opcode==OPCODE_TEXT;
5351
}
5452

55-
public String getMessageText() {
56-
if (isText()) return new String(messageData, UTF8);
53+
public CharSequence getMessageText() {
54+
if (isText()) return Util.fromUTF8Bytes(messageData);
5755
else throw new IllegalStateException("Not text based message");
5856
}
5957

@@ -67,7 +65,7 @@ public byte[] getMessageData() {
6765

6866
@Override
6967
public String toString() {
70-
if (opcode==OPCODE_TEXT) return getMessageText();
68+
if (opcode==OPCODE_TEXT) return getMessageText().toString();
7169
else if (messageData!=null ){
7270
StringBuilder ret=new StringBuilder();
7371
for (byte b: messageData) {

src/net/rcode/wsclient/Util.java

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.rcode.wsclient;
2+
3+
import java.nio.ByteBuffer;
4+
import java.nio.CharBuffer;
5+
import java.nio.charset.Charset;
6+
7+
public class Util {
8+
public static final Charset UTF8=Charset.forName("UTF8");
9+
10+
public static byte[] getUTF8Bytes(CharSequence s) {
11+
// The String.getBytes(Charset) method was not implemented until Java 6/Android 9
12+
// For compatibility with older runtimes, implement it here in terms of its
13+
// primitives
14+
ByteBuffer bb=UTF8.encode(CharBuffer.wrap(s));
15+
byte[] ret=new byte[bb.remaining()];
16+
bb.get(ret);
17+
return ret;
18+
}
19+
20+
public static CharSequence fromUTF8Bytes(byte[] bytes) {
21+
ByteBuffer bb=ByteBuffer.wrap(bytes);
22+
CharBuffer charBuffer=UTF8.decode(bb);
23+
return charBuffer;
24+
}
25+
}

src/net/rcode/wsclient/WireProtocol.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import java.net.URI;
99
import java.nio.ByteBuffer;
1010
import java.nio.CharBuffer;
11-
import java.nio.charset.Charset;
1211
import java.nio.charset.CharsetDecoder;
1312
import java.security.MessageDigest;
1413
import java.security.NoSuchAlgorithmException;
@@ -24,7 +23,6 @@
2423
*
2524
*/
2625
public class WireProtocol {
27-
protected static final Charset UTF8=Charset.forName("UTF8");
2826
protected static final Random random=new Random();
2927
protected static final Pattern VERIFY_STATUSLINE_PATTERN=Pattern.compile("^HTTP\\/[^ ]+ 101 ");
3028

@@ -82,7 +80,7 @@ public void performHandshake(WebSocket socket, URI uri, DataInputStream in, Data
8280
request.append("\r\n");
8381

8482
//System.out.println("Sending request \n'" + request + "'");
85-
out.write(request.toString().getBytes(UTF8));
83+
out.write(Util.getUTF8Bytes(request));
8684
//out.flush(); // Give proxys a better chance of dealing with what follows
8785
out.write(quad);
8886
out.flush();
@@ -220,7 +218,7 @@ protected String readLine(InputStream in) throws IOException {
220218
StringBuilder ret=new StringBuilder(256);
221219

222220
boolean verifyLf=false;
223-
CharsetDecoder decoder=UTF8.newDecoder();
221+
CharsetDecoder decoder=Util.UTF8.newDecoder();
224222
byte[] source=new byte[256];
225223
char[] dest=new char[256];
226224
ByteBuffer sourceBuffer=ByteBuffer.wrap(source);

src/net/rcode/wsclient/WireProtocolDraft03.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void performHandshake(WebSocket socket, URI uri, DataInputStream in,
3333
@Override
3434
public void initiateClose(WebSocket socket) {
3535
synchronized (socket) {
36-
byte[] cookie="clientclose".getBytes(UTF8);
36+
byte[] cookie=Util.getUTF8Bytes("clientclose");
3737

3838
if (socket.getReadyState()==WebSocket.OPEN) {
3939
socket.setReadyState(WebSocket.CLOSING);

test/net/rcode/wsclient/TestEchoServerDraft76.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ public void handleEvent(Event event) {
2626
if (event.getType()==WebSocket.EVENT_MESSAGE) {
2727
Message msg=event.getMessage();
2828
if (msg.isText()) {
29-
String text=msg.getMessageText();
29+
CharSequence text=msg.getMessageText();
3030
System.out.println("Received message: " + text);
3131
synchronized (messages) {
32-
messages.add(text);
32+
messages.add(text.toString());
3333
messages.notify();
3434
}
3535
}

0 commit comments

Comments
 (0)