pike.git
/
src
/
modules
/
_Roxen
/
roxen.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/modules/_Roxen/roxen.c:668:
{ case 0: REPLACE(p_wchar0); break; case 1: REPLACE(p_wchar1); break; case 2: REPLACE(p_wchar2); break; } pop_stack(); push_string( low_end_shared_string( res ) ); } }
+
/*! @decl string websocket_mask(string(8bit) str, string(8bit) mask)
+
*!
+
*! Returns @expr{str@} XOR @expr{mask@}.
+
*/
+
static void f_websocket_mask( INT32 args ) {
+
struct pike_string *str, *mask, *ret;
+
const unsigned char *src;
+
unsigned char * restrict dst;
+
size_t len;
+
unsigned INT32 m;
+
+
get_all_args("websocket_mask", args, "%n%n", &str, &mask);
+
+
if (mask->len != 4) Pike_error("Wrong mask length.\n");
+
+
ret = begin_shared_string(str->len);
+
+
len = str->len;
+
m = get_unaligned32(STR0(mask));
+
+
dst = STR0(ret);
+
src = STR0(str);
+
+
for (;len >= 4; len -= 4, dst += 4, src += 4)
+
set_unaligned32(dst, get_unaligned32(src) ^ m);
+
+
if (len) {
+
#if PIKE_BYTEORDER == 4321
+
m = bswap32(m);
+
#endif
+
+
do {
+
*dst++ = *src++ ^ m;
+
m >>= 8;
+
len --;
+
} while (len);
+
}
+
+
push_string(end_shared_string(ret));
+
}
+
/*! @endmodule */ PIKE_MODULE_INIT { ADD_FUNCTION("make_http_headers", f_make_http_headers, tFunc(tMap(tStr,tOr(tStr,tArr(tStr))) tOr(tInt01,tVoid), tStr), 0); ADD_FUNCTION("http_decode_string", f_http_decode_string, tFunc(tStr,tStr), 0 ); ADD_FUNCTION("html_encode_string", f_html_encode_string, tFunc(tMix,tStr), 0 );
-
+
ADD_FUNCTION("websocket_mask", f_websocket_mask, tFunc(tStr0 tStr0, tStr0), 0);
+
start_new_program(); ADD_STORAGE( struct header_buf ); set_init_callback( f_hp_init ); set_exit_callback( f_hp_exit ); ADD_FUNCTION("feed", f_hp_feed, tFunc(tStr tOr(tInt01,tVoid),tArr(tOr(tStr,tMapping))), 0); ADD_FUNCTION( "create", f_hp_create, tFunc(tOr(tInt,tVoid) tOr(tInt,tVoid) tOr(tInt,tVoid),tVoid), ID_PROTECTED ); end_class( "HeaderParser", 0 ); } PIKE_MODULE_EXIT { }