File: websocket_mask.c

package info (click to toggle)
ruby-websocket-driver 0.6.3-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 188 kB
  • sloc: ruby: 1,203; java: 44; ansic: 33; makefile: 3
file content (41 lines) | stat: -rw-r--r-- 926 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <ruby.h>

VALUE WebSocket = Qnil;
VALUE WebSocketMask = Qnil;

void Init_websocket_mask();
VALUE method_websocket_mask(VALUE self, VALUE payload, VALUE mask);

void
Init_websocket_mask()
{
  WebSocket = rb_define_module("WebSocket");
  WebSocketMask = rb_define_module_under(WebSocket, "Mask");
  rb_define_singleton_method(WebSocketMask, "mask", method_websocket_mask, 2);
}

VALUE
method_websocket_mask(VALUE self,
                      VALUE payload,
                      VALUE mask)
{
  char *payload_s, *mask_s, *unmasked_s;
  long i, n;
  VALUE unmasked;

  if (mask == Qnil || RSTRING_LEN(mask) != 4) {
    return payload;
  }

  payload_s = RSTRING_PTR(payload);
  mask_s    = RSTRING_PTR(mask);
  n         = RSTRING_LEN(payload);

  unmasked   = rb_str_new(0, n);
  unmasked_s = RSTRING_PTR(unmasked);

  for (i = 0; i < n; i++) {
    unmasked_s[i] = payload_s[i] ^ mask_s[i % 4];
  }
  return unmasked;
}