Coverage Report

Created: 2025-07-11 06:49

/src/unit/src/nxt_websocket.c
Line
Count
Source (jump to first uncovered line)
1
2
/*
3
 * Copyright (C) NGINX, Inc.
4
 */
5
6
#include <nxt_main.h>
7
#include <nxt_websocket.h>
8
#include <nxt_websocket_header.h>
9
10
11
nxt_inline uint16_t
12
nxt_ntoh16(const uint8_t *b)
13
0
{
14
0
    return ((uint16_t) b[0]) << 8 | ((uint16_t) b[1]);
15
0
}
16
17
18
nxt_inline void
19
nxt_hton16(uint8_t *b, uint16_t v)
20
0
{
21
0
    b[0] = (v >> 8);
22
0
    b[1] = (v & 0xFFu);
23
0
}
24
25
26
nxt_inline uint64_t
27
nxt_ntoh64(const uint8_t *b)
28
0
{
29
0
    return  ((uint64_t) b[0]) << 56
30
0
          | ((uint64_t) b[1]) << 48
31
0
          | ((uint64_t) b[2]) << 40
32
0
          | ((uint64_t) b[3]) << 32
33
0
          | ((uint64_t) b[4]) << 24
34
0
          | ((uint64_t) b[5]) << 16
35
0
          | ((uint64_t) b[6]) << 8
36
0
          | ((uint64_t) b[7]);
37
0
}
38
39
40
nxt_inline void
41
nxt_hton64(uint8_t *b, uint64_t v)
42
0
{
43
0
    b[0] = (v >> 56);
44
0
    b[1] = (v >> 48) & 0xFFu;
45
0
    b[2] = (v >> 40) & 0xFFu;
46
0
    b[3] = (v >> 32) & 0xFFu;
47
0
    b[4] = (v >> 24) & 0xFFu;
48
0
    b[5] = (v >> 16) & 0xFFu;
49
0
    b[6] = (v >>  8) & 0xFFu;
50
0
    b[7] =  v        & 0xFFu;
51
0
}
52
53
54
size_t
55
nxt_websocket_frame_header_size(const void *data)
56
0
{
57
0
    size_t                        res;
58
0
    uint64_t                      p;
59
0
    const nxt_websocket_header_t  *h;
60
61
0
    h = data;
62
0
    p = h->payload_len;
63
64
0
    res = 2;
65
66
0
    if (p == 126) {
67
0
        res += 2;
68
0
    } else if (p == 127) {
69
0
        res += 8;
70
0
    }
71
72
0
    if (h->mask) {
73
0
        res += 4;
74
0
    }
75
76
0
    return res;
77
0
}
78
79
80
uint64_t
81
nxt_websocket_frame_payload_len(const void *data)
82
0
{
83
0
    uint64_t                      p;
84
0
    const nxt_websocket_header_t  *h;
85
86
0
    h = data;
87
0
    p = h->payload_len;
88
89
0
    if (p == 126) {
90
0
        p = nxt_ntoh16(h->payload_len_);
91
0
    } else if (p == 127) {
92
0
        p = nxt_ntoh64(h->payload_len_);
93
0
    }
94
95
0
    return p;
96
0
}
97
98
99
void *
100
nxt_websocket_frame_init(void *data, uint64_t payload_len)
101
0
{
102
0
    uint8_t                 *p;
103
0
    nxt_websocket_header_t  *h;
104
105
0
    h = data;
106
0
    p = data;
107
108
0
    if (payload_len < 126) {
109
0
        h->payload_len = payload_len;
110
0
        return p + 2;
111
0
    }
112
113
0
    if (payload_len < 65536) {
114
0
        h->payload_len = 126;
115
0
        nxt_hton16(h->payload_len_, payload_len);
116
0
        return p + 4;
117
0
    }
118
119
0
    h->payload_len = 127;
120
0
    nxt_hton64(h->payload_len_, payload_len);
121
0
    return p + 10;
122
0
}