Lines Matching defs:decoder

2637 int nghttp3_qpack_decoder_init(nghttp3_qpack_decoder *decoder,
2643 rv = qpack_context_init(&decoder->ctx, hard_max_dtable_capacity,
2649 decoder->state = NGHTTP3_QPACK_ES_STATE_OPCODE;
2650 decoder->opcode = 0;
2651 decoder->written_icnt = 0;
2652 decoder->max_concurrent_streams = 0;
2654 nghttp3_qpack_read_state_reset(&decoder->rstate);
2655 nghttp3_buf_init(&decoder->dbuf);
2660 void nghttp3_qpack_decoder_free(nghttp3_qpack_decoder *decoder) {
2661 nghttp3_buf_free(&decoder->dbuf, decoder->ctx.mem);
2662 nghttp3_qpack_read_state_free(&decoder->rstate);
2663 qpack_context_free(&decoder->ctx);
2726 static int qpack_decoder_validate_index(nghttp3_qpack_decoder *decoder,
2729 return rstate->absidx < decoder->ctx.next_absidx &&
2730 decoder->ctx.next_absidx - rstate->absidx - 1 <
2731 nghttp3_ringbuf_len(&decoder->ctx.dtable)
2754 nghttp3_ssize nghttp3_qpack_decoder_read_encoder(nghttp3_qpack_decoder *decoder,
2760 const nghttp3_mem *mem = decoder->ctx.mem;
2764 if (decoder->ctx.bad) {
2776 switch (decoder->state) {
2780 decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT_INDEXED;
2781 decoder->rstate.dynamic = !((*p) & 0x40);
2782 decoder->rstate.prefix = 6;
2783 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX;
2786 decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_INSERT;
2787 decoder->rstate.dynamic = 0;
2788 decoder->rstate.prefix = 5;
2789 decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_NAME_HUFFMAN;
2792 decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_SET_DTABLE_CAP;
2793 decoder->rstate.prefix = 5;
2794 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX;
2797 decoder->opcode = NGHTTP3_QPACK_ES_OPCODE_DUPLICATE;
2798 decoder->rstate.dynamic = 1;
2799 decoder->rstate.prefix = 5;
2800 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_INDEX;
2808 nread = qpack_read_varint(&rfin, &decoder->rstate, p, end);
2821 if (decoder->opcode == NGHTTP3_QPACK_ES_OPCODE_SET_DTABLE_CAP) {
2823 decoder->rstate.left);
2825 decoder, (size_t)decoder->rstate.left);
2831 decoder->state = NGHTTP3_QPACK_ES_STATE_OPCODE;
2832 nghttp3_qpack_read_state_reset(&decoder->rstate);
2836 rv = nghttp3_qpack_decoder_rel2abs(decoder, &decoder->rstate);
2841 if (decoder->opcode == NGHTTP3_QPACK_ES_OPCODE_DUPLICATE) {
2842 rv = nghttp3_qpack_decoder_dtable_duplicate_add(decoder);
2846 decoder->state = NGHTTP3_QPACK_ES_STATE_OPCODE;
2847 nghttp3_qpack_read_state_reset(&decoder->rstate);
2851 if (decoder->opcode == NGHTTP3_QPACK_ES_OPCODE_INSERT_INDEXED) {
2852 decoder->rstate.prefix = 7;
2853 decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_VALUE_HUFFMAN;
2861 qpack_read_state_check_huffman(&decoder->rstate, *p);
2862 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_NAMELEN;
2863 decoder->rstate.left = 0;
2864 decoder->rstate.shift = 0;
2867 nread = qpack_read_varint(&rfin, &decoder->rstate, p, end);
2880 if (decoder->rstate.left > NGHTTP3_QPACK_MAX_NAMELEN) {
2885 if (decoder->rstate.huffman_encoded) {
2886 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_NAME_HUFFMAN;
2887 nghttp3_qpack_huffman_decode_context_init(&decoder->rstate.huffman_ctx);
2888 rv = nghttp3_rcbuf_new(&decoder->rstate.name,
2889 (size_t)decoder->rstate.left * 2 + 1, mem);
2891 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_NAME;
2892 rv = nghttp3_rcbuf_new(&decoder->rstate.name,
2893 (size_t)decoder->rstate.left + 1, mem);
2899 nghttp3_buf_wrap_init(&decoder->rstate.namebuf,
2900 decoder->rstate.name->base,
2901 decoder->rstate.name->len);
2904 nread = qpack_read_huffman_string(&decoder->rstate,
2905 &decoder->rstate.namebuf, p, end);
2914 if (decoder->rstate.left) {
2918 qpack_read_state_terminate_name(&decoder->rstate);
2920 decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_VALUE_HUFFMAN;
2921 decoder->rstate.prefix = 7;
2925 qpack_read_string(&decoder->rstate, &decoder->rstate.namebuf, p, end);
2933 if (decoder->rstate.left) {
2937 qpack_read_state_terminate_name(&decoder->rstate);
2939 decoder->state = NGHTTP3_QPACK_ES_STATE_CHECK_VALUE_HUFFMAN;
2940 decoder->rstate.prefix = 7;
2943 qpack_read_state_check_huffman(&decoder->rstate, *p);
2944 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_VALUELEN;
2945 decoder->rstate.left = 0;
2946 decoder->rstate.shift = 0;
2949 nread = qpack_read_varint(&rfin, &decoder->rstate, p, end);
2962 if (decoder->rstate.left > NGHTTP3_QPACK_MAX_VALUELEN) {
2967 if (decoder->rstate.huffman_encoded) {
2968 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_VALUE_HUFFMAN;
2969 nghttp3_qpack_huffman_decode_context_init(&decoder->rstate.huffman_ctx);
2970 rv = nghttp3_rcbuf_new(&decoder->rstate.value,
2971 (size_t)decoder->rstate.left * 2 + 1, mem);
2973 decoder->state = NGHTTP3_QPACK_ES_STATE_READ_VALUE;
2974 rv = nghttp3_rcbuf_new(&decoder->rstate.value,
2975 (size_t)decoder->rstate.left + 1, mem);
2981 nghttp3_buf_wrap_init(&decoder->rstate.valuebuf,
2982 decoder->rstate.value->base,
2983 decoder->rstate.value->len);
2989 nread = qpack_read_huffman_string(&decoder->rstate,
2990 &decoder->rstate.valuebuf, p, end);
2999 if (decoder->rstate.left) {
3003 qpack_read_state_terminate_value(&decoder->rstate);
3005 switch (decoder->opcode) {
3007 rv = nghttp3_qpack_decoder_dtable_indexed_add(decoder);
3010 rv = nghttp3_qpack_decoder_dtable_literal_add(decoder);
3021 decoder->state = NGHTTP3_QPACK_ES_STATE_OPCODE;
3022 nghttp3_qpack_read_state_reset(&decoder->rstate);
3025 nread = qpack_read_string(&decoder->rstate, &decoder->rstate.valuebuf, p,
3034 if (decoder->rstate.left) {
3038 qpack_read_state_terminate_value(&decoder->rstate);
3040 switch (decoder->opcode) {
3042 rv = nghttp3_qpack_decoder_dtable_indexed_add(decoder);
3045 rv = nghttp3_qpack_decoder_dtable_literal_add(decoder);
3056 decoder->state = NGHTTP3_QPACK_ES_STATE_OPCODE;
3057 nghttp3_qpack_read_state_reset(&decoder->rstate);
3065 decoder->ctx.bad = 1;
3070 nghttp3_qpack_decoder *decoder, size_t max_dtable_capacity) {
3073 nghttp3_qpack_context *ctx = &decoder->ctx;
3076 if (max_dtable_capacity > decoder->ctx.hard_max_dtable_capacity) {
3097 int nghttp3_qpack_decoder_dtable_indexed_add(nghttp3_qpack_decoder *decoder) {
3100 decoder->rstate.dynamic ? "dynamic" : "static", decoder->rstate.absidx,
3101 (int)decoder->rstate.value->len, decoder->rstate.value->base);
3103 if (decoder->rstate.dynamic) {
3104 return nghttp3_qpack_decoder_dtable_dynamic_add(decoder);
3107 return nghttp3_qpack_decoder_dtable_static_add(decoder);
3110 int nghttp3_qpack_decoder_dtable_static_add(nghttp3_qpack_decoder *decoder) {
3115 shd = &stable[decoder->rstate.absidx];
3117 if (table_space(shd->name.len, decoder->rstate.value->len) >
3118 decoder->ctx.max_dtable_capacity) {
3123 qnv.value = decoder->rstate.value;
3127 rv = nghttp3_qpack_context_dtable_add(&decoder->ctx, &qnv, NULL, 0);
3134 int nghttp3_qpack_decoder_dtable_dynamic_add(nghttp3_qpack_decoder *decoder) {
3139 ent = nghttp3_qpack_context_dtable_get(&decoder->ctx, decoder->rstate.absidx);
3141 if (table_space(ent->nv.name->len, decoder->rstate.value->len) >
3142 decoder->ctx.max_dtable_capacity) {
3147 qnv.value = decoder->rstate.value;
3153 rv = nghttp3_qpack_context_dtable_add(&decoder->ctx, &qnv, NULL, 0);
3161 int nghttp3_qpack_decoder_dtable_duplicate_add(nghttp3_qpack_decoder *decoder) {
3167 decoder->rstate.absidx);
3169 ent = nghttp3_qpack_context_dtable_get(&decoder->ctx, decoder->rstate.absidx);
3172 decoder->ctx.max_dtable_capacity) {
3180 rv = nghttp3_qpack_context_dtable_add(&decoder->ctx, &qnv, NULL, 0);
3188 int nghttp3_qpack_decoder_dtable_literal_add(nghttp3_qpack_decoder *decoder) {
3193 (int)decoder->rstate.name->len, decoder->rstate.name->base,
3194 (int)decoder->rstate.value->len, decoder->rstate.value->base);
3196 if (table_space(decoder->rstate.name->len, decoder->rstate.value->len) >
3197 decoder->ctx.max_dtable_capacity) {
3201 qnv.name = decoder->rstate.name;
3202 qnv.value = decoder->rstate.value;
3206 rv = nghttp3_qpack_context_dtable_add(&decoder->ctx, &qnv, NULL, 0);
3215 nghttp3_qpack_decoder *decoder, size_t max_concurrent_streams) {
3216 decoder->max_concurrent_streams =
3217 nghttp3_max(decoder->max_concurrent_streams, max_concurrent_streams);
3249 nghttp3_qpack_decoder_read_request(nghttp3_qpack_decoder *decoder,
3258 const nghttp3_mem *mem = decoder->ctx.mem;
3260 if (decoder->ctx.bad) {
3283 rv = nghttp3_qpack_decoder_reconstruct_ricnt(decoder, &sctx->ricnt,
3326 sctx->ricnt, sctx->base, decoder->ctx.next_absidx);
3328 if (sctx->ricnt > decoder->ctx.next_absidx) {
3393 rv = nghttp3_qpack_decoder_brel2abs(decoder, sctx);
3397 nghttp3_qpack_decoder_emit_indexed(decoder, sctx, nv);
3405 rv = nghttp3_qpack_decoder_pbrel2abs(decoder, sctx);
3409 nghttp3_qpack_decoder_emit_indexed(decoder, sctx, nv);
3417 rv = nghttp3_qpack_decoder_brel2abs(decoder, sctx);
3425 rv = nghttp3_qpack_decoder_pbrel2abs(decoder, sctx);
3582 rv = nghttp3_qpack_decoder_emit_indexed_name(decoder, sctx, nv);
3589 nghttp3_qpack_decoder_emit_literal(decoder, sctx, nv);
3620 rv = nghttp3_qpack_decoder_emit_indexed_name(decoder, sctx, nv);
3627 nghttp3_qpack_decoder_emit_literal(decoder, sctx, nv);
3641 if (sctx->ricnt > decoder->ctx.next_absidx) {
3662 rv = nghttp3_qpack_decoder_write_section_ack(decoder, sctx);
3672 decoder->ctx.bad = 1;
3676 static int qpack_decoder_dbuf_overflow(nghttp3_qpack_decoder *decoder) {
3677 size_t limit = nghttp3_max(decoder->max_concurrent_streams, 100);
3679 return nghttp3_buf_len(&decoder->dbuf) > limit * 2 * 10;
3683 nghttp3_qpack_decoder *decoder, const nghttp3_qpack_stream_context *sctx) {
3684 nghttp3_buf *dbuf = &decoder->dbuf;
3688 if (qpack_decoder_dbuf_overflow(decoder)) {
3694 decoder->ctx.mem);
3703 if (decoder->written_icnt < sctx->ricnt) {
3704 decoder->written_icnt = sctx->ricnt;
3711 nghttp3_qpack_decoder_get_decoder_streamlen(nghttp3_qpack_decoder *decoder) {
3715 if (decoder->written_icnt < decoder->ctx.next_absidx) {
3716 n = decoder->ctx.next_absidx - decoder->written_icnt;
3720 return nghttp3_buf_len(&decoder->dbuf) + len;
3723 void nghttp3_qpack_decoder_write_decoder(nghttp3_qpack_decoder *decoder,
3730 if (decoder->written_icnt < decoder->ctx.next_absidx) {
3731 n = decoder->ctx.next_absidx - decoder->written_icnt;
3735 assert(nghttp3_buf_left(dbuf) >= nghttp3_buf_len(&decoder->dbuf) + len);
3737 if (nghttp3_buf_len(&decoder->dbuf)) {
3738 dbuf->last = nghttp3_cpymem(dbuf->last, decoder->dbuf.pos,
3739 nghttp3_buf_len(&decoder->dbuf));
3747 decoder->written_icnt = decoder->ctx.next_absidx;
3750 nghttp3_buf_reset(&decoder->dbuf);
3753 int nghttp3_qpack_decoder_cancel_stream(nghttp3_qpack_decoder *decoder,
3758 if (qpack_decoder_dbuf_overflow(decoder)) {
3762 rv = reserve_buf(&decoder->dbuf,
3764 decoder->ctx.mem);
3769 p = decoder->dbuf.last;
3771 decoder->dbuf.last = nghttp3_qpack_put_varint(p, (uint64_t)stream_id, 6);
3776 int nghttp3_qpack_decoder_reconstruct_ricnt(nghttp3_qpack_decoder *decoder,
3786 decoder->ctx.hard_max_dtable_capacity / NGHTTP3_QPACK_ENTRY_OVERHEAD;
3793 max = decoder->ctx.next_absidx + max_ents;
3813 int nghttp3_qpack_decoder_rel2abs(nghttp3_qpack_decoder *decoder,
3816 rstate->dynamic, rstate->left, decoder->ctx.next_absidx);
3819 if (decoder->ctx.next_absidx < rstate->left + 1) {
3822 rstate->absidx = decoder->ctx.next_absidx - rstate->left - 1;
3826 if (qpack_decoder_validate_index(decoder, rstate) != 0) {
3832 int nghttp3_qpack_decoder_brel2abs(nghttp3_qpack_decoder *decoder,
3838 rstate->dynamic, rstate->left, sctx->base, decoder->ctx.next_absidx);
3853 if (qpack_decoder_validate_index(decoder, rstate) != 0) {
3859 int nghttp3_qpack_decoder_pbrel2abs(nghttp3_qpack_decoder *decoder,
3864 rstate->left, sctx->base, decoder->ctx.next_absidx);
3874 if (qpack_decoder_validate_index(decoder, rstate) != 0) {
3881 qpack_decoder_emit_static_indexed(nghttp3_qpack_decoder *decoder,
3885 (void)decoder;
3894 qpack_decoder_emit_dynamic_indexed(nghttp3_qpack_decoder *decoder,
3898 nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx);
3906 void nghttp3_qpack_decoder_emit_indexed(nghttp3_qpack_decoder *decoder,
3913 qpack_decoder_emit_dynamic_indexed(decoder, sctx, nv);
3915 qpack_decoder_emit_static_indexed(decoder, sctx, nv);
3920 qpack_decoder_emit_static_indexed_name(nghttp3_qpack_decoder *decoder,
3924 (void)decoder;
3936 qpack_decoder_emit_dynamic_indexed_name(nghttp3_qpack_decoder *decoder,
3943 if (qpack_decoder_validate_index(decoder, &sctx->rstate) != 0) {
3947 ent = nghttp3_qpack_context_dtable_get(&decoder->ctx, sctx->rstate.absidx);
3962 int nghttp3_qpack_decoder_emit_indexed_name(nghttp3_qpack_decoder *decoder,
3965 (void)decoder;
3972 return qpack_decoder_emit_dynamic_indexed_name(decoder, sctx, nv);
3975 qpack_decoder_emit_static_indexed_name(decoder, sctx, nv);
3980 void nghttp3_qpack_decoder_emit_literal(nghttp3_qpack_decoder *decoder,
3983 (void)decoder;
4086 void nghttp3_qpack_decoder_del(nghttp3_qpack_decoder *decoder) {
4089 if (decoder == NULL) {
4093 mem = decoder->ctx.mem;
4095 nghttp3_qpack_decoder_free(decoder);
4096 nghttp3_mem_free(mem, decoder);
4099 uint64_t nghttp3_qpack_decoder_get_icnt(const nghttp3_qpack_decoder *decoder) {
4100 return decoder->ctx.next_absidx;