module WebSocket::Mask

Public Class Methods

mask(p1, p2) click to toggle source
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;
}