Fix message parser
The parser didn't take into accoun, that the arriving string can contain several messages
This commit is contained in:
parent
ff0d1b5eae
commit
0bcea4e753
|
@ -58,7 +58,7 @@ public class MyFreeCamsClient {
|
|||
private String chatToken;
|
||||
private int sessionId;
|
||||
|
||||
private EvictingQueue<String> receivedTextHistory = EvictingQueue.create(100);
|
||||
private EvictingQueue<String> receivedTextHistory = EvictingQueue.create(10000);
|
||||
|
||||
private MyFreeCamsClient() {
|
||||
moshi = new Moshi.Builder().build();
|
||||
|
@ -168,11 +168,7 @@ public class MyFreeCamsClient {
|
|||
msgBuffer.append(text);
|
||||
Message message;
|
||||
try {
|
||||
message = parseMessage(msgBuffer);
|
||||
if (message != null) {
|
||||
msgBuffer.setLength(0);
|
||||
}
|
||||
|
||||
while( (message = parseMessage(msgBuffer)) != null) {
|
||||
switch (message.getType()) {
|
||||
case NULL:
|
||||
break;
|
||||
|
@ -261,6 +257,7 @@ public class MyFreeCamsClient {
|
|||
LOG.debug("Unknown message {}", message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Throwable t) {
|
||||
|
@ -391,27 +388,30 @@ public class MyFreeCamsClient {
|
|||
model.update(state, getStreamUrl(state));
|
||||
}
|
||||
|
||||
private Message parseMessage(StringBuilder msg) throws UnsupportedEncodingException {
|
||||
if (msg.length() < 4) {
|
||||
private Message parseMessage(StringBuilder msgBuffer) throws UnsupportedEncodingException {
|
||||
if (msgBuffer.length() < 4) {
|
||||
// packet size not transmitted completely
|
||||
return null;
|
||||
} else {
|
||||
try {
|
||||
int packetLength = Integer.parseInt(msg.substring(0, 4));
|
||||
if (packetLength > msg.length() - 4) {
|
||||
int packetLength = Integer.parseInt(msgBuffer.substring(0, 4));
|
||||
if (packetLength > msgBuffer.length() - 4) {
|
||||
// packet not complete
|
||||
return null;
|
||||
} else {
|
||||
msg.delete(0, 4);
|
||||
int type = parseNextInt(msg);
|
||||
int sender = parseNextInt(msg);
|
||||
int receiver = parseNextInt(msg);
|
||||
int arg1 = parseNextInt(msg);
|
||||
int arg2 = parseNextInt(msg);
|
||||
return new Message(type, sender, receiver, arg1, arg2, URLDecoder.decode(msg.toString(), "utf-8"));
|
||||
msgBuffer.delete(0, 4);
|
||||
StringBuilder rawMessage = new StringBuilder(msgBuffer.substring(0, packetLength));
|
||||
int type = parseNextInt(rawMessage);
|
||||
int sender = parseNextInt(rawMessage);
|
||||
int receiver = parseNextInt(rawMessage);
|
||||
int arg1 = parseNextInt(rawMessage);
|
||||
int arg2 = parseNextInt(rawMessage);
|
||||
Message message = new Message(type, sender, receiver, arg1, arg2, URLDecoder.decode(rawMessage.toString(), "utf-8"));
|
||||
msgBuffer.delete(0, packetLength);
|
||||
return message;
|
||||
}
|
||||
} catch(Exception e) {
|
||||
LOG.error("StringBuilder contains invalid data {}", msg.toString(), e);
|
||||
LOG.error("StringBuilder contains invalid data {}", msgBuffer.toString(), e);
|
||||
String logfile = "mfc_messages.log";
|
||||
try(FileOutputStream fout = new FileOutputStream(logfile)) {
|
||||
for (String string : receivedTextHistory) {
|
||||
|
@ -423,7 +423,7 @@ public class MyFreeCamsClient {
|
|||
LOG.error("Couldn't write mfc message history to " + logfile);
|
||||
e1.printStackTrace();
|
||||
}
|
||||
msg.setLength(0);
|
||||
msgBuffer.setLength(0);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
@ -501,11 +501,9 @@ public class MyFreeCamsClient {
|
|||
if(serverConfig.isOnNgServer(state)) {
|
||||
String server = serverConfig.ngVideoServers.get(camserv.toString());
|
||||
streamUrl = "https://" + server + ".myfreecams.com:8444/x-hls/" + cxid + '/' + userChannel + '/' + ctxenc + "/mfc_" + phase + '_' + userChannel + ".m3u8";
|
||||
//LOG.debug("{} {}", state.getNm(), streamUrl);
|
||||
} else if(serverConfig.isOnWzObsVideoServer(state)) {
|
||||
String server = serverConfig.wzobsServers.get(camserv.toString());
|
||||
streamUrl = "https://"+ server + ".myfreecams.com/NxServer/ngrp:mfc_" + phase + '_' + userChannel + ".f4v_mobile/playlist.m3u8";
|
||||
LOG.debug("{} isOnWzObsvideo: {}", state.getNm(), streamUrl);
|
||||
} else if(serverConfig.isOnHtml5VideoServer(state)) {
|
||||
String server = serverConfig.h5Servers.get(camserv.toString());
|
||||
streamUrl = "https://"+ server + ".myfreecams.com/NxServer/ngrp:mfc_" + userChannel + ".f4v_mobile/playlist.m3u8";
|
||||
|
|
Loading…
Reference in New Issue