@@ -40,15 +40,25 @@ typedef struct {
40
40
return NGX_ERROR; \
41
41
}
42
42
43
- #define PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES \
44
- (sizeof(wasm_h2_header_static_table) \
43
+ #define PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES \
44
+ (sizeof(wasm_h2_req_header_static_table) \
45
+ / sizeof(ngx_http_wasm_h2_header_t))
46
+
47
+ #define PROXY_WASM_RESP_HEADER_STATIC_TABLE_ENTRIES \
48
+ (sizeof(wasm_h2_resp_header_static_table) \
45
49
/ sizeof(ngx_http_wasm_h2_header_t))
46
50
47
51
48
52
static ngx_str_t * ngx_http_wasm_get_path (ngx_http_request_t * r );
49
53
static ngx_str_t * ngx_http_wasm_get_method (ngx_http_request_t * r );
50
54
static ngx_str_t * ngx_http_wasm_get_scheme (ngx_http_request_t * r );
51
-
55
+ static ngx_str_t * ngx_http_wasm_get_status (ngx_http_request_t * r );
56
+ static ngx_str_t * ngx_http_wasm_get_h2_header (ngx_http_request_t * r ,
57
+ u_char * key_data , size_t key_size , int ty );
58
+ static ngx_str_t * ngx_http_wasm_get_h2_req_header (ngx_http_request_t * r ,
59
+ u_char * key_data , size_t key_size );
60
+ static ngx_str_t * ngx_http_wasm_get_h2_resp_header (ngx_http_request_t * r ,
61
+ u_char * key_data , size_t key_size );
52
62
53
63
static int (* get_phase ) (ngx_http_request_t * r , char * * err );
54
64
static int (* set_resp_header ) (ngx_http_request_t * r ,
@@ -78,11 +88,16 @@ static char *str_buf[STR_BUF_SIZE] = {0};
78
88
79
89
static ngx_str_t scheme_https = ngx_string ("https" );
80
90
static ngx_str_t scheme_http = ngx_string ("http" );
91
+ static ngx_str_t status_ok = ngx_string ("200" );
92
+
93
+ static ngx_http_wasm_h2_header_t wasm_h2_req_header_static_table [] = {
94
+ {ngx_string (":path" ), PROXY_WASM_REQUEST_HEADER_PATH , ngx_http_wasm_get_path },
95
+ {ngx_string (":method" ), PROXY_WASM_REQUEST_HEADER_METHOD , ngx_http_wasm_get_method },
96
+ {ngx_string (":scheme" ), PROXY_WASM_REQUEST_HEADER_SCHEME , ngx_http_wasm_get_scheme },
97
+ };
81
98
82
- static ngx_http_wasm_h2_header_t wasm_h2_header_static_table [] = {
83
- {ngx_string (":path" ), PROXY_WASM_HEADER_PATH , ngx_http_wasm_get_path },
84
- {ngx_string (":method" ), PROXY_WASM_HEADER_METHOD , ngx_http_wasm_get_method },
85
- {ngx_string (":scheme" ), PROXY_WASM_HEADER_SCHEME , ngx_http_wasm_get_scheme },
99
+ static ngx_http_wasm_h2_header_t wasm_h2_resp_header_static_table [] = {
100
+ {ngx_string (":status" ), PROXY_WASM_RESPONSE_HEADER_STATUS , ngx_http_wasm_get_status },
86
101
};
87
102
88
103
@@ -632,6 +647,85 @@ static ngx_str_t *ngx_http_wasm_get_scheme(ngx_http_request_t *r)
632
647
}
633
648
634
649
650
+ static ngx_str_t *
651
+ ngx_http_wasm_get_status (ngx_http_request_t * r )
652
+ {
653
+ ngx_str_t * sc ;
654
+ ngx_uint_t status ;
655
+ u_char * p ;
656
+
657
+ if (r -> err_status ) {
658
+ status = r -> err_status ;
659
+ } else {
660
+ status = r -> headers_out .status ;
661
+ }
662
+
663
+ sc = & status_ok ;
664
+
665
+ p = ngx_http_wasm_get_string_buf (r -> pool , sizeof (u_char ));
666
+ if (p == NULL ) {
667
+ return NULL ;
668
+ }
669
+
670
+ sc -> len = ngx_sprintf (p , "%ui" , status ) - p ;
671
+ sc -> data = p ;
672
+
673
+ return sc ;
674
+ }
675
+
676
+
677
+ static ngx_str_t *
678
+ ngx_http_wasm_get_h2_header (ngx_http_request_t * r , u_char * key_data , size_t key_size , int ty ) {
679
+ ngx_str_t * h = NULL ;
680
+ ngx_uint_t i , entries ;
681
+ ngx_http_wasm_h2_header_t * wh , * whs ;
682
+
683
+ if (ty == PROXY_WASM_REQUEST_HEADER ) {
684
+ entries = (ngx_uint_t ) PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES ;
685
+ whs = & wasm_h2_req_header_static_table [0 ];
686
+
687
+ } else if (ty == PROXY_WASM_RESPONSE_HEADER ) {
688
+ entries = (ngx_uint_t ) PROXY_WASM_RESP_HEADER_STATIC_TABLE_ENTRIES ;
689
+ whs = & wasm_h2_resp_header_static_table [0 ];
690
+
691
+ } else {
692
+ return NULL ;
693
+ }
694
+
695
+
696
+ if (key_size <= 0 || key_data [0 ] != ':' ) {
697
+ return NULL ;
698
+ }
699
+
700
+ for (i = 0 ; i < entries ; i ++ ) {
701
+ wh = whs + i ;
702
+
703
+ if ((size_t ) key_size != wh -> name .len ) {
704
+ continue ;
705
+ }
706
+
707
+ if (ngx_strncasecmp (key_data , wh -> name .data , wh -> name .len ) == 0 ) {
708
+ h = wh -> getter (r );
709
+ break ;
710
+ }
711
+ }
712
+
713
+ return h ;
714
+ }
715
+
716
+
717
+ static ngx_str_t *
718
+ ngx_http_wasm_get_h2_req_header (ngx_http_request_t * r , u_char * key_data , size_t key_size ) {
719
+ return ngx_http_wasm_get_h2_header (r , key_data , key_size , PROXY_WASM_REQUEST_HEADER );
720
+ }
721
+
722
+
723
+ static ngx_str_t *
724
+ ngx_http_wasm_get_h2_resp_header (ngx_http_request_t * r , u_char * key_data , size_t key_size ) {
725
+ return ngx_http_wasm_get_h2_header (r , key_data , key_size , PROXY_WASM_RESPONSE_HEADER );
726
+ }
727
+
728
+
635
729
static int32_t
636
730
ngx_http_wasm_req_get_headers (ngx_http_request_t * r , int32_t addr , int32_t size_addr )
637
731
{
@@ -644,6 +738,8 @@ ngx_http_wasm_req_get_headers(ngx_http_request_t *r, int32_t addr, int32_t size_
644
738
proxy_wasm_map_iter it ;
645
739
char * key ;
646
740
char * val ;
741
+ ngx_str_t * s ;
742
+ ngx_http_wasm_h2_header_t * wh ;
647
743
648
744
log = r -> connection -> log ;
649
745
@@ -674,23 +770,20 @@ ngx_http_wasm_req_get_headers(ngx_http_request_t *r, int32_t addr, int32_t size_
674
770
}
675
771
676
772
/* count pseudo headers :path, :method, :scheme */
677
- for (i = 0 ; i < (ngx_int_t ) PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES ; i ++ ) {
678
- ngx_str_t * s ;
679
- ngx_http_wasm_h2_header_t * wh ;
680
-
681
- wh = & wasm_h2_header_static_table [i ];
773
+ for (i = 0 ; i < (ngx_int_t ) PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES ; i ++ ) {
774
+ wh = & wasm_h2_req_header_static_table [i ];
682
775
s = wh -> getter (r );
683
776
size += wh -> name .len + 1 + s -> len + 1 ;
684
777
}
685
778
686
- size += 4 + (count + PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES ) * 2 * 4 ;
779
+ size += 4 + (count + PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES ) * 2 * 4 ;
687
780
buf = ngx_http_wasm_get_buf_to_write (log , size , addr , size_addr );
688
781
if (buf == NULL ) {
689
782
return PROXY_RESULT_INVALID_MEMORY_ACCESS ;
690
783
}
691
784
692
785
/* get the data */
693
- proxy_wasm_map_init_map (buf , count + PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES );
786
+ proxy_wasm_map_init_map (buf , count + PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES );
694
787
proxy_wasm_map_init_iter (& it , buf );
695
788
696
789
for (i = 0 ; i < count ; i ++ ) {
@@ -706,11 +799,8 @@ ngx_http_wasm_req_get_headers(ngx_http_request_t *r, int32_t addr, int32_t size_
706
799
}
707
800
708
801
/* get pseudo headers :path, :method, :scheme */
709
- for (i = 0 ; i < (ngx_int_t ) PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES ; i ++ ) {
710
- ngx_str_t * s ;
711
- ngx_http_wasm_h2_header_t * wh ;
712
-
713
- wh = & wasm_h2_header_static_table [i ];
802
+ for (i = 0 ; i < (ngx_int_t ) PROXY_WASM_REQ_HEADER_STATIC_TABLE_ENTRIES ; i ++ ) {
803
+ wh = & wasm_h2_req_header_static_table [i ];
714
804
s = wh -> getter (r );
715
805
716
806
proxy_wasm_map_reserve (& it , & key , wh -> name .len ,
@@ -961,9 +1051,9 @@ ngx_http_wasm_req_get_header(ngx_http_request_t *r, char *key, int32_t key_size
961
1051
{
962
1052
ngx_log_t * log ;
963
1053
ngx_uint_t i ;
1054
+ ngx_str_t * h2h ;
964
1055
ngx_list_part_t * part ;
965
1056
ngx_table_elt_t * header ;
966
- ngx_http_wasm_h2_header_t * wh ;
967
1057
unsigned char * key_buf = NULL ;
968
1058
const u_char * val = NULL ;
969
1059
int32_t val_len = 0 ;
@@ -973,46 +1063,11 @@ ngx_http_wasm_req_get_header(ngx_http_request_t *r, char *key, int32_t key_size
973
1063
header = part -> elts ;
974
1064
key_buf = (u_char * ) key ;
975
1065
976
- if (key_size > 0 && key_buf [0 ] == ':' ) {
977
- for (i = 0 ; i < PROXY_WASM_HEADER_STATIC_TABLE_ENTRIES ; i ++ ) {
978
- wh = & wasm_h2_header_static_table [i ];
979
-
980
- if ((size_t ) key_size != wh -> name .len ) {
981
- continue ;
982
- }
983
-
984
- if (ngx_strncasecmp (key_buf , wh -> name .data , wh -> name .len ) == 0 ) {
985
-
986
- switch (wh -> ty ) {
987
- case PROXY_WASM_HEADER_PATH :
988
- val = r -> unparsed_uri .data ;
989
- val_len = r -> unparsed_uri .len ;
990
- break ;
991
-
992
- case PROXY_WASM_HEADER_METHOD :
993
- val = r -> method_name .data ;
994
- val_len = r -> method_name .len ;
995
- break ;
996
-
997
- case PROXY_WASM_HEADER_SCHEME :
998
- if (r -> connection -> ssl ) {
999
- val = scheme_https .data ;
1000
- val_len = scheme_https .len ;
1001
- } else {
1002
- val = scheme_http .data ;
1003
- val_len = scheme_http .len ;
1004
- }
1005
- break ;
1006
-
1007
- default :
1008
- break ;
1009
- }
1010
-
1011
- if (val != NULL ) {
1012
- goto done ;
1013
- }
1014
- }
1015
- }
1066
+ h2h = ngx_http_wasm_get_h2_req_header (r , key_buf , key_size );
1067
+ if (h2h ) {
1068
+ val = h2h -> data ;
1069
+ val_len = h2h -> len ;
1070
+ goto done ;
1016
1071
}
1017
1072
1018
1073
for (i = 0 ; /* void */ ; i ++ ) {
@@ -1060,7 +1115,7 @@ ngx_http_wasm_resp_get_header(ngx_http_request_t *r, char *key, int32_t key_siz
1060
1115
char * errmsg = NULL ;
1061
1116
ngx_log_t * log ;
1062
1117
unsigned char * key_buf ;
1063
- ngx_str_t * values ;
1118
+ ngx_str_t * values , * h2h ;
1064
1119
1065
1120
1066
1121
log = r -> connection -> log ;
@@ -1071,6 +1126,13 @@ ngx_http_wasm_resp_get_header(ngx_http_request_t *r, char *key, int32_t key_siz
1071
1126
}
1072
1127
1073
1128
values = (ngx_str_t * ) (key_buf + key_size );
1129
+
1130
+ h2h = ngx_http_wasm_get_h2_resp_header (r , (u_char * ) key , key_size );
1131
+ if (h2h ) {
1132
+ values = h2h ;
1133
+ goto done ;
1134
+ }
1135
+
1074
1136
rc = get_resp_header (r , (unsigned char * ) key , key_size , key_buf , values , 1 , & errmsg );
1075
1137
if (rc < 0 ) {
1076
1138
if (rc == FFI_BAD_CONTEXT ) {
@@ -1090,6 +1152,8 @@ ngx_http_wasm_resp_get_header(ngx_http_request_t *r, char *key, int32_t key_siz
1090
1152
return PROXY_RESULT_NOT_FOUND ;
1091
1153
}
1092
1154
1155
+ done :
1156
+
1093
1157
return ngx_http_wasm_copy_to_wasm (log , values -> data , values -> len , addr , size );
1094
1158
}
1095
1159
0 commit comments