Remove psuedo-UTF8 encoding.

It's less efficient on average that base64 (150% vs 133%). It's
non-standard (0 shifted to 256 before encoding). And I rarely use it.
This commit is contained in:
Joel Martin
2010-08-27 12:10:09 -05:00
parent e8c1698995
commit 55dee43279
10 changed files with 20 additions and 175 deletions
+11 -81
View File
@@ -42,7 +42,6 @@ int ssl_initialized = 0;
char *tbuf, *cbuf, *tbuf_tmp, *cbuf_tmp;
unsigned int bufsize, dbufsize;
settings_t settings;
client_settings_t client_settings;
void traffic(char * token) {
fprintf(stdout, "%s", token);
@@ -189,33 +188,11 @@ int encode(u_char const *src, size_t srclength, char *target, size_t targsize) {
int i, sz = 0, len = 0;
unsigned char chr;
target[sz++] = '\x00';
if (client_settings.do_b64encode) {
len = __b64_ntop(src, srclength, target+sz, targsize-sz);
if (len < 0) {
return len;
}
sz += len;
} else {
for (i=0; i < srclength; i++) {
chr = src[i];
if (chr < 128) {
if (chr == 0x00) {
target[sz++] = '\xc4';
target[sz++] = '\x80';
} else {
target[sz++] = chr;
}
} else {
if (chr < 192) {
target[sz++] = '\xc2';
target[sz++] = chr;
} else {
target[sz++] = '\xc3';
target[sz++] = chr - 64;
}
}
}
len = __b64_ntop(src, srclength, target+sz, targsize-sz);
if (len < 0) {
return len;
}
sz += len;
target[sz++] = '\xff';
return sz;
}
@@ -233,33 +210,11 @@ int decode(char *src, size_t srclength, u_char *target, size_t targsize) {
/* We may have more than one frame */
end = memchr(start, '\xff', srclength);
*end = '\x00';
if (client_settings.do_b64encode) {
len = __b64_pton(start, target+retlen, targsize-retlen);
if (len < 0) {
return len;
}
retlen += len;
} else {
for (i=0; i < end-start; i++) {
chr = start[i];
if (chr < 128) {
target[retlen++] = chr;
} else {
i++;
switch (chr) {
case (unsigned char) '\xc2':
target[retlen++] = start[i];
break;
case (unsigned char) '\xc3':
target[retlen++] = start[i] + 64;
break;
case (unsigned char) '\xc4':
target[retlen++] = 0;
break;
}
}
}
len = __b64_pton(start, target+retlen, targsize-retlen);
if (len < 0) {
return len;
}
retlen += len;
start = end + 2; // Skip '\xff' end and '\x00' start
framecount++;
} while (end < (src+srclength-1));
@@ -375,13 +330,9 @@ ws_ctx_t *do_handshake(int sock) {
char handshake[4096], response[4096], trailer[17];
char *scheme, *pre;
headers_t headers;
char *args_start, *args_end, *arg_idx;
int len, ret;
ws_ctx_t * ws_ctx;
// Reset settings
client_settings.do_b64encode = 0;
// Peek, but don't read the data
len = recv(sock, handshake, 1024, MSG_PEEK);
handshake[len] = 0;
@@ -432,21 +383,6 @@ ws_ctx_t *do_handshake(int sock) {
printf(" using protocol version 75\n");
}
// Parse client settings from the GET path
args_start = strstr(headers.path, "?");
if (args_start) {
if (strstr(args_start, "#")) {
args_end = strstr(args_start, "#");
} else {
args_end = args_start + strlen(args_start);
}
arg_idx = strstr(args_start, "b64encode");
if (arg_idx && arg_idx < args_end) {
printf(" b64encode=1\n");
client_settings.do_b64encode = 1;
}
}
sprintf(response, server_handshake, pre, headers.origin, pre, scheme,
headers.host, headers.path, pre, trailer);
//printf("response: %s\n", response);
@@ -561,15 +497,9 @@ void start_server() {
continue;
}
/* Calculate dbufsize based on client_settings */
if (client_settings.do_b64encode) {
/* base64 is 4 bytes for every 3
* 20 for WS '\x00' / '\xff' and good measure */
dbufsize = (bufsize * 3)/4 - 20;
} else {
/* UTF-8 encoding is up to 2X larger */
dbufsize = (bufsize/2) - 20;
}
/* base64 is 4 bytes for every 3
* 20 for WS '\x00' / '\xff' and good measure */
dbufsize = (bufsize * 3)/4 - 20;
settings.handler(ws_ctx);
close(csock);
-4
View File
@@ -16,10 +16,6 @@ typedef struct {
char *cert;
} settings_t;
typedef struct {
int do_b64encode;
} client_settings_t;
typedef struct {
char path[1024+1];
char host[1024+1];
+3 -27
View File
@@ -29,8 +29,6 @@ settings = {
'ssl_only' : False,
'daemon' : True,
'record' : None, }
client_settings = {
'b64encode' : False, }
server_handshake = """HTTP/1.1 101 Web Socket Protocol Handshake\r
Upgrade: WebSocket\r
@@ -48,27 +46,16 @@ def traffic(token="."):
sys.stdout.flush()
def encode(buf):
if client_settings['b64encode']:
buf = b64encode(buf)
else:
# Modified UTF-8 encode
buf = buf.decode('latin-1').encode('utf-8').replace("\x00", "\xc4\x80")
buf = b64encode(buf)
return "\x00%s\xff" % buf
def decode(buf):
""" Parse out WebSocket packets. """
if buf.count('\xff') > 1:
if client_settings['b64encode']:
return [b64decode(d[1:]) for d in buf.split('\xff')]
else:
# Modified UTF-8 decode
return [d[1:].replace("\xc4\x80", "\x00").decode('utf-8').encode('latin-1') for d in buf.split('\xff')]
return [b64decode(d[1:]) for d in buf.split('\xff')]
else:
if client_settings['b64encode']:
return [b64decode(buf[1:-1])]
else:
return [buf[1:-1].replace("\xc4\x80", "\x00").decode('utf-8').encode('latin-1')]
return [b64decode(buf[1:-1])]
def parse_handshake(handshake):
ret = {}
@@ -99,9 +86,6 @@ def gen_md5(keys):
def do_handshake(sock):
global client_settings
client_settings['b64encode'] = False
# Peek, but don't read the data
handshake = sock.recv(1024, socket.MSG_PEEK)
@@ -136,14 +120,6 @@ def do_handshake(sock):
#print "handshake: " + repr(handshake)
h = parse_handshake(handshake)
# Parse client settings from the GET path
cvars = parse_qsl(urlsplit(h['path'])[3], True)
for name, val in cvars:
if name not in ['b64encode']: continue
value = val and val or True
client_settings[name] = value
print " %s=%s" % (name, value)
if h.get('key3'):
trailer = gen_md5(h)
pre = "Sec-"