@@ -3578,12 +3578,12 @@ tfw_hpack_str_expand(TfwHttpTransIter *mit, TfwMsgIter *it,
3578
3578
*/
3579
3579
static int
3580
3580
tfw_hpack_hdr_add (TfwHttpResp * __restrict resp , TfwStr * __restrict hdr ,
3581
- TfwHPackInt * __restrict idx , bool name_indexed )
3581
+ TfwHPackInt * __restrict idx , bool name_indexed , bool inplace )
3582
3582
{
3583
3583
int r ;
3584
- TfwStr * c , * end ;
3584
+ TfwHPackInt vlen ;
3585
3585
TfwHttpTransIter * mit = & resp -> mit ;
3586
- TfwStr s_val ;
3586
+ TfwStr s_name = {}, s_val = {}, s_vlen = {} ;
3587
3587
const TfwStr s_idx = {
3588
3588
.data = idx -> buf ,
3589
3589
.len = idx -> sz ,
@@ -3592,43 +3592,53 @@ tfw_hpack_hdr_add(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3592
3592
T_DBG3 ("%s: s_idx->len=%lu, s_idx->data='%.*s'\n" ,
3593
3593
__func__ , s_idx .len , (int )s_idx .len , s_idx .data );
3594
3594
3595
- r = tfw_h2_msg_rewrite_data (mit , & s_idx , mit -> bnd );
3595
+ r = tfw_http_msg_expand_from_pool (mit , resp -> pool , & s_idx );
3596
3596
if (unlikely (r ))
3597
3597
return r ;
3598
3598
3599
3599
if (!hdr )
3600
3600
return 0 ;
3601
3601
3602
- if (WARN_ON_ONCE (TFW_STR_PLAIN (hdr )))
3602
+ if (WARN_ON_ONCE (TFW_STR_PLAIN (hdr ) || TFW_STR_DUP ( hdr ) ))
3603
3603
return - EINVAL ;
3604
3604
3605
+ tfw_http_hdr_split (hdr , & s_name , & s_val , inplace );
3606
+
3605
3607
if (unlikely (!name_indexed )) {
3606
- r = tfw_hpack_str_add (mit , TFW_STR_CHUNK (hdr , 0 ), resp -> pool );
3608
+ TfwHPackInt nlen ;
3609
+ TfwStr s_nlen = {};
3610
+
3611
+ write_int (s_name .len , 0x7F , 0 , & nlen );
3612
+ s_nlen .data = nlen .buf ;
3613
+ s_nlen .len = nlen .sz ;
3614
+
3615
+ r = tfw_http_msg_expand_from_pool (mit , resp -> pool , & s_nlen );
3616
+ if (unlikely (r ))
3617
+ return r ;
3618
+
3619
+ if (inplace )
3620
+ r = tfw_http_msg_expand_from_pool_lc (mit , resp -> pool ,
3621
+ & s_name );
3622
+ else
3623
+ r = tfw_http_msg_expand_from_pool (mit , resp -> pool ,
3624
+ & s_name );
3607
3625
if (unlikely (r ))
3608
3626
return r ;
3609
3627
}
3610
3628
3611
- /*
3612
- * During headers addition into the message the source @hdr must have
3613
- * the following chunk structure (without the OWS):
3614
- *
3615
- * { name [S_DLM] value1 [value2 [value3 ...]] }.
3616
- *
3617
- */
3618
- c = TFW_STR_CHUNK (hdr , 1 );
3619
- if (WARN_ON_ONCE (!c ))
3620
- return - EINVAL ;
3629
+ write_int (s_val .len , 0x7F , 0 , & vlen );
3630
+ s_vlen .data = vlen .buf ;
3631
+ s_vlen .len = vlen .sz ;
3621
3632
3622
- if (c -> len == SLEN (S_DLM ) && * (short * )c -> data == * (short * )S_DLM ) {
3623
- c = TFW_STR_CHUNK (hdr , 2 );
3624
- if (WARN_ON_ONCE (!c ))
3625
- return - EINVAL ;
3626
- }
3633
+ r = tfw_http_msg_expand_from_pool (mit , resp -> pool , & s_vlen );
3627
3634
3628
- end = hdr -> chunks + hdr -> nchunks ;
3629
- tfw_str_collect_cmp (c , end , & s_val , NULL );
3635
+ if (unlikely (r ))
3636
+ return r ;
3637
+ if (!TFW_STR_EMPTY (& s_val )) {
3638
+ r = tfw_http_msg_expand_from_pool (mit , resp -> pool , & s_val );
3639
+ }
3630
3640
3631
- return tfw_hpack_str_add ( mit , & s_val , resp -> pool ) ;
3641
+ return r ;
3632
3642
}
3633
3643
3634
3644
/*
@@ -3699,88 +3709,6 @@ tfw_hpack_hdr_expand(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3699
3709
return tfw_hpack_str_expand (mit , iter , skb_head , & s_val , NULL );
3700
3710
}
3701
3711
3702
- /*
3703
- * Transform the HTTP/1.1 header @hdr in-place into HTTP/2 HPACK format in the
3704
- * response @resp.
3705
- */
3706
- static int
3707
- tfw_hpack_hdr_inplace (TfwHttpResp * __restrict resp , TfwStr * __restrict hdr ,
3708
- TfwHPackInt * __restrict idx , bool name_indexed ,
3709
- bool indexed )
3710
- {
3711
- int r ;
3712
- const char * bnd ;
3713
- TfwHPackInt vlen ;
3714
- TfwHttpTransIter * mit = & resp -> mit ;
3715
- TfwStr s_name = {}, s_val = {}, s_vlen = {};
3716
- const TfwStr s_idx = {
3717
- .data = idx -> buf ,
3718
- .len = idx -> sz ,
3719
- };
3720
-
3721
- T_DBG3 ("%s: s_idx->len=%lu, s_idx->data='%.*s'\n" ,
3722
- __func__ , s_idx .len , (int )s_idx .len , s_idx .data );
3723
-
3724
- if (!hdr || WARN_ON_ONCE (TFW_STR_PLAIN (hdr ) || TFW_STR_DUP (hdr )))
3725
- return - EINVAL ;
3726
-
3727
- tfw_http_hdr_split (hdr , & s_name , & s_val , true);
3728
-
3729
- if (unlikely (!name_indexed )) {
3730
- TfwHPackInt nlen ;
3731
- TfwStr s_nlen = {};
3732
-
3733
- bnd = __TFW_STR_CH (& s_name , 0 )-> data ;
3734
-
3735
- r = tfw_h2_msg_rewrite_data (mit , & s_idx , bnd );
3736
- if (unlikely (r ))
3737
- return r ;
3738
-
3739
- write_int (s_name .len , 0x7F , 0 , & nlen );
3740
- s_nlen .data = nlen .buf ;
3741
- s_nlen .len = nlen .sz ;
3742
-
3743
- r = tfw_h2_msg_rewrite_data (mit , & s_nlen , bnd );
3744
- if (unlikely (r ))
3745
- return r ;
3746
-
3747
- if (!TFW_STR_EMPTY (& s_val ))
3748
- bnd = __TFW_STR_CH (& s_val , 0 )-> data ;
3749
- else
3750
- bnd = mit -> bnd ;
3751
-
3752
- r = tfw_h2_msg_rewrite_data_lc (mit , & s_name , bnd );
3753
- if (unlikely (r ))
3754
- return r ;
3755
- } else {
3756
- bnd = indexed || TFW_STR_EMPTY (& s_val )
3757
- ? mit -> bnd
3758
- : __TFW_STR_CH (& s_val , 0 )-> data ;
3759
-
3760
- r = tfw_h2_msg_rewrite_data (mit , & s_idx , bnd );
3761
- if (unlikely (r ))
3762
- return r ;
3763
-
3764
- if (indexed )
3765
- return 0 ;
3766
- }
3767
-
3768
- write_int (s_val .len , 0x7F , 0 , & vlen );
3769
- s_vlen .data = vlen .buf ;
3770
- s_vlen .len = vlen .sz ;
3771
-
3772
- r = tfw_h2_msg_rewrite_data (mit , & s_vlen , bnd );
3773
- if (unlikely (r ))
3774
- return r ;
3775
- if (!TFW_STR_EMPTY (& s_val )) {
3776
- r = tfw_h2_msg_rewrite_data (mit , & s_val , mit -> bnd );
3777
- if (unlikely (r ))
3778
- return r ;
3779
- }
3780
-
3781
- return 0 ;
3782
- }
3783
-
3784
3712
/*
3785
3713
* Perform encoding of the header @hdr into the HTTP/2 HPACK format. The four
3786
3714
* operation types can be executed here: addition, substitution, in-place
@@ -3810,7 +3738,6 @@ tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3810
3738
TfwH2Ctx * ctx = tfw_h2_context (resp -> req -> conn );
3811
3739
TfwHPackETbl * tbl = & ctx -> hpack .enc_tbl ;
3812
3740
int r = HPACK_IDX_ST_NOT_FOUND ;
3813
- TfwHttpTransIter mit = resp -> mit ;
3814
3741
3815
3742
if (WARN_ON_ONCE (!hdr || TFW_STR_EMPTY (hdr )))
3816
3743
return - EINVAL ;
@@ -3840,26 +3767,15 @@ tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3840
3767
3841
3768
write_int (index , 0x7F , 0x80 , & idx );
3842
3769
switch (op ) {
3843
- case TFW_H2_TRANS_SUB :
3844
3770
case TFW_H2_TRANS_ADD :
3845
- r = tfw_hpack_hdr_add (resp , NULL , & idx , true);
3846
- if (r != - ENOSPC )
3847
- return r ;
3848
- resp -> mit = mit ;
3849
- break ;
3771
+ return tfw_hpack_hdr_add (resp , NULL , & idx , true, false);
3772
+ case TFW_H2_TRANS_INPLACE :
3773
+ return tfw_hpack_hdr_add (resp , NULL , & idx , true, true);
3850
3774
case TFW_H2_TRANS_EXPAND :
3851
3775
return tfw_hpack_hdr_expand (resp , NULL , & idx , true);
3852
- case TFW_H2_TRANS_INPLACE :
3853
- r = tfw_hpack_hdr_inplace (resp , hdr , & idx , true, true);
3854
- if (r != - ENOSPC )
3855
- return r ;
3856
- resp -> mit = mit ;
3857
- break ;
3858
3776
default :
3859
3777
BUG ();
3860
3778
}
3861
-
3862
- return tfw_hpack_hdr_expand (resp , NULL , & idx , true);
3863
3779
}
3864
3780
3865
3781
if (st_index || HPACK_IDX_RES (r ) == HPACK_IDX_ST_NM_FOUND ) {
@@ -3877,54 +3793,33 @@ tfw_hpack_encode(TfwHttpResp *__restrict resp, TfwStr *__restrict hdr,
3877
3793
write_int (index , 0x3F , 0x40 , & idx );
3878
3794
else
3879
3795
write_int (index , 0xF , 0 , & idx );
3796
+
3880
3797
switch (op ) {
3881
- case TFW_H2_TRANS_SUB :
3882
3798
case TFW_H2_TRANS_ADD :
3883
- r = tfw_hpack_hdr_add (resp , hdr , & idx , true);
3884
- if (r != - ENOSPC )
3885
- return r ;
3886
- resp -> mit = mit ;
3887
- break ;
3799
+ return tfw_hpack_hdr_add (resp , hdr , & idx , true, false);
3800
+ case TFW_H2_TRANS_INPLACE :
3801
+ return tfw_hpack_hdr_add (resp , hdr , & idx , true, true);
3888
3802
case TFW_H2_TRANS_EXPAND :
3889
3803
return tfw_hpack_hdr_expand (resp , hdr , & idx , true);
3890
- case TFW_H2_TRANS_INPLACE :
3891
- r = tfw_hpack_hdr_inplace (resp , hdr , & idx , true, false);
3892
- if (r != - ENOSPC )
3893
- return r ;
3894
- resp -> mit = mit ;
3895
- break ;
3896
3804
default :
3897
3805
BUG ();
3898
3806
}
3899
-
3900
- return tfw_hpack_hdr_expand (resp , hdr , & idx , true);
3901
3807
}
3902
3808
3903
3809
WARN_ON_ONCE (index || st_index );
3904
3810
3905
3811
idx .sz = 1 ;
3906
3812
idx .buf [0 ] = (r & HPACK_IDX_FLAG_ADD ) ? 0x40 : 0 ;
3907
3813
switch (op ) {
3908
- case TFW_H2_TRANS_SUB :
3909
3814
case TFW_H2_TRANS_ADD :
3910
- r = tfw_hpack_hdr_add (resp , hdr , & idx , false);
3911
- if (r != - ENOSPC )
3912
- return r ;
3913
- resp -> mit = mit ;
3914
- break ;
3815
+ return tfw_hpack_hdr_add (resp , hdr , & idx , false, false);
3816
+ case TFW_H2_TRANS_INPLACE :
3817
+ return tfw_hpack_hdr_add (resp , hdr , & idx , false, true);
3915
3818
case TFW_H2_TRANS_EXPAND :
3916
3819
return tfw_hpack_hdr_expand (resp , hdr , & idx , false);
3917
- case TFW_H2_TRANS_INPLACE :
3918
- r = tfw_hpack_hdr_inplace (resp , hdr , & idx , false, false);
3919
- if (r != - ENOSPC )
3920
- return r ;
3921
- resp -> mit = mit ;
3922
- break ;
3923
3820
default :
3924
3821
BUG ();
3925
3822
}
3926
-
3927
- return tfw_hpack_hdr_expand (resp , hdr , & idx , false);
3928
3823
}
3929
3824
3930
3825
void
0 commit comments