Skip to content

Commit 07bfbbd

Browse files
author
Alex Hultman
committed
Simplify & optimize base64
1 parent 7bd3897 commit 07bfbbd

File tree

1 file changed

+13
-21
lines changed

1 file changed

+13
-21
lines changed

src/uWS.cpp

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -136,25 +136,19 @@ struct SocketData {
136136
string controlBuffer;
137137
};
138138

139-
char *base64(const unsigned char *input, int length)
139+
void base64(unsigned char *src, char *dst)
140140
{
141-
BIO *bmem, *b64;
142-
BUF_MEM *bptr;
143-
144-
b64 = BIO_new(BIO_f_base64());
145-
bmem = BIO_new(BIO_s_mem());
146-
b64 = BIO_push(b64, bmem);
147-
BIO_write(b64, input, length);
148-
BIO_flush(b64);
149-
BIO_get_mem_ptr(b64, &bptr);
150-
151-
char *buff = (char *) malloc(bptr->length);
152-
memcpy(buff, bptr->data, bptr->length - 1);
153-
buff[bptr->length - 1] = 0;
154-
155-
BIO_free_all(b64);
156-
157-
return buff;
141+
static const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
142+
for (int i = 0; i < 18; i += 3) {
143+
*dst++ = b64[(src[i] >> 2) & 63];
144+
*dst++ = b64[((src[i] & 3) << 4) | ((src[i + 1] & 240) >> 4)];
145+
*dst++ = b64[((src[i + 1] & 15) << 2) | ((src[i + 2] & 192) >> 6)];
146+
*dst++ = b64[src[i + 2] & 63];
147+
}
148+
*dst++ = b64[(src[18] >> 2) & 63];
149+
*dst++ = b64[((src[18] & 3) << 4) | ((src[19] & 240) >> 4)];
150+
*dst++ = b64[((src[19] & 15) << 2)];
151+
*dst++ = '=';
158152
}
159153

160154
/*struct __attribute__((packed)) frameFormat {
@@ -268,9 +262,7 @@ Server::Server(int port) : port(port)
268262
"Sec-WebSocket-Accept: XXXXXXXXXXXXXXXXXXXXXXXXXXXX\r\n"
269263
"\r\n";
270264

271-
char *b64;
272-
memcpy(upgradeResponse + 97, b64 = base64(shaDigest, SHA_DIGEST_LENGTH), 28);
273-
free(b64);
265+
base64(shaDigest, upgradeResponse + 97);
274266

275267
// this will modify the event loop of another thread
276268
uv_poll_t *clientPoll = new uv_poll_t;

0 commit comments

Comments
 (0)