2019-01-19 16:13:58 +08:00
|
|
|
|
#include "conf.h"
|
2022-01-19 21:48:02 +08:00
|
|
|
|
#include "http_request.h"
|
2019-01-19 16:13:58 +08:00
|
|
|
|
|
2021-07-20 22:17:06 +08:00
|
|
|
|
/* 字符串预处理,设置转义字符 */
|
|
|
|
|
static void string_pretreatment(char *str, int *len)
|
|
|
|
|
{
|
|
|
|
|
char *lf, *p, *ori_strs[] = { "\\r", "\\n", "\\b", "\\v", "\\f", "\\t", "\\a", "\\b", "\\0" }, to_chrs[] = { '\r', '\n', '\b', '\v', '\f', '\t', '\a', '\b', '\0' };
|
|
|
|
|
int i;
|
|
|
|
|
|
|
|
|
|
while ((lf = strchr(str, '\n')) != NULL) {
|
|
|
|
|
for (p = lf + 1; *p == ' ' || *p == '\t' || *p == '\n' || *p == '\r'; p++)
|
|
|
|
|
*len -= 1;
|
|
|
|
|
strcpy(lf, p);
|
|
|
|
|
*len -= 1;
|
|
|
|
|
}
|
|
|
|
|
for (i = 0; i < sizeof(to_chrs); i++) {
|
|
|
|
|
for (p = strstr(str, ori_strs[i]); p; p = strstr(p, ori_strs[i])) {
|
|
|
|
|
//支持\\r
|
|
|
|
|
*(p - 1) == '\\' ? (*p--) : (*p = to_chrs[i]);
|
|
|
|
|
memmove(p + 1, p + 2, strlen(p + 2));
|
|
|
|
|
(*len)--;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-24 11:46:32 +08:00
|
|
|
|
/* 在content中,设置变量(var)的首地址,值(val)的位置首地址和末地址,返回下一行指针 */
|
|
|
|
|
static char *set_var_val_lineEnd(char *content, char **var, char **val_begin, char **val_end)
|
2019-01-19 16:13:58 +08:00
|
|
|
|
{
|
2020-03-24 11:46:32 +08:00
|
|
|
|
char *p, *pn, *lineEnd;
|
|
|
|
|
;
|
|
|
|
|
int val_len;
|
2019-12-16 19:27:36 +08:00
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
while (1) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
if (content == NULL)
|
|
|
|
|
return NULL;
|
2019-01-19 16:13:58 +08:00
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
for (; *content == ' ' || *content == '\t' || *content == '\r' || *content == '\n'; content++) ;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
if (*content == '\0')
|
|
|
|
|
return NULL;
|
|
|
|
|
*var = content;
|
|
|
|
|
pn = strchr(content, '\n');
|
|
|
|
|
p = strchr(content, '=');
|
2020-06-08 20:28:15 +08:00
|
|
|
|
if (p == NULL) {
|
|
|
|
|
if (pn) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
content = pn + 1;
|
|
|
|
|
continue;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
} else
|
2020-03-24 11:46:32 +08:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
content = p;
|
|
|
|
|
//将变量以\0结束
|
2020-06-08 20:28:15 +08:00
|
|
|
|
for (p--; *p == ' ' || *p == '\t'; p--) ;
|
|
|
|
|
*(p + 1) = '\0';
|
2020-03-24 11:46:32 +08:00
|
|
|
|
//值的首地址
|
2020-06-08 20:28:15 +08:00
|
|
|
|
for (content++; *content == ' ' || *content == '\t'; content++) ;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
if (*content == '\0')
|
|
|
|
|
return NULL;
|
|
|
|
|
//双引号引起来的值支持换行
|
2020-06-08 20:28:15 +08:00
|
|
|
|
if (*content == '"') {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
*val_begin = content + 1;
|
|
|
|
|
*val_end = strstr(*val_begin, "\";");
|
|
|
|
|
if (*val_end != NULL)
|
|
|
|
|
break;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
} else
|
2020-03-24 11:46:32 +08:00
|
|
|
|
*val_begin = content;
|
|
|
|
|
*val_end = strchr(content, ';');
|
2020-06-08 20:28:15 +08:00
|
|
|
|
if (pn && *val_end > pn) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
content = pn + 1;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
break;
|
2019-01-19 16:13:58 +08:00
|
|
|
|
}
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2021-07-20 22:17:06 +08:00
|
|
|
|
if (*val_end) {
|
|
|
|
|
**val_end = '\0';
|
|
|
|
|
val_len = *val_end - *val_begin;
|
|
|
|
|
lineEnd = *val_end;
|
|
|
|
|
} else {
|
|
|
|
|
val_len = strlen(*val_begin);
|
|
|
|
|
*val_end = lineEnd = *val_begin + val_len;
|
|
|
|
|
}
|
|
|
|
|
string_pretreatment(*val_begin, &val_len);
|
2020-03-24 11:46:32 +08:00
|
|
|
|
*val_end = *val_begin + val_len;
|
|
|
|
|
//printf("var[%s]\nbegin[%s]\n\n", *var, *val_begin);
|
|
|
|
|
return lineEnd;
|
|
|
|
|
}
|
2019-01-19 16:13:58 +08:00
|
|
|
|
|
2020-03-24 11:46:32 +08:00
|
|
|
|
/* 在buff中读取模块(global http https httpdns httpudp)内容 */
|
|
|
|
|
static char *read_module(char *buff, const char *module_name)
|
|
|
|
|
{
|
|
|
|
|
int len;
|
|
|
|
|
char *p, *p0;
|
2019-01-19 16:13:58 +08:00
|
|
|
|
|
2020-03-24 11:46:32 +08:00
|
|
|
|
len = strlen(module_name);
|
|
|
|
|
p = buff;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
while (1) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
|
|
|
|
|
p++;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
if (strncasecmp(p, module_name, len) == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p += len;
|
|
|
|
|
while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n')
|
|
|
|
|
p++;
|
|
|
|
|
if (*p == '{')
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if ((p = strchr(p, '\n')) == NULL)
|
|
|
|
|
return NULL;
|
2020-01-21 19:48:05 +08:00
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
if ((p0 = strchr(++p, '}')) == NULL)
|
|
|
|
|
return NULL;
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2020-03-24 11:46:32 +08:00
|
|
|
|
return strndup(p, p0 - p);
|
|
|
|
|
}
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
static void parse_global_module(char *content, conf * p)
|
2020-03-24 11:46:32 +08:00
|
|
|
|
{
|
|
|
|
|
char *var, *val_begin, *val_end, *lineEnd;
|
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) {
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (strcasecmp(var, "uid") == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p->uid = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "process") == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p->process = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "timeout") == 0) {
|
2020-07-30 18:10:31 +08:00
|
|
|
|
p->timeout = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "encode") == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p->sslencoding = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "tcp_listen") == 0) {
|
2020-07-30 18:10:31 +08:00
|
|
|
|
p->tcp_listen = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "tcp6_listen") == 0) {
|
2020-11-05 21:56:08 +08:00
|
|
|
|
p->tcp6_listen = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "dns_listen") == 0) {
|
2020-07-30 18:10:31 +08:00
|
|
|
|
p->dns_listen = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "udp_listen") == 0) {
|
2021-12-23 09:02:41 +08:00
|
|
|
|
p->udp_listen = atoi(val_begin);;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
content = strchr(lineEnd + 1, '\n');
|
2019-02-19 17:29:58 +08:00
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
static void parse_http_module(char *content, conf * p)
|
2020-06-08 20:28:15 +08:00
|
|
|
|
{
|
2020-03-24 11:46:32 +08:00
|
|
|
|
char *var, *val_begin, *val_end, *lineEnd;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
tcp *http_node = NULL;
|
|
|
|
|
char *p1 = NULL, *s = NULL, *t = NULL;
|
2022-01-12 09:41:32 +08:00
|
|
|
|
char *p2 = NULL;
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) {
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (strcasecmp(var, "http_ip") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->http_ip_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->http_ip_len, &p->http_ip) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "encode") == 0) {
|
2022-04-20 17:12:58 +08:00
|
|
|
|
p->http_encode = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "http_port") == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p->http_port = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "http_del") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->http_del_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->http_del_len, &p->http_del) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "http_first") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->http_first_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->http_first_len, &p->http_first) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "strrep") == 0) {
|
|
|
|
|
http_node = (tcp *) malloc(sizeof(struct tcp));
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (http_node == NULL)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
memset(http_node, 0, sizeof(struct tcp));
|
|
|
|
|
http_node->strrep = strdup(val_begin);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->strrep_len = val_end - val_begin;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
p1 = strstr(val_begin, "->");
|
|
|
|
|
for (t = p1; *t != '"'; ++t) ;
|
|
|
|
|
http_node->strrep_t = strdup(t + 1);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
p2 = strchr(t + 1, '\0');
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->strrep_t_len = p2 - (t + 1);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
for (s = p1 - 1; *s == ' '; s--) {
|
|
|
|
|
if (s == val_begin)
|
|
|
|
|
return;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (*s == '"')
|
|
|
|
|
s--;
|
|
|
|
|
|
|
|
|
|
http_node->strrep_s = strndup(val_begin, s - val_begin + 1);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->strrep_s_len = s - val_begin + 1;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
http_node->next = NULL;
|
2022-02-06 19:04:04 +08:00
|
|
|
|
if (http_head_strrep == NULL) {
|
|
|
|
|
http_head_strrep = http_node;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
} else {
|
2022-02-06 19:04:04 +08:00
|
|
|
|
http_node->next = http_head_strrep;
|
|
|
|
|
http_head_strrep = http_node;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-02-06 19:04:04 +08:00
|
|
|
|
//http_node->next = http_head_strrep->next;
|
|
|
|
|
//http_head_strrep->next = http_node;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2020-06-08 20:28:15 +08:00
|
|
|
|
} else if (strcasecmp(var, "regrep") == 0) {
|
2022-01-02 18:36:09 +08:00
|
|
|
|
http_node = (tcp *) malloc(sizeof(struct tcp));
|
|
|
|
|
if (http_node == NULL)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
memset(http_node, 0, sizeof(struct tcp));
|
|
|
|
|
http_node->regrep = strdup(val_begin);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->regrep_len = val_end - val_begin;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
p1 = strstr(val_begin, "->");
|
|
|
|
|
for (t = p1; *t != '"'; ++t) ;
|
|
|
|
|
http_node->regrep_t = strdup(t + 1);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
p2 = strchr(t + 1, '\0');
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->regrep_t_len = p2 - (t + 1);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
for (s = p1 - 1; *s == ' '; s--) {
|
|
|
|
|
if (s == val_begin)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
}
|
|
|
|
|
if (*s == '"')
|
|
|
|
|
s--;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
http_node->regrep_s = strndup(val_begin, s - val_begin + 1);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
http_node->regrep_s_len = s - val_begin + 1;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
http_node->next = NULL;
|
2022-02-06 19:04:04 +08:00
|
|
|
|
if (http_head_regrep == NULL) {
|
|
|
|
|
http_head_regrep = http_node;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
} else {
|
2022-02-06 19:04:04 +08:00
|
|
|
|
http_node->next = http_head_regrep;
|
|
|
|
|
http_head_regrep = http_node;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-02-06 19:04:04 +08:00
|
|
|
|
//http_node->next = http_head_regrep->next;
|
|
|
|
|
//http_head_regrep->next = http_node;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2020-01-21 19:48:05 +08:00
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
content = strchr(lineEnd + 1, '\n');
|
2019-02-19 17:29:58 +08:00
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2019-12-16 19:27:36 +08:00
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
static void parse_https_module(char *content, conf * p)
|
2020-06-08 20:28:15 +08:00
|
|
|
|
{
|
2020-03-24 11:46:32 +08:00
|
|
|
|
char *var, *val_begin, *val_end, *lineEnd;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
tcp *https_node = NULL;
|
|
|
|
|
char *p1 = NULL, *s = NULL, *t = NULL;
|
2022-01-12 09:41:32 +08:00
|
|
|
|
char *p2 = NULL;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
|
|
|
|
|
while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) {
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (strcasecmp(var, "https_ip") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->https_ip_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->https_ip_len, &p->https_ip) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "encode") == 0) {
|
2022-04-20 17:12:58 +08:00
|
|
|
|
p->https_encode = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "https_port") == 0) {
|
2020-03-24 11:46:32 +08:00
|
|
|
|
p->https_port = atoi(val_begin);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "https_del") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->https_del_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->https_del_len, &p->https_del) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "https_first") == 0) {
|
|
|
|
|
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->https_first_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->https_first_len, &p->https_first) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
} else if (strcasecmp(var, "strrep") == 0) {
|
2022-01-02 18:36:09 +08:00
|
|
|
|
// 链表操作,支持多个相同配置KEY
|
2022-06-04 11:06:12 +08:00
|
|
|
|
https_node = (tcp *) malloc(sizeof(struct tcp));
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (https_node == NULL)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
memset(https_node, 0, sizeof(struct tcp));
|
|
|
|
|
https_node->strrep = strdup(val_begin);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->strrep_len = val_end - val_begin;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
p1 = strstr(val_begin, "->");
|
|
|
|
|
for (t = p1; *t != '"'; ++t) ;
|
|
|
|
|
https_node->strrep_t = strdup(t + 1);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
p2 = strchr(t + 1, '\0');
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->strrep_t_len = p2 - (t + 1);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
for (s = p1 - 1; *s == ' '; s--) {
|
|
|
|
|
if (s == val_begin)
|
|
|
|
|
return;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (*s == '"')
|
|
|
|
|
s--;
|
|
|
|
|
|
|
|
|
|
https_node->strrep_s = strndup(val_begin, s - val_begin + 1);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->strrep_s_len = s - val_begin + 1;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
https_node->next = NULL;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-02-06 19:04:04 +08:00
|
|
|
|
if (https_head_strrep == NULL) {
|
|
|
|
|
https_head_strrep = https_node;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
} else {
|
2022-02-06 19:04:04 +08:00
|
|
|
|
https_node->next = https_head_strrep;
|
|
|
|
|
https_head_strrep = https_node;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-02-06 19:04:04 +08:00
|
|
|
|
//https_node->next = https_head_strrep->next;
|
|
|
|
|
//https_head_strrep->next = https_node;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2022-06-04 11:06:12 +08:00
|
|
|
|
} else if (strcasecmp(var, "regrep") == 0) {
|
2022-01-02 18:36:09 +08:00
|
|
|
|
https_node = (tcp *) malloc(sizeof(struct tcp));
|
|
|
|
|
if (https_node == NULL)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
memset(https_node, 0, sizeof(struct tcp));
|
|
|
|
|
https_node->regrep = strdup(val_begin);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->regrep_len = val_end - val_begin;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
p1 = strstr(val_begin, "->");
|
|
|
|
|
for (t = p1; *t != '"'; ++t) ;
|
|
|
|
|
https_node->regrep_t = strdup(t + 1);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
p2 = strchr(t + 1, '\0');
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->regrep_t_len = p2 - (t + 1);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
for (s = p1 - 1; *s == ' '; s--) {
|
|
|
|
|
if (s == val_begin)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
}
|
|
|
|
|
if (*s == '"')
|
|
|
|
|
s--;
|
|
|
|
|
|
|
|
|
|
https_node->regrep_s = strndup(val_begin, s - val_begin + 1);
|
2022-01-12 09:41:32 +08:00
|
|
|
|
https_node->regrep_s_len = s - val_begin + 1;
|
2020-06-08 20:28:15 +08:00
|
|
|
|
|
2022-01-02 18:36:09 +08:00
|
|
|
|
https_node->next = NULL;
|
2022-02-06 19:04:04 +08:00
|
|
|
|
if (https_head_regrep == NULL) {
|
|
|
|
|
https_head_regrep = https_node;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
} else {
|
2022-02-06 19:04:04 +08:00
|
|
|
|
https_node->next = https_head_regrep;
|
|
|
|
|
https_head_regrep = https_node;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-02-06 19:04:04 +08:00
|
|
|
|
//https_node->next = https_head_regrep->next;
|
|
|
|
|
//https_head_regrep->next = https_node;
|
2022-01-02 18:36:09 +08:00
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
|
|
|
|
|
2020-06-08 20:28:15 +08:00
|
|
|
|
content = strchr(lineEnd + 1, '\n');
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|
2019-01-19 16:13:58 +08:00
|
|
|
|
}
|
|
|
|
|
|
2022-01-12 09:41:32 +08:00
|
|
|
|
// 打印tcp链表
|
2022-06-04 11:06:12 +08:00
|
|
|
|
void print_tcp(tcp * p)
|
2022-01-02 18:36:09 +08:00
|
|
|
|
{
|
|
|
|
|
tcp *temp = p;
|
|
|
|
|
while (temp) {
|
|
|
|
|
if (temp->strrep)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->strrep, temp->strrep_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (temp->strrep_s)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->strrep_s, temp->strrep_s_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (temp->strrep_t)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->strrep_t, temp->strrep_t_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
if (temp->regrep)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->regrep, temp->regrep_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (temp->regrep_s)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->regrep_s, temp->regrep_s_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
if (temp->regrep_t)
|
2022-01-12 09:41:32 +08:00
|
|
|
|
printf("%s %d\n", temp->regrep_t, temp->regrep_t_len);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
|
|
|
|
|
temp = temp->next;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
tcp *local_reverse(tcp * head)
|
2022-02-06 19:04:04 +08:00
|
|
|
|
{
|
|
|
|
|
tcp *beg = NULL;
|
|
|
|
|
tcp *end = NULL;
|
|
|
|
|
if (head == NULL || head->next == NULL) {
|
|
|
|
|
return head;
|
|
|
|
|
}
|
|
|
|
|
beg = head;
|
|
|
|
|
end = head->next;
|
|
|
|
|
while (end != NULL) {
|
|
|
|
|
//将 end 从链表中摘除
|
|
|
|
|
beg->next = end->next;
|
|
|
|
|
//将 end 移动至链表头
|
|
|
|
|
end->next = head;
|
|
|
|
|
head = end;
|
|
|
|
|
//调整 end 的指向,另其指向 beg 后的一个节点,为反转下一个节点做准备
|
|
|
|
|
end = beg->next;
|
|
|
|
|
}
|
|
|
|
|
return head;
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-12 09:41:32 +08:00
|
|
|
|
// Free tcp 链表
|
2022-06-04 11:06:12 +08:00
|
|
|
|
void free_tcp(tcp ** conf_head)
|
2022-01-02 18:36:09 +08:00
|
|
|
|
{
|
2022-01-12 09:41:32 +08:00
|
|
|
|
tcp *t;
|
2022-06-04 11:06:12 +08:00
|
|
|
|
while (*conf_head != NULL) {
|
|
|
|
|
t = *conf_head;
|
|
|
|
|
*conf_head = t->next;
|
|
|
|
|
|
2022-01-12 09:41:32 +08:00
|
|
|
|
if (t->strrep)
|
|
|
|
|
free(t->strrep);
|
|
|
|
|
if (t->strrep_s)
|
|
|
|
|
free(t->strrep_s);
|
|
|
|
|
if (t->strrep_t)
|
|
|
|
|
free(t->strrep_t);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2022-01-12 09:41:32 +08:00
|
|
|
|
if (t->regrep)
|
|
|
|
|
free(t->regrep);
|
|
|
|
|
if (t->regrep_s)
|
|
|
|
|
free(t->regrep_s);
|
|
|
|
|
if (t->regrep_t)
|
|
|
|
|
free(t->regrep_t);
|
|
|
|
|
if (t)
|
|
|
|
|
free(t);
|
2022-01-02 18:36:09 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
static void parse_httpdns_module(char *content, conf * p)
|
2020-07-30 18:10:31 +08:00
|
|
|
|
{
|
|
|
|
|
char *var, *val_begin, *val_end, *lineEnd;
|
2022-01-19 21:48:02 +08:00
|
|
|
|
|
|
|
|
|
while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) {
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (strcasecmp(var, "addr") == 0) {
|
2022-04-23 21:55:24 +08:00
|
|
|
|
p->httpdns_addr_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->httpdns_addr_len, &p->httpdns_addr) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "http_req") == 0) {
|
2022-04-23 21:55:24 +08:00
|
|
|
|
p->httpdns_http_req_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->httpdns_http_req_len, &p->httpdns_http_req) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "encode") == 0) {
|
2020-07-30 18:10:31 +08:00
|
|
|
|
p->encode = atoi(val_begin);
|
|
|
|
|
}
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2021-12-23 09:02:41 +08:00
|
|
|
|
content = strchr(lineEnd + 1, '\n');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
static void parse_httpudp_module(char *content, conf * p)
|
2021-12-23 09:02:41 +08:00
|
|
|
|
{
|
|
|
|
|
char *var, *val_begin, *val_end, *lineEnd;
|
2022-01-19 21:48:02 +08:00
|
|
|
|
|
|
|
|
|
while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) {
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (strcasecmp(var, "addr") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->httpudp_addr_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->httpudp_addr_len, &p->httpudp_addr) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "http_req") == 0) {
|
2022-01-19 21:48:02 +08:00
|
|
|
|
p->httpudp_http_req_len = val_end - val_begin;
|
|
|
|
|
if (copy_new_mem(val_begin, p->httpudp_http_req_len, &p->httpudp_http_req) != 0)
|
2022-06-04 11:06:12 +08:00
|
|
|
|
return;
|
|
|
|
|
} else if (strcasecmp(var, "encode") == 0) {
|
2021-12-23 09:02:41 +08:00
|
|
|
|
p->httpudp_encode = atoi(val_begin);
|
|
|
|
|
}
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2020-07-30 18:10:31 +08:00
|
|
|
|
content = strchr(lineEnd + 1, '\n');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
void free_conf(conf * p)
|
2019-01-19 16:13:58 +08:00
|
|
|
|
{
|
2021-12-23 09:02:41 +08:00
|
|
|
|
// http module
|
2020-08-16 07:58:53 +08:00
|
|
|
|
if (p->http_ip)
|
|
|
|
|
free(p->http_ip);
|
|
|
|
|
if (p->http_del)
|
|
|
|
|
free(p->http_del);
|
|
|
|
|
if (p->http_first)
|
|
|
|
|
free(p->http_first);
|
|
|
|
|
|
2021-12-23 09:02:41 +08:00
|
|
|
|
// https module
|
2020-08-16 07:58:53 +08:00
|
|
|
|
if (p->https_ip)
|
|
|
|
|
free(p->https_ip);
|
|
|
|
|
if (p->https_del)
|
|
|
|
|
free(p->https_del);
|
|
|
|
|
if (p->https_first)
|
|
|
|
|
free(p->https_first);
|
2020-12-15 10:43:06 +08:00
|
|
|
|
|
2021-12-23 09:02:41 +08:00
|
|
|
|
// httpdns module
|
2022-04-23 21:55:24 +08:00
|
|
|
|
if (p->httpdns_addr)
|
|
|
|
|
free(p->httpdns_addr);
|
|
|
|
|
if (p->httpdns_http_req)
|
|
|
|
|
free(p->httpdns_http_req);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2021-12-23 09:02:41 +08:00
|
|
|
|
// httpudp module
|
2022-06-04 11:06:12 +08:00
|
|
|
|
if (p->httpudp_addr)
|
2021-12-23 09:02:41 +08:00
|
|
|
|
free(p->httpudp_addr);
|
2022-04-23 21:55:24 +08:00
|
|
|
|
if (p->httpudp_http_req)
|
2021-12-23 09:02:41 +08:00
|
|
|
|
free(p->httpudp_http_req);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2019-12-16 19:27:36 +08:00
|
|
|
|
return;
|
2019-01-19 16:13:58 +08:00
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
|
2022-06-04 11:06:12 +08:00
|
|
|
|
void read_conf(char *filename, conf * configure)
|
2020-03-24 11:46:32 +08:00
|
|
|
|
{
|
2021-12-23 09:02:41 +08:00
|
|
|
|
char *buff, *global_content, *http_content, *https_content, *httpdns_content, *httpudp_content;
|
2020-03-24 11:46:32 +08:00
|
|
|
|
FILE *file;
|
|
|
|
|
long file_size;
|
|
|
|
|
|
|
|
|
|
file = fopen(filename, "r");
|
|
|
|
|
if (file == NULL) {
|
2021-07-20 22:17:06 +08:00
|
|
|
|
perror("cannot open config file.");
|
2020-03-24 11:46:32 +08:00
|
|
|
|
exit(-1);
|
|
|
|
|
}
|
|
|
|
|
fseek(file, 0, SEEK_END);
|
|
|
|
|
file_size = ftell(file);
|
|
|
|
|
buff = (char *)alloca(file_size + 1);
|
|
|
|
|
if (buff == NULL)
|
|
|
|
|
perror("out of memory.");
|
|
|
|
|
rewind(file);
|
2020-07-30 18:10:31 +08:00
|
|
|
|
if (fread(buff, file_size, 1, file) < 1) {
|
|
|
|
|
perror("fread");
|
|
|
|
|
}
|
2020-03-24 11:46:32 +08:00
|
|
|
|
fclose(file);
|
|
|
|
|
buff[file_size] = '\0';
|
|
|
|
|
|
|
|
|
|
if ((global_content = read_module(buff, "global")) == NULL)
|
|
|
|
|
perror("read global module error");
|
2021-07-20 22:17:06 +08:00
|
|
|
|
else
|
|
|
|
|
parse_global_module(global_content, configure);
|
2020-03-24 11:46:32 +08:00
|
|
|
|
free(global_content);
|
|
|
|
|
|
|
|
|
|
if ((http_content = read_module(buff, "http")) == NULL)
|
|
|
|
|
perror("read http module error");
|
2021-07-20 22:17:06 +08:00
|
|
|
|
else
|
|
|
|
|
parse_http_module(http_content, configure);
|
2020-03-24 11:46:32 +08:00
|
|
|
|
free(http_content);
|
|
|
|
|
|
|
|
|
|
if ((https_content = read_module(buff, "https")) == NULL)
|
|
|
|
|
perror("read https module error");
|
2021-07-20 22:17:06 +08:00
|
|
|
|
else
|
|
|
|
|
parse_https_module(https_content, configure);
|
2020-03-24 11:46:32 +08:00
|
|
|
|
free(https_content);
|
2020-12-15 10:43:06 +08:00
|
|
|
|
|
2020-07-30 18:10:31 +08:00
|
|
|
|
if ((httpdns_content = read_module(buff, "httpdns")) == NULL)
|
|
|
|
|
perror("read httpdns module error");
|
2021-07-20 22:17:06 +08:00
|
|
|
|
else
|
|
|
|
|
parse_httpdns_module(httpdns_content, configure);
|
2020-07-30 18:10:31 +08:00
|
|
|
|
free(httpdns_content);
|
2022-06-04 11:06:12 +08:00
|
|
|
|
|
2021-12-23 09:02:41 +08:00
|
|
|
|
if ((httpudp_content = read_module(buff, "httpudp")) == NULL)
|
|
|
|
|
perror("read httpdns module error");
|
|
|
|
|
else
|
|
|
|
|
parse_httpudp_module(httpudp_content, configure);
|
|
|
|
|
free(httpudp_content);
|
2020-03-24 11:46:32 +08:00
|
|
|
|
}
|