Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Ip2region
提交
1f42bda2
I
Ip2region
项目概览
int
/
Ip2region
上一次同步 11 个月
通知
19
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
Ip2region
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
1f42bda2
编写于
3月 30, 2023
作者:
W
Wu Jian Ping
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
nginx implementation first cut
上级
e7fa4da7
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
230 addition
and
21 deletion
+230
-21
binding/nginx/src/ngx_http_ip2region_module.c
binding/nginx/src/ngx_http_ip2region_module.c
+216
-18
binding/nginx/src/ngx_http_ip2region_module.h
binding/nginx/src/ngx_http_ip2region_module.h
+8
-3
binding/nginx/src/xdb_searcher.c
binding/nginx/src/xdb_searcher.c
+3
-0
binding/nginx/src/xdb_searcher.h
binding/nginx/src/xdb_searcher.h
+3
-0
未找到文件。
binding/nginx/src/ngx_http_ip2region_module.c
浏览文件 @
1f42bda2
/*
* Created by Wu Jian Ping on - 2023/03/
2
0.
* Created by Wu Jian Ping on - 2023/03/
3
0.
*/
#include "ngx_http_ip2region_module.h"
static
ngx_int_t
ngx_http_ua_parser_test_full_name
(
char
*
name
);
static
ngx_int_t
ngx_http_ip2region_add_variables
(
ngx_conf_t
*
cf
);
static
void
*
ngx_http_ip2region_create_conf
(
ngx_conf_t
*
cf
);
...
...
@@ -28,7 +30,7 @@ static ngx_http_module_t ngx_http_ip2region_ctx = {
static
ngx_command_t
ngx_http_ip2region_commands
[]
=
{
{
ngx_string
(
"ip2region"
),
NGX_HTTP_MAIN_CONF
|
NGX_CONF_TAKE1
,
NGX_HTTP_MAIN_CONF
|
NGX_CONF_TAKE1
2
,
ngx_http_ip2region_processor
,
NGX_HTTP_MAIN_CONF_OFFSET
,
0
,
...
...
@@ -68,22 +70,95 @@ static char *
ngx_http_ip2region_processor
(
ngx_conf_t
*
cf
,
ngx_command_t
*
cmd
,
void
*
conf
)
{
// ngx_http_ip2region_conf_t *uacf = conf;
// ngx_str_t *value;
ngx_http_ip2region_conf_t
*
ip2region_cf
;
ip2region_searcher_t
*
ip2region_searcher
;
char
*
db_name
,
*
cache_policy
;
ngx_str_t
*
value
;
int
err
;
char
*
db_path
;
size_t
len
;
ip2region_cf
=
conf
;
if
(
ip2region_cf
->
ip2region_searcher
)
{
return
"is duplicate"
;
}
value
=
cf
->
args
->
elts
;
db_name
=
(
char
*
)
value
[
1
].
data
;
// default cache_policy: content
if
(
cf
->
args
->
nelts
==
2
)
{
cache_policy
=
"content"
;
}
else
{
cache_policy
=
(
char
*
)
value
[
2
].
data
;
}
if
(
ngx_http_ua_parser_test_full_name
(
db_name
)
==
NGX_OK
)
{
db_path
=
db_name
;
}
else
{
// relative path to conf directory
len
=
ngx_cycle
->
conf_prefix
.
len
+
strlen
(
db_name
)
+
1
;
db_path
=
malloc
(
len
);
memset
(
db_path
,
'\0'
,
len
);
memcpy
(
db_path
,
ngx_cycle
->
conf_prefix
.
data
,
ngx_cycle
->
conf_prefix
.
len
);
strcat
(
db_path
,
db_name
);
}
ip2region_searcher
=
ngx_palloc
(
cf
->
pool
,
sizeof
(
ip2region_searcher_t
));
if
(
ip2region_searcher
==
NULL
)
{
return
NGX_CONF_ERROR
;
}
ip2region_searcher
->
v_index
=
NULL
;
ip2region_searcher
->
c_buffer
=
NULL
;
if
(
strcmp
(
cache_policy
,
"file"
)
==
0
)
{
err
=
xdb_new_with_file_only
(
&
ip2region_searcher
->
searcher
,
db_path
);
if
(
err
!=
0
)
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"failed to create searcher: %s"
,
db_path
);
return
NGX_CONF_ERROR
;
}
}
else
if
(
strcmp
(
cache_policy
,
"vectorIndex"
)
==
0
)
{
ip2region_searcher
->
v_index
=
xdb_load_vector_index_from_file
(
db_path
);
if
(
ip2region_searcher
->
v_index
==
NULL
)
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"failed to load vector index from: %s"
,
db_path
);
return
NGX_CONF_ERROR
;
}
// if (uacf->ip2region) {
// return "is duplicate";
// }
err
=
xdb_new_with_vector_index
(
&
ip2region_searcher
->
searcher
,
db_path
,
ip2region_searcher
->
v_index
);
if
(
err
!=
0
)
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"failed to create vector index cached searcher: %s"
,
db_path
);
return
NGX_CONF_ERROR
;
}
}
else
if
(
strcmp
(
cache_policy
,
"content"
)
==
0
)
{
ip2region_searcher
->
c_buffer
=
xdb_load_content_from_file
(
db_path
);
if
(
ip2region_searcher
->
c_buffer
==
NULL
)
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"failed to load xdb content: %s"
,
db_path
);
return
NGX_CONF_ERROR
;
}
// value = cf->args->elts;
err
=
xdb_new_with_buffer
(
&
ip2region_searcher
->
searcher
,
ip2region_searcher
->
c_buffer
);
if
(
err
!=
0
)
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"failed to create content cached searcher: %s"
,
db_path
);
return
NGX_CONF_ERROR
;
}
}
else
{
ngx_conf_log_error
(
NGX_LOG_EMERG
,
cf
,
0
,
"invalid cache policy `%V`, options: file/vectorIndex/content"
,
&
value
[
2
]);
return
NGX_CONF_ERROR
;
}
// uacf->ip2region = open_ip2region_regexes_yaml((char *)value[1].data)
;
ip2region_cf
->
ip2region_searcher
=
ip2region_searcher
;
// if(uacf->ip2region == NULL) {
// ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,
// "open_ip2region_regexes_yaml(\"%V\") failed", &value[1]);
// return NGX_CONF_ERROR;
// }
if
(
ngx_http_ua_parser_test_full_name
(
db_name
)
!=
NGX_OK
)
{
free
(
db_path
);
}
return
NGX_CONF_OK
;
}
...
...
@@ -117,8 +192,7 @@ ngx_http_ip2region_add_variables(ngx_conf_t *cf)
{
ngx_http_variable_t
*
var
;
ngx_http_variable_t
*
v
;
/* the last ngx_http_variable_t's name is ngx_null_string and it's name's len is 0*/
for
(
v
=
ngx_http_ip2region_vars
;
v
->
name
.
len
;
v
++
)
{
var
=
ngx_http_add_variable
(
cf
,
&
v
->
name
,
v
->
flags
);
if
(
var
==
NULL
)
{
...
...
@@ -131,10 +205,66 @@ ngx_http_ip2region_add_variables(ngx_conf_t *cf)
return
NGX_OK
;
}
static
ngx_int_t
ngx_http_ip2region_variable
(
ngx_http_request_t
*
r
,
ngx_http_variable_value_t
*
v
,
uintptr_t
data
)
{
ngx_http_ip2region_conf_t
*
ip2region_conf
;
struct
sockaddr_in
*
sin
;
char
region
[
512
]
=
{
'\0'
};
int
err
;
unsigned
int
ip
;
#if (NGX_HAVE_INET6)
u_char
*
p
;
in_addr_t
addr
;
struct
sockaddr_in6
*
sin6
;
#endif
ip2region_conf
=
ngx_http_get_module_main_conf
(
r
,
ngx_http_ip2region_module
);
if
(
ip2region_conf
->
ip2region_searcher
!=
NULL
)
{
switch
(
r
->
connection
->
sockaddr
->
sa_family
)
{
case
AF_INET
:
sin
=
(
struct
sockaddr_in
*
)
r
->
connection
->
sockaddr
;
ip
=
htonl
(
sin
->
sin_addr
.
s_addr
);
err
=
xdb_search
(
&
ip2region_conf
->
ip2region_searcher
->
searcher
,
ip
,
region
,
sizeof
(
region
));
if
(
err
==
0
)
{
v
->
data
=
(
unsigned
char
*
)
region
;
v
->
len
=
strlen
(
region
);
return
NGX_OK
;
}
break
;
#if (NGX_HAVE_INET6)
case
AF_INET6
:
sin6
=
(
struct
sockaddr_in6
*
)
r
->
connection
->
sockaddr
;
p
=
sin6
->
sin6_addr
.
s6_addr
;
if
(
IN6_IS_ADDR_V4MAPPED
(
&
sin6
->
sin6_addr
))
{
addr
=
p
[
12
]
<<
24
;
addr
+=
p
[
13
]
<<
16
;
addr
+=
p
[
14
]
<<
8
;
addr
+=
p
[
15
];
ip
=
htonl
(
addr
);
err
=
xdb_search
(
&
ip2region_conf
->
ip2region_searcher
->
searcher
,
ip
,
region
,
sizeof
(
region
));
if
(
err
==
0
)
{
v
->
data
=
(
unsigned
char
*
)
region
;
v
->
len
=
strlen
(
region
);
return
NGX_OK
;
}
}
break
;
#endif
}
}
v
->
not_found
=
1
;
return
NGX_OK
;
}
...
...
@@ -143,5 +273,73 @@ ngx_http_ip2region_variable(ngx_http_request_t *r,
static
void
ngx_http_ip2region_cleanup
(
void
*
data
)
{
// ngx_http_ip2region_conf_t *uacf = data;
}
\ No newline at end of file
ngx_http_ip2region_conf_t
*
ip2region_conf
=
data
;
if
(
ip2region_conf
->
ip2region_searcher
!=
NULL
)
{
xdb_close
(
&
ip2region_conf
->
ip2region_searcher
->
searcher
);
// check and free the vector index
if
(
ip2region_conf
->
ip2region_searcher
->
v_index
!=
NULL
)
{
xdb_close_vector_index
(
ip2region_conf
->
ip2region_searcher
->
v_index
);
ip2region_conf
->
ip2region_searcher
->
v_index
=
NULL
;
}
// check and free the content buffer
if
(
ip2region_conf
->
ip2region_searcher
->
c_buffer
!=
NULL
)
{
xdb_close_content
(
ip2region_conf
->
ip2region_searcher
->
c_buffer
);
ip2region_conf
->
ip2region_searcher
->
c_buffer
=
NULL
;
}
ip2region_conf
->
ip2region_searcher
=
NULL
;
}
}
static
ngx_int_t
ngx_http_ua_parser_test_full_name
(
char
*
name
)
{
#if (NGX_WIN32)
u_char
c0
,
c1
;
c0
=
name
[
0
];
if
(
strlen
(
name
)
<
2
)
{
if
(
c0
==
'/'
)
{
return
2
;
}
return
NGX_DECLINED
;
}
c1
=
name
[
1
];
if
(
c1
==
':'
)
{
c0
|=
0x20
;
if
((
c0
>=
'a'
&&
c0
<=
'z'
))
{
return
NGX_OK
;
}
return
NGX_DECLINED
;
}
if
(
c1
==
'/'
)
{
return
NGX_OK
;
}
if
(
c0
==
'/'
)
{
return
2
;
}
return
NGX_DECLINED
;
#else
if
(
name
[
0
]
==
'/'
)
{
return
NGX_OK
;
}
return
NGX_DECLINED
;
#endif
}
binding/nginx/src/ngx_http_ip2region_module.h
浏览文件 @
1f42bda2
/*
* Created by Wu Jian Ping on - 2023/03/30.
*/
#ifndef __NGX_HTTP_IP2REGION_MODULE_INCLUDED__
#define __NGX_HTTP_IP2REGION_MODULE_INCLUDED__
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
#include "xdb_searcher.h"
typedef
struct
{
//
xdb_searcher_t searcher;
//
xdb_vector_index_t *v_index;
//
xdb_content_t *c_buffer;
xdb_searcher_t
searcher
;
xdb_vector_index_t
*
v_index
;
xdb_content_t
*
c_buffer
;
}
ip2region_searcher_t
;
typedef
struct
{
...
...
binding/nginx/src/xdb_searcher.c
浏览文件 @
1f42bda2
...
...
@@ -6,6 +6,9 @@
// @Author Lion <chenxin619315@gmail.com>
// @Date 2022/06/27
// @Modified By Wu Jian Ping <wujjpp@hotmail.com>
// @Date 2023/03/30
#include "sys/time.h"
#include "xdb_searcher.h"
...
...
binding/nginx/src/xdb_searcher.h
浏览文件 @
1f42bda2
...
...
@@ -6,6 +6,9 @@
// @Author Lion <chenxin619315@gmail.com>
// @Date 2022/06/27
// @Modified By Wu Jian Ping <wujjpp@hotmail.com>
// @Date 2023/03/30
#ifndef C_XDB_SEARCHER_H
#define C_XDB_SEARCHER_H
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录