Initial commit

This commit is contained in:
Naoyuki Kanezawa
2013-04-22 03:37:28 +09:00
commit 53f1f5b544
16 changed files with 1694 additions and 0 deletions

View File

@@ -0,0 +1,116 @@
package com.github.nkzawa.engineio.parser;
import java.util.HashMap;
import java.util.Map;
public class Parser {
public static final int protocol = 2;
public static final Map<String, Integer> packets = new HashMap<String, Integer>() {{
put("open", 0);
put("close", 1);
put("ping", 2);
put("pong", 3);
put("message", 4);
put("upgrade", 5);
put("noop", 6);
}};
public static final Map<Integer, String> bipackets = new HashMap<Integer, String>();
static {
for (Map.Entry<String, Integer> entry : packets.entrySet()) {
bipackets.put(entry.getValue(), entry.getKey());
}
}
private static Packet err = new Packet("error", "parser error");
private Parser() {}
public static String encodePacket(Packet packet) {
String encoded = String.valueOf(packets.get(packet.type));
if (packet.data != null) {
encoded += packet.data;
}
return encoded;
}
public static Packet decodePacket(String data) {
int type = Character.getNumericValue(data.charAt(0));
if (type < 0 || type >= packets.size()) {
return err;
}
return new Packet(bipackets.get(type), data.length() > 1 ? data.substring(1) : null);
}
public static String encodePayload(Packet[] packets) {
if (packets.length == 0) {
return "0:";
}
StringBuilder encoded = new StringBuilder();
for (Packet packet : packets) {
String message = encodePacket(packet);
encoded.append(message.length()).append(":").append(message);
}
return encoded.toString();
}
public static void decodePayload(String data, DecodePayloadCallback callback) {
if (data == null || data.isEmpty()) {
callback.call(err, 0, 1);
return;
}
StringBuilder length = new StringBuilder();
for (int i = 0, l = data.length(); i < l; i++) {
char chr = data.charAt(i);
if (':' != chr) {
length.append(chr);
} else {
int n;
try {
n = Integer.parseInt(length.toString());
} catch (NumberFormatException e) {
callback.call(err, 0, 1);
return;
}
String msg;
try {
msg = data.substring(i + 1, i + 1 + n);
} catch (IndexOutOfBoundsException e) {
callback.call(err, 0, 1);
return;
}
if (msg.length() != 0) {
Packet packet = decodePacket(msg);
if (err.type.equals(packet.type) && err.data.equals(packet.data)) {
callback.call(err, 0, 1);
return;
}
boolean ret = callback.call(packet, i + n, l);
if (!ret) return;
}
i += n;
length = new StringBuilder();
}
}
if (length.length() > 0) {
callback.call(err, 0, 1);
}
}
public static interface DecodePayloadCallback {
public boolean call(Packet packet, int index, int total);
}
}