aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLoïc Hoguin <[email protected]>2025-01-07 12:38:58 +0100
committerLoïc Hoguin <[email protected]>2025-01-07 12:50:13 +0100
commitcdb769a9d33bf9c860f835c44ef445c52d21faae (patch)
treef61856b7cfabc5b6b144b03274b43aa3eb238d94 /src
parent921b1ff6178bd6710331609f226789e9a763e1ae (diff)
downloadcowlib-cdb769a9d33bf9c860f835c44ef445c52d21faae.tar.gz
cowlib-cdb769a9d33bf9c860f835c44ef445c52d21faae.tar.bz2
cowlib-cdb769a9d33bf9c860f835c44ef445c52d21faae.zip
Optimise Websocket (un)masking
By (un)masking 16 bytes at a time when possible (instead of 4) we process frames roughly 10% faster for all frame types.
Diffstat (limited to 'src')
-rw-r--r--src/cow_ws.erl12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/cow_ws.erl b/src/cow_ws.erl
index d5c40d0..08790ca 100644
--- a/src/cow_ws.erl
+++ b/src/cow_ws.erl
@@ -525,8 +525,12 @@ unmask(Data, MaskKey, UnmaskedLen) ->
MaskKey2 = (MaskKey bsl (Left * 8)) + (MaskKey bsr (Right * 8)),
mask(Data, MaskKey2, <<>>).
-mask(<<>>, _, Unmasked) ->
- Unmasked;
+mask(<< O1:32, O2:32, O3:32, O4:32, Rest/bits >>, MaskKey, Acc) ->
+ T1 = O1 bxor MaskKey,
+ T2 = O2 bxor MaskKey,
+ T3 = O3 bxor MaskKey,
+ T4 = O4 bxor MaskKey,
+ mask(Rest, MaskKey, << Acc/binary, T1:32, T2:32, T3:32, T4:32 >>);
mask(<< O:32, Rest/bits >>, MaskKey, Acc) ->
T = O bxor MaskKey,
mask(Rest, MaskKey, << Acc/binary, T:32 >>);
@@ -541,7 +545,9 @@ mask(<< O:16 >>, MaskKey, Acc) ->
mask(<< O:8 >>, MaskKey, Acc) ->
<< MaskKey2:8, _:24 >> = << MaskKey:32 >>,
T = O bxor MaskKey2,
- << Acc/binary, T:8 >>.
+ << Acc/binary, T:8 >>;
+mask(<<>>, _, Unmasked) ->
+ Unmasked.
inflate_frame(Data, Inflate, TakeOver, FragState, true)
when FragState =:= undefined; element(1, FragState) =:= fin ->