@@ -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