@@ -32,8 +32,8 @@ typedef struct {
32
32
uint8_t frame_len ;
33
33
uint8_t payload_len_size ;
34
34
bool masked ;
35
- uint32_t mask ;
36
- size_t frame_index ;
35
+ uint8_t mask [ 4 ] ;
36
+ int frame_index ;
37
37
size_t payload_remaining ;
38
38
} _websocket ;
39
39
@@ -96,27 +96,38 @@ static void _read_next_frame_header(void) {
96
96
97
97
ESP_LOGI (TAG , "mask %d length %x" , cp_serial .masked , len );
98
98
}
99
- while (cp_serial .frame_index > 1 &&
99
+ while (cp_serial .frame_index >= 2 &&
100
100
cp_serial .frame_index < (cp_serial .payload_len_size + 2 ) &&
101
101
_read_byte (& h )) {
102
102
cp_serial .frame_index ++ ;
103
- cp_serial .payload_remaining = cp_serial .payload_remaining << 8 | c ;
103
+ cp_serial .payload_remaining = cp_serial .payload_remaining << 8 | h ;
104
104
}
105
- while (cp_serial .frame_index > (cp_serial .payload_len_size + 2 ) &&
105
+ int mask_start = cp_serial .payload_len_size + 2 ;
106
+ while (cp_serial .frame_index >= mask_start &&
106
107
cp_serial .frame_index < cp_serial .frame_len &&
107
108
_read_byte (& h )) {
109
+ size_t mask_offset = cp_serial .frame_index - mask_start ;
110
+ cp_serial .mask [mask_offset ] = h ;
108
111
cp_serial .frame_index ++ ;
109
- cp_serial . mask = cp_serial .mask << 8 | c ;
112
+ ESP_LOGI ( TAG , " mask %08x" , ( uint32_t ) * cp_serial .mask ) ;
110
113
}
111
114
}
112
115
113
116
static bool _read_next_payload_byte (uint8_t * c ) {
114
117
_read_next_frame_header ();
115
- if (cp_serial .frame_index > cp_serial .frame_len &&
118
+ if (cp_serial .frame_index >= cp_serial .frame_len &&
116
119
cp_serial .payload_remaining > 0 ) {
117
120
if (_read_byte (c )) {
121
+ uint8_t mask_offset = (cp_serial .frame_index - cp_serial .frame_len ) % 4 ;
122
+ ESP_LOGI (TAG , "payload byte read %02x mask offset %d" , * c , mask_offset );
123
+ * c ^= cp_serial .mask [mask_offset ];
124
+ ESP_LOGI (TAG , "byte unmasked %02x" , * c );
118
125
cp_serial .frame_index ++ ;
119
126
cp_serial .payload_remaining -- ;
127
+ ESP_LOGI (TAG , "payload remaining %d" , cp_serial .payload_remaining );
128
+ if (cp_serial .payload_remaining == 0 ) {
129
+ cp_serial .frame_index = 0 ;
130
+ }
120
131
return true;
121
132
}
122
133
}
@@ -132,7 +143,9 @@ bool websocket_available(void) {
132
143
}
133
144
134
145
char websocket_read_char (void ) {
135
- return _read_next_payload_byte ();
146
+ uint8_t c ;
147
+ _read_next_payload_byte (& c );
148
+ return c ;
136
149
}
137
150
138
151
static void _send_raw (socketpool_socket_obj_t * socket , const uint8_t * buf , int len ) {
@@ -171,7 +184,10 @@ static void _websocket_send(_websocket *ws, const char *text, size_t len) {
171
184
_send_raw (& ws -> socket , (const uint8_t * )& len , 4 );
172
185
}
173
186
_send_raw (& ws -> socket , (const uint8_t * )text , len );
174
- ESP_LOGI (TAG , "sent over websocket: %s" , text );
187
+ char copy [len ];
188
+ memcpy (copy , text , len );
189
+ copy [len ] = '\0' ;
190
+ ESP_LOGI (TAG , "sent over websocket: %s" , copy );
175
191
}
176
192
177
193
void websocket_write (const char * text , size_t len ) {
0 commit comments