aboutsummaryrefslogtreecommitdiff
path: root/SocketHttpListener/CloseEventArgs.cs
blob: c6460fd2305897305536ac164b3f02379b472c10 (plain)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Text;

namespace SocketHttpListener
{
    /// <summary>
    /// Contains the event data associated with a <see cref="WebSocket.OnClose"/> event.
    /// </summary>
    /// <remarks>
    /// A <see cref="WebSocket.OnClose"/> event occurs when the WebSocket connection has been closed.
    /// If you would like to get the reason for the close, you should access the <see cref="Code"/> or
    /// <see cref="Reason"/> property.
    /// </remarks>
    public class CloseEventArgs : EventArgs
    {
        #region Private Fields

        private bool _clean;
        private ushort _code;
        private string _reason;

        #endregion

        #region Internal Constructors

        internal CloseEventArgs(PayloadData payload)
        {
            var data = payload.ApplicationData;
            var len = data.Length;
            _code = len > 1
                    ? data.SubArray(0, 2).ToUInt16(ByteOrder.Big)
                    : (ushort)CloseStatusCode.NoStatusCode;

            _reason = len > 2
                      ? GetUtf8String(data.SubArray(2, len - 2))
                      : string.Empty;
        }

        private static string GetUtf8String(byte[] bytes)
        {
            return Encoding.UTF8.GetString(bytes, 0, bytes.Length);
        }

        #endregion

        #region Public Properties

        /// <summary>
        /// Gets the status code for the close.
        /// </summary>
        /// <value>
        /// A <see cref="ushort"/> that represents the status code for the close if any.
        /// </value>
        public ushort Code => _code;

        /// <summary>
        /// Gets the reason for the close.
        /// </summary>
        /// <value>
        /// A <see cref="string"/> that represents the reason for the close if any.
        /// </value>
        public string Reason => _reason;

        /// <summary>
        /// Gets a value indicating whether the WebSocket connection has been closed cleanly.
        /// </summary>
        /// <value>
        /// <c>true</c> if the WebSocket connection has been closed cleanly; otherwise, <c>false</c>.
        /// </value>
        public bool WasClean
        {
            get => _clean;

            internal set => _clean = value;
        }

        #endregion
    }
}