HTTP/3: fixed prefixed integer encoding and decoding.
Previously bytes were ordered from MSB to LSB, but the right order is the reverse.
This commit is contained in:
parent
9e72031709
commit
902358052c
3 changed files with 17 additions and 17 deletions
|
@ -78,23 +78,22 @@ ngx_http_v3_encode_prefix_int(u_char *p, uint64_t value, ngx_uint_t prefix)
|
||||||
|
|
||||||
value -= thresh;
|
value -= thresh;
|
||||||
|
|
||||||
for (n = 10; n > 1; n--) {
|
|
||||||
if (value >> (7 * (n - 1))) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
return n + 1;
|
for (n = 2; value >= 128; n++) {
|
||||||
|
value >>= 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
*p++ |= thresh;
|
*p++ |= thresh;
|
||||||
|
|
||||||
for ( /* void */ ; n > 1; n--) {
|
while (value >= 128) {
|
||||||
*p++ = 0x80 | (value >> 7 * (n - 1));
|
*p++ = 0x80 | value;
|
||||||
|
value >>= 7;
|
||||||
}
|
}
|
||||||
|
|
||||||
*p++ = value & 0x7f;
|
*p++ = value;
|
||||||
|
|
||||||
return (uintptr_t) p;
|
return (uintptr_t) p;
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,6 +91,7 @@ ngx_int_t
|
||||||
ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
|
ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
|
||||||
ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch)
|
ngx_http_v3_parse_prefix_int_t *st, ngx_uint_t prefix, u_char ch)
|
||||||
{
|
{
|
||||||
|
ngx_uint_t mask;
|
||||||
enum {
|
enum {
|
||||||
sw_start = 0,
|
sw_start = 0,
|
||||||
sw_value
|
sw_value
|
||||||
|
@ -100,25 +101,25 @@ ngx_http_v3_parse_prefix_int(ngx_connection_t *c,
|
||||||
|
|
||||||
case sw_start:
|
case sw_start:
|
||||||
|
|
||||||
st->mask = (1 << prefix) - 1;
|
mask = (1 << prefix) - 1;
|
||||||
st->value = (ch & st->mask);
|
st->value = ch & mask;
|
||||||
|
|
||||||
if (st->value != st->mask) {
|
if (st->value != mask) {
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
st->value = 0;
|
st->shift = 0;
|
||||||
st->state = sw_value;
|
st->state = sw_value;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case sw_value:
|
case sw_value:
|
||||||
|
|
||||||
st->value = (st->value << 7) + (ch & 0x7f);
|
st->value += (ch & 0x7f) << st->shift;
|
||||||
if (ch & 0x80) {
|
if (ch & 0x80) {
|
||||||
|
st->shift += 7;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
st->value += st->mask;
|
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ngx_uint_t state;
|
ngx_uint_t state;
|
||||||
ngx_uint_t mask;
|
ngx_uint_t shift;
|
||||||
uint64_t value;
|
uint64_t value;
|
||||||
} ngx_http_v3_parse_prefix_int_t;
|
} ngx_http_v3_parse_prefix_int_t;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue