Skip to content

[enhancement] Getting e.RawData still decodes byte array to string internally #758

Description

@vritme

In this file: https://github.com/sta/websocket-sharp/blob/master/websocket-sharp/MessageEventArgs.cs

public byte[] RawData {
  get {
    setData ();

    return _rawData;
  }
}

e.RawData property of websocket message event calls the same setData() method, which is used for e.Data property:

public string Data {
  get {
    setData ();

    return _data;
  }
}

And setData() method, when called for the first time for a given event object and if opcode is not Binary, unconditionally tries to decode byte array to string via TryGetUTF8DecodedString() method in order to prepare string _data field for e.Data property to use (even if called from e.DataRaw, where byte array to string decoding is not needed):

private void setData ()
{
  if (_dataSet)
    return;

  if (_opcode == Opcode.Binary) {
    _dataSet = true;

    return;
  }

  string data;

  if (_rawData.TryGetUTF8DecodedString (out data))
    _data = data;

  _dataSet = true;
}

Calling _rawData.TryGetUTF8DecodedString on e.RawData property call prior to returning just _rawData byte array breaks the point of using e.RawData property for the purpose of message processing speedup via avoiding string allocation and byte array to string conversion.

I suppose the e.RawData property should be reworked like this:

public byte[] RawData {
  get {
    return _rawData;
  }
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions