/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 | } |