rsstats 0.0.1
Redis Enterprise Statistic collector
libhttp.c
Go to the documentation of this file.
1
19#include "libhttp.h"
20
21#include <stdlib.h>
22#include <stdio.h>
23#include <string.h>
24#include <assert.h>
25
26typedef enum HTTPVersion_e {
35
36typedef enum HTTPMethod_e {
48
49typedef struct HTTPHeaders_s {
51 char* name;
52 char* value;
54
55typedef struct HTTP_s {
57 char* body;
59
61 HTTP_t* retval;
62
63 if (NULL==(retval=malloc(sizeof(struct HTTP_s)))) {
64 perror("HTTP_new");
65 exit(EXIT_FAILURE);
66 }
67
68 if (NULL==(retval->headers=malloc(sizeof(struct HTTPHeaders_s)))) {
69 perror("HTTP_new headers initialization");
70 exit(EXIT_FAILURE);
71 }
72 retval->headers->next = NULL;
73 retval->headers->name = NULL;
74 retval->headers->value = NULL;
75
76 if (NULL==(retval->body=malloc(1))) {
77 perror("HTTP_new empty body allocation");
78 exit(EXIT_FAILURE);
79 };
80 retval->body[0]=0;
81
82 return retval;
83}
84
85void HTTP_addheader(HTTP_t* http, const char* name, const char* value) {
86 HTTPHeaders_t* headers;
87
88 assert(http);
89 assert(http->headers);
90 assert(http->body);
91
92 if (NULL==(headers=malloc(sizeof(struct HTTPHeaders_s)))) {
93 perror("HTTP_addheader");
94 exit(EXIT_FAILURE);
95 }
96 if (NULL==(headers->name=malloc(strlen(name)+1))) {
97 perror("HTTP_addheader name malloc");
98 exit(EXIT_FAILURE);
99 }
100 strcpy(headers->name,name);
101 if (NULL==(headers->value=malloc(strlen(value)+1))) {
102 perror("HTTP_addheader value malloc");
103 exit(EXIT_FAILURE);
104 }
105 strcpy(headers->value,value);
106 headers->next = http->headers;
107 http->headers = headers;
108}
109
110char* HTTP_getheaders(const HTTP_t* http) {
111 HTTPHeaders_t* headers;
112 char* retval;
113
114 assert(http);
115 assert(http->headers);
116 assert(http->body);
117
118 if (NULL==(retval=malloc(1))) {
119 perror("HTTP_getheaders initial malloc");
120 exit(EXIT_FAILURE);
121 };
122 retval[0]=0;
123 for (headers=http->headers; headers; headers=headers->next) {
124 if (headers->name && headers->value) {
125 char* newretval;
126 if (NULL==(newretval=realloc(retval,strlen(retval)+strlen(headers->name)+2+strlen(headers->value)+2+1))) {
127 perror("HTTP_getheaders inner loop");
128 exit(EXIT_FAILURE);
129 }
130 retval=newretval;
131 strcat(retval,headers->name);
132 strcat(retval,": ");
133 strcat(retval,headers->value);
134 strcat(retval,"\r\n");
135 }
136 }
137 return retval;
138}
139
140void HTTP_del(HTTP_t* http) {
141 HTTPHeaders_t* headers_it;
142 assert(http);
143 assert(http->headers);
144 assert(http->body);
145
146 while (NULL!=(headers_it=http->headers)) {
147 http->headers=http->headers->next;
148 if (headers_it->name)
149 free(headers_it->name);
150 if (headers_it->value)
151 free(headers_it->value);
152 free(headers_it);
153 }
154 free(http->body);
155 free(http);
156}
157
158char* HTTP_getrequest(const HTTPMethod_t method, const char* uri, const HTTPVersion_t version) {
159 char* retval;
160
161 assert(method<=HTTPMETHOD_INVALID);
162 assert(version<=HTTPVERSION_INVALID);
163
164 if (NULL==(retval=malloc(7+1+strlen(uri)+1+8+1))) {
165 perror("HTTP_getrequest");
166 exit(EXIT_FAILURE);
167 }
168 retval[0]=0;
169
170 switch(method) {
171 case HTTPMETHOD_GET:
172 strcat(retval, "GET");
173 break;;
174 case HTTPMETHOD_HEAD:
175 case HTTPMETHOD_POST:
176 case HTTPMETHOD_PUT:
180 case HTTPMETHOD_TRACE:
181 case HTTPMETHOD_PATCH:
183 default:
184 fprintf(stderr,"HTTP method not supported\n");
185 exit(EXIT_FAILURE);
186 break;;
187 }
188 strcat(retval," ");
189
190 /* NULL URI allowed, as an empty string */
191 if (uri)
192 strcat(retval, uri);
193
194 strcat(retval," HTTP/");
195 switch(version) {
198 strcat(retval, "1.1");
199 break;;
205 default:
206 fprintf(stderr,"HTTP version not supported\n");
207 exit(EXIT_FAILURE);
208 break;;
209 }
210 strcat(retval, "\r\n");
211 return retval;
212}
213
214void HTTP_setbody(HTTP_t* http, const char* body) {
215 char* newbody;
216
217 assert(http);
218 assert(http->body);
219
220 if (NULL==(newbody=realloc(http->body,strlen(body)+1))) {
221 perror("HTTP_setbody");
222 exit(EXIT_FAILURE);
223 }
224
225 http->body = newbody;
226 strcpy(http->body, body);
227}
228
229char* HTTP_getbody(HTTP_t* http) {
230 assert(http);
231 assert(http->body);
232
233 return http->body;
234}
const char *const name
Definition: cJSON.h:268
enum HTTPVersion_e HTTPVersion_t
void HTTP_del(HTTP_t *http)
Definition: libhttp.c:140
void HTTP_addheader(HTTP_t *http, const char *name, const char *value)
Definition: libhttp.c:85
HTTPMethod_e
Definition: libhttp.c:36
@ HTTPMETHOD_PUT
Definition: libhttp.c:40
@ HTTPMETHOD_POST
Definition: libhttp.c:39
@ HTTPMETHOD_CONNECT
Definition: libhttp.c:42
@ HTTPMETHOD_TRACE
Definition: libhttp.c:44
@ HTTPMETHOD_PATCH
Definition: libhttp.c:45
@ HTTPMETHOD_DELETE
Definition: libhttp.c:41
@ HTTPMETHOD_OPTIONS
Definition: libhttp.c:43
@ HTTPMETHOD_GET
Definition: libhttp.c:37
@ HTTPMETHOD_INVALID
Definition: libhttp.c:46
@ HTTPMETHOD_HEAD
Definition: libhttp.c:38
HTTPVersion_e
Definition: libhttp.c:26
@ HTTPVERSION_HTTP11b
Definition: libhttp.c:30
@ HTTPVERSION_INVALID
Definition: libhttp.c:33
@ HTTPVERSION_HTTP09
Definition: libhttp.c:27
@ HTTPVERSION_HTTP2
Definition: libhttp.c:31
@ HTTPVERSION_HTTP10
Definition: libhttp.c:28
@ HTTPVERSION_HTTP3
Definition: libhttp.c:32
@ HTTPVERSION_HTTP11
Definition: libhttp.c:29
enum HTTPMethod_e HTTPMethod_t
struct HTTP_s HTTP_t
HTTP_t * HTTP_new()
Definition: libhttp.c:60
struct HTTPHeaders_s HTTPHeaders_t
char * HTTP_getheaders(const HTTP_t *http)
Definition: libhttp.c:110
void HTTP_setbody(HTTP_t *http, const char *body)
Definition: libhttp.c:214
char * HTTP_getbody(HTTP_t *http)
Definition: libhttp.c:229
char * HTTP_getrequest(const HTTPMethod_t method, const char *uri, const HTTPVersion_t version)
Definition: libhttp.c:158
HTTP parsing and building library.
#define NULL
Definition: rsstats-opts.c:64
Definition: libhttp.c:55
char * body
Definition: libhttp.c:57
HTTPHeaders_t * headers
Definition: libhttp.c:56
char * value
Definition: libhttp.c:52
char * name
Definition: libhttp.c:51
struct HTTPHeaders_s * next
Definition: libhttp.c:50