1
+ #ifndef HOBBIT_REQUEST_H
2
+ #define HOBBIT_REQUEST_H
3
+ /**
4
+ * POC DO NOT USE IN PRODUCTION
5
+ * UNSAFE UNSAFE UNSAFE
6
+ */
7
+ #include <stdio.h>
8
+ #include <string.h>
9
+ #include "util.h"
10
+
11
+ struct ewp_request {
12
+ char * proto ;
13
+ char * version ;
14
+ char * command ;
15
+ char * compression ;
16
+ vector response_compression ;
17
+ unsigned int head_only_indicator : 1 ;
18
+ size_t header_len ;
19
+ size_t body_len ;
20
+ char * header ;
21
+ char * body ;
22
+ };
23
+
24
+ int ewp_request_parse (char * in ,struct ewp_request * req )
25
+ {
26
+ int index = index_of_char (in ,'\n' );
27
+ char * request_line = substring (in ,0 ,index );
28
+
29
+ vector request = explode (" " ,request_line );
30
+ //printf("%d\n",vector_length(request));
31
+ if (vector_length (request ) < 7 ){
32
+ vector_free (request );
33
+ return 1 ;
34
+ //Not enough parameters
35
+ }
36
+
37
+ char * tmp = (char * )vector_get (request ,0 );
38
+ req -> proto = (char * )calloc (strlen (tmp )+ 1 ,sizeof (char ));
39
+ strcpy (req -> proto ,tmp );
40
+
41
+ tmp = (char * )vector_get (request ,1 );
42
+ req -> version = (char * )calloc (strlen (tmp )+ 1 ,sizeof (char ));
43
+ strcpy (req -> version ,tmp );
44
+
45
+ tmp = (char * )vector_get (request ,2 );
46
+ req -> command = (char * )calloc (strlen (tmp )+ 1 ,sizeof (char ));
47
+ strcpy (req -> command ,tmp );
48
+
49
+ tmp = (char * )vector_get (request ,3 );
50
+ req -> compression = (char * )calloc (strlen (tmp )+ 1 ,sizeof (char ));
51
+ strcpy (req -> compression ,tmp );
52
+
53
+ req -> response_compression = explode ("," ,(char * )vector_get (request ,4 ));
54
+ req -> head_only_indicator = (vector_length (request ) == 8 && ((char * )vector_get (request ,7 ))[0 ] == 'H' );
55
+ if (index != -1 ){
56
+ char * request_body = substring (in ,index + 1 ,strlen (in ));
57
+ req -> header_len = atoi ((char * )vector_get (request ,5 ));
58
+ req -> body_len = atoi ((char * )vector_get (request ,6 ));
59
+ req -> header = substring (request_body ,0 ,req -> header_len );
60
+ req -> body = substring (request_body ,req -> header_len ,req -> body_len );
61
+ free (request_body );
62
+ }
63
+ vector_free (request );
64
+ return 0 ;
65
+
66
+ }
67
+
68
+ char * ewp_request_marshal (struct ewp_request * req ,size_t * size )
69
+ {
70
+
71
+ char * tmp ;
72
+ char * out = req -> proto ;
73
+ * size += strlen (out );
74
+ tmp = strappend (' ' ,req -> version );
75
+ * size += strlen (tmp );
76
+ out = concat (out ,tmp , SECOND );
77
+ tmp = strappend (' ' ,req -> command );
78
+ * size += strlen (tmp );
79
+ out = concat (out ,tmp ,FIRST | SECOND );
80
+ tmp = strappend (' ' ,req -> compression );
81
+ * size += strlen (tmp );
82
+ out = concat (out ,tmp ,FIRST | SECOND );
83
+
84
+ size_t length = vector_length (req -> response_compression );
85
+ for (size_t i = 0 ; i < length ; i ++ ){
86
+ if (i != 0 ){
87
+ tmp = strappend (',' ,(char * )vector_get (req -> response_compression ,i ));
88
+ * size += strlen (tmp );
89
+ out = concat (out ,tmp ,FIRST | SECOND );
90
+ }else {
91
+ * size += strlen ((char * )vector_get (req -> response_compression ,i ));
92
+ out = concat (out ,(char * )vector_get (req -> response_compression ,i ),FIRST );
93
+ }
94
+ }
95
+ tmp = strappend (' ' ,req -> compression );
96
+ * size += strlen (tmp );
97
+ out = concat (out ,tmp ,FIRST | SECOND );
98
+
99
+ tmp = strappend (' ' ,ltoa (req -> header_len ));
100
+ * size += strlen (tmp );
101
+ out = concat (out ,tmp ,FIRST | SECOND );
102
+ tmp = strappend (' ' ,ltoa (req -> body_len ));
103
+ * size += strlen (tmp );
104
+ out = concat (out ,tmp ,FIRST | SECOND );
105
+
106
+ if (req -> head_only_indicator == 1 ){
107
+ out = concat (out ," H\n" ,FIRST );
108
+ * size += 3 ;
109
+ }else {
110
+ tmp = concat (req -> header ,req -> body ,0 );
111
+ * size += strlen (tmp );
112
+ out = concat (out ,strappend ('\n' ,tmp ),FIRST |SECOND );
113
+ free (tmp );
114
+ }
115
+ return out ;
116
+ }
117
+
118
+
119
+
120
+
121
+
122
+ #endif
0 commit comments