Line data Source code
1 : #include "http_minipot_session.h" 2 : #include "http_minipot_session_process.h" 3 : #include "http_minipot_session_report.h" 4 : #include <minipot_utils.h> 5 : #include <stdlib.h> 6 : #include "log.h" 7 : 8 0 : static void timeout_cb(evutil_socket_t fd, short events, void *arg) { 9 0 : MINIPOT_TRACE_FUNC; 10 0 : http_minipot_session_close((struct http_minipot_session *)arg); 11 0 : } 12 : 13 0 : static void read_cb(evutil_socket_t fd, short events, void *arg) { 14 0 : MINIPOT_TRACE_FUNC; 15 0 : struct http_minipot_session *self = arg; 16 0 : ssize_t recv_cnt = recv(fd, self->http_minipot->parent.recv_buff, 17 : MINIPOT_RECV_BUFF_LEN, 0); 18 0 : switch (recv_cnt) { 19 0 : case -1: 20 0 : if (errno == EAGAIN) 21 0 : return; 22 0 : info("Receive error on connection with FD: %d", fd); 23 0 : case 0: 24 0 : http_minipot_session_close(self); 25 0 : return; 26 : } 27 : // remove inactivity timeout 28 0 : event_del(self->inac_tout_ev); 29 0 : proc_rec_data(self, recv_cnt); 30 : // reset keep alive timer 31 0 : struct timeval tm = {KEEP_ALIVE_TOUT, 0}; 32 0 : evtimer_add(self->keep_alive_tout_ev, &tm); 33 : } 34 : 35 0 : void http_minipot_session_init(struct http_minipot_session *self, 36 : struct http_minipot *hm) { 37 0 : MINIPOT_TRACE_FUNC; 38 0 : minipot_session_init(&self->parent); 39 0 : self->http_minipot = hm; 40 0 : self->inac_tout_ev = evtimer_new(self->http_minipot->parent.ev_base, 41 : timeout_cb, self); 42 0 : assert(self->inac_tout_ev); 43 0 : self->keep_alive_tout_ev = evtimer_new(self->http_minipot->parent.ev_base, 44 : timeout_cb, self); 45 0 : assert(self->keep_alive_tout_ev); 46 0 : self->token_buff = malloc(sizeof(*self->token_buff) * TOKEN_BUFF_LEN); 47 0 : self->method = malloc(sizeof(*self->method) * METHOD_LEN); 48 0 : self->url = malloc(sizeof(*self->url) * URL_LEN); 49 0 : self->user_ag = malloc(sizeof(*self->user_ag) * USER_AG_LEN); 50 0 : self->auth = malloc(sizeof(*self->auth) * AUTH_LEN); 51 0 : } 52 : 53 0 : void http_minipot_session_destroy(struct http_minipot_session *self) { 54 0 : MINIPOT_TRACE_FUNC; 55 0 : minipot_session_destroy(&self->parent); 56 0 : event_free(self->inac_tout_ev); 57 0 : event_free(self->keep_alive_tout_ev); 58 0 : free(self->token_buff); 59 0 : free(self->method); 60 0 : free(self->url); 61 0 : free(self->user_ag); 62 0 : free(self->auth); 63 0 : } 64 : 65 0 : void http_minipot_session_reset_tk_buff(struct http_minipot_session *self) { 66 0 : MINIPOT_TRACE_FUNC; 67 0 : self->token_buff_wrt_ptr = self->token_buff; 68 0 : self->token_buff_free_len = TOKEN_BUFF_LEN; 69 0 : } 70 : 71 0 : void http_minipot_session_reset_mesg_limits(struct http_minipot_session *self) { 72 0 : MINIPOT_TRACE_FUNC; 73 0 : self->state = PROC_REQ_LINE; 74 0 : self->method_len = 0; 75 0 : self->url_len = 0; 76 0 : self->user_ag_len = 0; 77 0 : self->auth_len = 0; 78 0 : self->header_cnt = 0; 79 0 : self->trans_enc_head_received = false; 80 0 : self->is_chunked_tr_enc_last = false; 81 0 : self->content_len = 0; 82 0 : self->chunk_size = 0; 83 0 : } 84 : 85 0 : static void http_minipot_session_reset(struct http_minipot_session *self) { 86 0 : MINIPOT_TRACE_FUNC; 87 0 : self->msg_cnt = 0; 88 0 : http_minipot_session_reset_mesg_limits(self); 89 0 : http_minipot_session_reset_tk_buff(self); 90 0 : } 91 : 92 0 : void http_minipot_session_accept(struct http_minipot_session *self, int listen_fd) { 93 0 : MINIPOT_TRACE_FUNC; 94 0 : if (minipot_session_accept(&self->parent, listen_fd, 95 0 : self->http_minipot->parent.ev_base, read_cb, self)) 96 0 : return; 97 0 : http_minipot_session_reset(self); 98 0 : struct timeval tm = {INACT_TOUT, 0}; 99 0 : evtimer_add(self->inac_tout_ev, &tm); 100 0 : if (http_report_connect(self)) 101 0 : error("Couldn't report connect"); 102 : } 103 : 104 0 : void http_minipot_session_close(struct http_minipot_session *self) { 105 0 : MINIPOT_TRACE_FUNC; 106 0 : minipot_session_close(&self->parent); 107 0 : event_del(self->inac_tout_ev); 108 0 : event_del(self->keep_alive_tout_ev); 109 : // when we close some session there must be at least one free slot 110 : // from now se we can accpet new connections 111 0 : http_minipot_start_accept_new_conn(self->http_minipot); 112 0 : } 113 : 114 0 : int http_minipot_session_is_available(struct http_minipot_session *self) { 115 0 : MINIPOT_TRACE_FUNC; 116 0 : return minipot_session_is_available(&self->parent); 117 : }