-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrequest.h
More file actions
157 lines (128 loc) · 3.87 KB
/
request.h
File metadata and controls
157 lines (128 loc) · 3.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifndef Au9MTAsFSOTIW3GaVruXIl3gVBU_REQUEST_H
#define Au9MTAsFSOTIW3GaVruXIl3gVBU_REQUEST_H
#include <stdint.h>
#include <stdbool.h>
#include <netinet/in.h>
#include "buffer.h"
#include "parser_utils.h"
//#include "response.h"
#define MAX_REQUEST_TARGET_SIZE 8000
#define MAX_HEADER_FIELD_NAME_SIZE 256
#define MAX_HEADER_FIELD_VALUE_SIZE 8000 //TODO
typedef enum http_method {
http_method_GET,
http_method_POST,
http_method_HEAD
} http_method;
enum socks_addr_type {
socks_req_addrtype_ipv4 = 0x01,
socks_req_addrtype_domain = 0x03,
socks_req_addrtype_ipv6 = 0x04,
};
union socks_addr {
char fqdn[0xff];
struct sockaddr_in ipv4;
struct sockaddr_in6 ipv6;
};
struct request {
http_method method;
union socks_addr dest_addr;
char *host;
in_port_t port;
double content_length;
struct response *response;
};
enum request_state {
request_method,
request_target,
request_SP_AFTER_TARGET,
request_HTTP_version,
request_SP_AFTER_METHOD,
request_CRLF,
request_header_field_name,
request_header_value,
request_host_field_value,
request_OWS_after_value,
request_waiting_for_LF,
request_empty_line_waiting_for_LF,
request_content_length,
request_no_empty_host,
ignore_LF_end,
request_dstaddr_fqdn,
request_dstaddr,
request_dstport,
LF_end,
request_ignore_header,
// apartir de aca están done
request_done,
// y apartir de aca son considerado con error
request_error,
request_error_unsupported_method,
request_error_unsupported_http_version,
request_error_unsupported_version,
request_error_too_long_request_target,
};
struct request_parser {
struct request *request;
enum request_state state;
char request_target[MAX_REQUEST_TARGET_SIZE + 1];
char header_field_name[MAX_HEADER_FIELD_NAME_SIZE + 1];
char header_field_value[MAX_HEADER_FIELD_VALUE_SIZE + 1];
/** cuantos bytes ya leimos */
uint16_t i;
/** http parser for method, http version **/
struct parser *http_sub_parser;
int host_field_value_complete;
struct parser_definition d; //For recieving byte to byte.
int value_len;
};
//enum response_status {
// status_succeeded,
// status_general_SOCKS_server_failure,
// status_connection_not_allowed_by_ruleset,
// status_network_unreachable,
// status_host_unreachable,
// status_connection_refused,
// status_ttl_expired,
// status_command_not_supported,
// status_address_type_not_supported,
//};
/** inicializa el parser */
void request_parser_init(struct request_parser *p);
/** entrega un byte al parser. retorna true si se llego al final */
enum request_state
request_parser_feed(struct request_parser *p, const uint8_t c, buffer *accum);
/**
* por cada elemento del buffer llama a `request_parser_feed' hasta que
* el parseo se encuentra completo o se requieren mas bytes.
*
* @param errored parametro de salida. si es diferente de NULL se deja dicho
* si el parsing se debió a una condición de error
*/
enum request_state
request_consume(buffer *b, struct request_parser *p, bool *errored, buffer *pBuffer);
/**
* Permite distinguir a quien usa request_parser_feed si debe seguir
* enviando caracters o no.
*
* En caso de haber terminado permite tambien saber si se debe a un error
*/
bool request_is_done(const enum request_state st, bool *errored);
void request_close(struct request_parser *p);
char *strtolower(char *s, int size);
///**
// * serializa en buff la una respuesta al request.
// *
// * Retorna la cantidad de bytes ocupados del buffer o -1 si no había
// * espacio suficiente.
// */
//extern int
//request_marshall(buffer *b,
// const enum response_status status);
///** convierte a errno en response_status */
//enum response_status
//errno_to_socks(int e);
//
//#include <netdb.h>
//#include <arpa/inet.h>
#endif