66 lines
1.3 KiB
Java
66 lines
1.3 KiB
Java
package dev.peerat.framework;
|
|
|
|
import java.io.IOException;
|
|
|
|
import dev.peerat.framework.utils.json.Json;
|
|
|
|
public class WebSocketReader extends HttpReader{
|
|
|
|
public WebSocketReader(HttpReader origin) throws Exception{
|
|
super(origin);
|
|
}
|
|
|
|
public <J extends Json> J readJson() throws Exception{
|
|
return JSON_PARSER.parse(readLine());
|
|
}
|
|
|
|
@Override
|
|
public String readLine() throws IOException{
|
|
//read websocket found on StackOverFlow
|
|
int buffLenth = 1024;
|
|
int len = 0;
|
|
byte[] b = new byte[buffLenth];
|
|
// rawIn is a Socket.getInputStream();
|
|
while (true){
|
|
len = read(b);
|
|
if (len != -1){
|
|
byte rLength = 0;
|
|
int rMaskIndex = 2;
|
|
int rDataStart = 0;
|
|
// b[0] is always text in my case so no need to check;
|
|
byte data = b[1];
|
|
byte op = (byte) 127;
|
|
rLength = (byte) (data & op);
|
|
|
|
if (rLength == (byte) 126)
|
|
rMaskIndex = 4;
|
|
if (rLength == (byte) 127)
|
|
rMaskIndex = 10;
|
|
|
|
byte[] masks = new byte[4];
|
|
|
|
int j = 0;
|
|
int i = 0;
|
|
for (i = rMaskIndex; i < (rMaskIndex + 4); i++){
|
|
masks[j] = b[i];
|
|
j++;
|
|
}
|
|
|
|
rDataStart = rMaskIndex + 4;
|
|
|
|
int messLen = len - rDataStart;
|
|
|
|
byte[] message = new byte[messLen];
|
|
|
|
for (i = rDataStart, j = 0; i < len; i++, j++){
|
|
message[j] = (byte) (b[i] ^ masks[j % 4]);
|
|
}
|
|
|
|
return new String(message);
|
|
|
|
} else
|
|
break;
|
|
}
|
|
return null;
|
|
}
|
|
}
|