16
16
17
17
#include "core/nng_impl.h"
18
18
#include "http_api.h"
19
+ #include "nng/supplemental/http/http.h"
19
20
20
21
// Note that as we parse headers, the rule is that if a header is already
21
22
// present, then we can append it to the existing header, separated by
@@ -39,7 +40,7 @@ struct nng_http_req {
39
40
nni_http_entity data ;
40
41
char * meth ;
41
42
char * uri ;
42
- char * vers ;
43
+ const char * vers ;
43
44
char * buf ;
44
45
size_t bufsz ;
45
46
bool parsed ;
@@ -50,7 +51,7 @@ struct nng_http_res {
50
51
nni_http_entity data ;
51
52
uint16_t code ;
52
53
char * rsn ;
53
- char * vers ;
54
+ const char * vers ;
54
55
char * buf ;
55
56
size_t bufsz ;
56
57
bool parsed ;
@@ -99,14 +100,14 @@ nni_http_req_reset(nni_http_req *req)
99
100
{
100
101
http_headers_reset (& req -> hdrs );
101
102
http_entity_reset (& req -> data );
102
- nni_strfree (req -> vers );
103
103
nni_strfree (req -> meth );
104
104
nni_strfree (req -> uri );
105
- req -> vers = req -> meth = req -> uri = NULL ;
105
+ req -> meth = req -> uri = NULL ;
106
106
nni_free (req -> buf , req -> bufsz );
107
107
req -> bufsz = 0 ;
108
108
req -> buf = NULL ;
109
109
req -> parsed = false;
110
+ req -> vers = NNG_HTTP_VERSION_1_1 ;
110
111
}
111
112
112
113
void
@@ -115,8 +116,7 @@ nni_http_res_reset(nni_http_res *res)
115
116
http_headers_reset (& res -> hdrs );
116
117
http_entity_reset (& res -> data );
117
118
nni_strfree (res -> rsn );
118
- nni_strfree (res -> vers );
119
- res -> vers = NULL ;
119
+ res -> vers = NNG_HTTP_VERSION_1_1 ;
120
120
res -> rsn = NULL ;
121
121
res -> code = 0 ;
122
122
res -> parsed = false;
@@ -532,8 +532,7 @@ http_req_prepare(nni_http_req *req)
532
532
return (NNG_EINVAL );
533
533
}
534
534
rv = http_asprintf (& req -> buf , & req -> bufsz , & req -> hdrs , "%s %s %s\r\n" ,
535
- req -> meth != NULL ? req -> meth : "GET" , req -> uri ,
536
- req -> vers != NULL ? req -> vers : "HTTP/1.1" );
535
+ req -> meth != NULL ? req -> meth : "GET" , req -> uri , req -> vers );
537
536
return (rv );
538
537
}
539
538
@@ -542,7 +541,7 @@ http_res_prepare(nni_http_res *res)
542
541
{
543
542
int rv ;
544
543
rv = http_asprintf (& res -> buf , & res -> bufsz , & res -> hdrs , "%s %d %s\r\n" ,
545
- nni_http_res_get_version ( res ) , nni_http_res_get_status (res ),
544
+ res -> vers , nni_http_res_get_status (res ),
546
545
nni_http_res_get_reason (res ));
547
546
return (rv );
548
547
}
@@ -612,7 +611,7 @@ nni_http_req_alloc(nni_http_req **reqp, const nng_url *url)
612
611
req -> data .data = NULL ;
613
612
req -> data .size = 0 ;
614
613
req -> data .own = false;
615
- req -> vers = NULL ;
614
+ req -> vers = NNG_HTTP_VERSION_1_1 ;
616
615
req -> meth = NULL ;
617
616
req -> uri = NULL ;
618
617
if (url != NULL ) {
@@ -664,7 +663,7 @@ nni_http_res_alloc(nni_http_res **resp)
664
663
res -> data .data = NULL ;
665
664
res -> data .size = 0 ;
666
665
res -> data .own = false;
667
- res -> vers = NULL ;
666
+ res -> vers = NNG_HTTP_VERSION_1_1 ;
668
667
res -> rsn = NULL ;
669
668
res -> code = 0 ;
670
669
* resp = res ;
@@ -686,31 +685,48 @@ nni_http_req_get_uri(const nni_http_req *req)
686
685
const char *
687
686
nni_http_req_get_version (const nni_http_req * req )
688
687
{
689
- return (req -> vers != NULL ? req -> vers : "HTTP/1.1" );
688
+ return (req -> vers );
690
689
}
691
690
692
691
const char *
693
692
nni_http_res_get_version (const nni_http_res * res )
694
693
{
695
- return (res -> vers != NULL ? res -> vers : "HTTP/1.1" );
694
+ return (res -> vers );
695
+ }
696
+
697
+ static const char * http_versions [] = {
698
+ // for efficiency, we order in most likely first
699
+ "HTTP/1.1" ,
700
+ "HTTP/2" ,
701
+ "HTTP/3" ,
702
+ "HTTP/1.0" ,
703
+ "HTTP/0.9" ,
704
+ NULL ,
705
+ };
706
+
707
+ static int
708
+ http_set_version (const char * * ptr , const char * vers )
709
+ {
710
+ vers = vers != NULL ? vers : NNG_HTTP_VERSION_1_1 ;
711
+ for (int i = 0 ; http_versions [i ] != NULL ; i ++ ) {
712
+ if (strcmp (vers , http_versions [i ]) == 0 ) {
713
+ * ptr = http_versions [i ];
714
+ return (0 );
715
+ }
716
+ }
717
+ return (NNG_ENOTSUP );
696
718
}
697
719
698
720
int
699
721
nni_http_req_set_version (nni_http_req * req , const char * vers )
700
722
{
701
- if ((vers != NULL ) && (strcmp (vers , "HTTP/1.1" ) == 0 )) {
702
- vers = NULL ;
703
- }
704
- return (http_set_string (& req -> vers , vers ));
723
+ return (http_set_version (& req -> vers , vers ));
705
724
}
706
725
707
726
int
708
727
nni_http_res_set_version (nni_http_res * res , const char * vers )
709
728
{
710
- if ((vers != NULL ) && (strcmp (vers , "HTTP/1.1" ) == 0 )) {
711
- vers = NULL ;
712
- }
713
- return (http_set_string (& res -> vers , vers ));
729
+ return (http_set_version (& res -> vers , vers ));
714
730
}
715
731
716
732
int
0 commit comments