From 94d106a7a3fe3f3156062e5e76cb681c0bdef3f6 Mon Sep 17 00:00:00 2001 From: mmmdbybyd <915445800@qq.com> Date: Fri, 7 Dec 2018 09:29:41 +0800 Subject: [PATCH] Add files via upload --- Makefile | 2 +- dns.h | 2 ++ http.c | 77 ++++++++----------------------------------------------- http.h | 4 ++- main.c | 19 +++++++------- main.h | 2 +- timeout.c | 27 +++++++++++++++++++ timeout.h | 12 +++++++++ 8 files changed, 66 insertions(+), 79 deletions(-) create mode 100644 timeout.c create mode 100644 timeout.h diff --git a/Makefile b/Makefile index 393d282..e7b48a1 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ ifeq ($(ANDROID_DATA),/data) endif -all : main.o http.o dns.o +all : main.o http.o dns.o timeout.o $(CC) $(CFLAGS) $(DEFS) -o $(OBJ) $^ strip $(OBJ) -chmod 777 $(OBJ) 2>&- diff --git a/dns.h b/dns.h index 9f7c01c..ecdb642 100644 --- a/dns.h +++ b/dns.h @@ -3,6 +3,8 @@ #include "main.h" +#define DEFAULT_DNS_IP "114.114.114.114" + struct dns { char request[512]; //UDP的DNS请求不超512字节 uint16_t request_len, sent_len; diff --git a/http.c b/http.c index 9d8dfeb..1a0dd08 100644 --- a/http.c +++ b/http.c @@ -1,21 +1,15 @@ #include "http.h" #include "dns.h" +#include "timeout.h" +#define SSL_RSP "HTTP/1.1 200 Connection established\r\n\r\n" #define HTTP_TYPE 0 #define OTHER_TYPE 1 conn_t cts[MAX_CONNECTION]; -static char ssl_rsp[] = "HTTP/1.1 200 Connection established\r\n\r\n"; char *local_header, *proxy_header, *ssl_proxy; int lisFd, proxy_header_len, local_header_len; -uint8_t strict_spilce, encodeCode; - -/* 对数据进行编码 */ -static void dataEncode(char *data, int data_len) -{ - while (data_len-- > 0) - data[data_len] ^= encodeCode; -} +uint8_t strict_spilce; int8_t connectionToServer(char *ip, conn_t *server) { @@ -146,19 +140,10 @@ static char *get_host(char *data) while (*host == ' ') host++; hostEnd = strchr(host, '\r'); - if (hostEnd) - { - if (encodeCode) - dataEncode(host, hostEnd - host); return strndup(host, hostEnd - host); - } else - { - if (encodeCode) - dataEncode(host, strlen(host)); return strdup(host); - } } /* 删除请求头中的头域 */ @@ -192,24 +177,6 @@ static void del_hdr(char *header, int *header_len) } } -/* 对请求头中的Referer头域进行编码 */ -static void encodeReferer(char *request) -{ - char *referer_key, *referer_value, *line, *pr; - - for (line = strchr(request, '\n'); (referer_key = strstr(line, "\nReferer:")) != NULL || (referer_key = strstr(line, "\nreferer:")) != NULL; line = pr + 1) - { - referer_value = referer_key + sizeof("\nReferer:") - 1; - while (*referer_value == ' ') - referer_value++; - pr = strchr(referer_value, '\r'); - if (pr) - dataEncode(referer_value, pr - referer_value); - else - dataEncode(referer_value, strlen(referer_value)); - } -} - /* 构建新请求头 */ static char *build_request(char *client_data, int *data_len, char *host) { @@ -225,7 +192,6 @@ static char *build_request(char *client_data, int *data_len, char *host) lf = strchr(header, '\n'); if (url == NULL || lf == NULL || lf - 10 <= header) return client_data; - if (url < lf && *(++url) != '/') { uri = strchr(url + 7, '/'); @@ -243,12 +209,6 @@ static char *build_request(char *client_data, int *data_len, char *host) *data_len -= p - url; lf -= p - url; } - if (encodeCode) - dataEncode(url + 1, lf - 10 - (url + 1)); - } - else if (url < lf && encodeCode) - { - dataEncode(url + 1, lf - 10 - (url + 1)); } *data_len += strlen(proxy_host) + 8; //8为 "Host: " + "\r\n"的长度 @@ -273,8 +233,6 @@ static char *build_request(char *client_data, int *data_len, char *host) free(client_data); if (proxy_host != host) free(proxy_host); - if (encodeCode) - encodeReferer(new_data); if (strict_spilce == 0) return new_data; client_data = new_data; @@ -352,8 +310,6 @@ static void serverToClient(conn_t *server) client = server - 1; while ((server->ready_data_len = read(server->fd, server->ready_data, BUFFER_SIZE)) > 0) { - if (encodeCode) //对服务端的数据编码 - dataEncode(server->ready_data, server->ready_data_len); write_len = write(client->fd, server->ready_data, server->ready_data_len); if (write_len == -1) { @@ -392,6 +348,7 @@ void tcp_out(conn_t *to) from = to - 1; else from = to + 1; + from->last_event_time = to->last_event_time = time(NULL); write_len = write(to->fd, from->ready_data + from->sent_len, from->ready_data_len - from->sent_len); if (write_len == from->ready_data_len - from->sent_len) { @@ -439,11 +396,13 @@ void tcp_in(conn_t *in) //如果in - cts是奇数,那么是服务端触发事件 if ((in - cts) & 1) { + in->last_event_time = (in-1)->last_event_time = time(NULL); if (in->ready_data_len == 0) serverToClient(in); return; } - + + in->last_event_time = (in+1)->last_event_time = time(NULL); in->incomplete_data = read_data(in, in->incomplete_data, &in->incomplete_data_len); if (in->incomplete_data == NULL) { @@ -454,8 +413,6 @@ void tcp_in(conn_t *in) server->request_type = in->request_type = request_type(in->incomplete_data); if (in->request_type == OTHER_TYPE) { - if (encodeCode) - dataEncode(in->incomplete_data, in->incomplete_data_len); //如果是第一次读取数据,并且不是HTTP请求的,关闭连接。复制数据失败的也关闭连接 if (in->reread_data == 0 || copy_data(in) != 0) { @@ -464,13 +421,10 @@ void tcp_in(conn_t *in) } goto handle_data_complete; } - headerEnd = strstr(in->incomplete_data, "\n\r\n"); + headerEnd = strstr(in->incomplete_data, "\n\r"); //请求头不完整,等待下次读取 if (headerEnd == NULL) return; - headerEnd += 3; - if (encodeCode) - dataEncode(headerEnd, in->incomplete_data_len - (headerEnd - in->incomplete_data)); host = get_host(in->incomplete_data); if (host == NULL) { @@ -491,12 +445,13 @@ void tcp_in(conn_t *in) { server->is_ssl = in->is_ssl = 1; /* 这时候即使fd是非阻塞也只需要判断返回值是否小于0 */ - if (write(in->fd, ssl_rsp, sizeof(ssl_rsp) - 1) < 0) + if (write(in->fd, SSL_RSP, sizeof(SSL_RSP)-1) < 0) { free(host); close_connection(in); return; } + headerEnd += 3; if (headerEnd - in->incomplete_data < in->incomplete_data_len) { in->incomplete_data_len -= headerEnd - in->incomplete_data; @@ -507,16 +462,6 @@ void tcp_in(conn_t *in) free(host); return; } - else - { - //如果是CONNECT代理HTTP,需要重新获取host - char *save_host = host; - host = get_host(in->incomplete_data); - if (!host) - host = save_host; - else - free(save_host); - } } else { @@ -547,8 +492,6 @@ void *accept_loop(void *ptr) struct epoll_event epollEvent; conn_t *client; - if (encodeCode) - dataEncode(ssl_rsp, sizeof(ssl_rsp) - 1); epollEvent.events = EPOLLIN|EPOLLET; while (1) { diff --git a/http.h b/http.h index 0704dda..d77ed28 100644 --- a/http.h +++ b/http.h @@ -6,9 +6,11 @@ typedef struct tcp_connection { char *ready_data, *incomplete_data; int fd, ready_data_len, incomplete_data_len, sent_len; + unsigned int last_event_time; uint16_t destPort; unsigned reread_data :1; unsigned request_type :1; + unsigned keep_alive :1; unsigned is_ssl :1; } conn_t; @@ -22,6 +24,6 @@ extern void tcp_out(conn_t *ct); extern conn_t cts[MAX_CONNECTION]; extern char *local_header, *proxy_header, *ssl_proxy; extern int lisFd, local_header_len, proxy_header_len; -extern uint8_t strict_spilce, isEncode, encodeCode; +extern uint8_t strict_spilce; #endif \ No newline at end of file diff --git a/main.c b/main.c index 0b24614..419bf9c 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,6 @@ #include "main.h" #include "http.h" +#include "timeout.h" #include "dns.h" #include @@ -19,8 +20,8 @@ static void usage() " -L local proxy header \033[35G default is 'Local'\n" " -d dns query address \033[35G default is " DEFAULT_DNS_IP "\n" " -s ssl proxy string \033[35G default is 'CONNECT'\n" - " -u uid \033[35G running uid\n" - " -e \033[35G set encode data code(1-127)\n" + " -t timeout \033[35G default is 35s\n" + " -u uid \033[35G running uid\n" " -a \033[35G all http requests repeat spilce\n" " -h display this infomaction\n" " -w worker process\n"); @@ -80,7 +81,7 @@ static void initializate(int argc, char **argv) dnsAddr.sin_addr.s_addr = inet_addr(DEFAULT_DNS_IP); dnsAddr.sin_port = htons(53); dns_connect(&dnsAddr); //主进程中的fd - strict_spilce = encodeCode = 0; + strict_spilce = timeout_seconds = 0; local_header = NULL; ssl_proxy = (char *)"CONNECT"; local_header = (char *)"\nLocal:"; @@ -88,7 +89,7 @@ static void initializate(int argc, char **argv) proxy_header_len = strlen(proxy_header); local_header_len = strlen(local_header); /* 处理命令行参数 */ - while ((opt = getopt(argc, argv, "d:l:e:p:s:w:u:L:ah")) != -1) + while ((opt = getopt(argc, argv, "d:l:p:s:w:t:u:L:ah")) != -1) { switch (opt) { @@ -116,10 +117,6 @@ static void initializate(int argc, char **argv) } break; - case 'e': - encodeCode = (int8_t)atoi(optarg); - break; - case 'p': //假如选项值为 "Proxy", proxy_header设置为 "\nProxy:" proxy_header_len = strlen(optarg) + 2; @@ -155,6 +152,10 @@ static void initializate(int argc, char **argv) strict_spilce = 1; break; + case 't': + timeout_seconds = (unsigned int)atoi(optarg); + break; + case 'w': workers = atoi(optarg); break; @@ -228,7 +229,7 @@ static void initializate(int argc, char **argv) int main(int argc, char **argv) { initializate(argc, argv); - if (daemon(1, 0)) + if (daemon(1, 1)) { perror("daemon"); return 1; diff --git a/main.h b/main.h index 5eaff0d..0b52b39 100644 --- a/main.h +++ b/main.h @@ -16,7 +16,7 @@ #include #include -#define BUFFER_SIZE 4096 +#define BUFFER_SIZE 10240 #define MAX_CONNECTION 1020 extern struct epoll_event evs[MAX_CONNECTION + 1], ev; diff --git a/timeout.c b/timeout.c new file mode 100644 index 0000000..11d4a6f --- /dev/null +++ b/timeout.c @@ -0,0 +1,27 @@ +#include "main.h" +#include "http.h" +#include "time.h" + +unsigned int timeout_seconds; + +void *close_timeout_connectionLoop(void *nullPtr) +{ + time_t currentTime; + int i, recv_return; + char c; + + while (1) + { + sleep(1); + currentTime = time(NULL); + for (i = 0; i < MAX_CONNECTION; i += 2) + { + if (cts[i].fd > -1 && cts[i].is_ssl == 0 && cts[i].last_event_time != 0 && currentTime - cts[i].last_event_time >= (time_t)timeout_seconds) + { + recv_return = recv(cts[i].fd, &c, 1, MSG_PEEK); + if (recv_return == 0 && errno != EAGAIN) + close_connection(cts + i); + } + } + } +} \ No newline at end of file diff --git a/timeout.h b/timeout.h new file mode 100644 index 0000000..e9af241 --- /dev/null +++ b/timeout.h @@ -0,0 +1,12 @@ +#ifndef TIME_H +#define TIME_H + +#define DEFAULT_TIMEOUT 35 + +#include + +extern unsigned int timeout_seconds; + +void *close_timeout_connectionLoop(void *nullPtr); + +#endif \ No newline at end of file