开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
forked from libhv/libhv
加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
文件
master
分支 (6)
标签 (13)
master
dev
kcptun
tfb
check_unicode
annotate
v1.3.3
v1.3.2
v1.3.1
v1.3.0
v1.2.6
v1.2.5
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.1.1
v1.1.0
v1.0.0
master
分支 (6)
标签 (13)
master
dev
kcptun
tfb
check_unicode
annotate
v1.3.3
v1.3.2
v1.3.1
v1.3.0
v1.2.6
v1.2.5
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.1.1
v1.1.0
v1.0.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
master
分支 (6)
标签 (13)
master
dev
kcptun
tfb
check_unicode
annotate
v1.3.3
v1.3.2
v1.3.1
v1.3.0
v1.2.6
v1.2.5
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.1.1
v1.1.0
v1.0.0
libhv
/
http
/
server
/
HttpService.cpp
libhv
/
http
/
server
/
HttpService.cpp
HttpService.cpp 6.13 KB
一键复制 编辑 原始数据 按行查看 历史
ithewei 提交于 2023年07月29日 14:39 +08:00 . feat: HttpService::IsTrustProxy support wildcard match
#include "HttpService.h"
#include "HttpMiddleware.h"
#include "hbase.h" // import hv_strendswith
namespace hv {
void HttpService::AddRoute(const char* path, http_method method, const http_handler& handler) {
std::shared_ptr<http_method_handlers> method_handlers = NULL;
auto iter = pathHandlers.find(path);
if (iter == pathHandlers.end()) {
// add path
method_handlers = std::make_shared<http_method_handlers>();
pathHandlers[path] = method_handlers;
}
else {
method_handlers = iter->second;
}
for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
if (iter->method == method) {
// update
iter->handler = handler;
return;
}
}
// add
method_handlers->push_back(http_method_handler(method, handler));
}
int HttpService::GetRoute(const char* url, http_method method, http_handler** handler) {
// {base_url}/path?query
const char* s = url;
const char* b = base_url.c_str();
while (*s && *b && *s == *b) {++s;++b;}
if (*b != '0円') {
return HTTP_STATUS_NOT_FOUND;
}
const char* e = s;
while (*e && *e != '?') ++e;
std::string path = std::string(s, e);
auto iter = pathHandlers.find(path);
if (iter == pathHandlers.end()) {
if (handler) *handler = NULL;
return HTTP_STATUS_NOT_FOUND;
}
auto method_handlers = iter->second;
for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
if (iter->method == method) {
if (handler) *handler = &iter->handler;
return 0;
}
}
if (handler) *handler = NULL;
return HTTP_STATUS_METHOD_NOT_ALLOWED;
}
int HttpService::GetRoute(HttpRequest* req, http_handler** handler) {
// {base_url}/path?query
const char* s = req->path.c_str();
const char* b = base_url.c_str();
while (*s && *b && *s == *b) {++s;++b;}
if (*b != '0円') {
return HTTP_STATUS_NOT_FOUND;
}
const char* e = s;
while (*e && *e != '?') ++e;
std::string path = std::string(s, e);
const char *kp, *ks, *vp, *vs;
bool match;
for (auto iter = pathHandlers.begin(); iter != pathHandlers.end(); ++iter) {
kp = iter->first.c_str();
vp = path.c_str();
match = false;
std::map<std::string, std::string> params;
while (*kp && *vp) {
if (kp[0] == '*') {
// wildcard *
match = hv_strendswith(vp, kp+1);
break;
} else if (*kp != *vp) {
match = false;
break;
} else if (kp[0] == '/' && (kp[1] == ':' || kp[1] == '{')) {
// RESTful /:field/
// RESTful /{field}/
kp += 2;
ks = kp;
while (*kp && *kp != '/') {++kp;}
vp += 1;
vs = vp;
while (*vp && *vp != '/') {++vp;}
int klen = kp - ks;
if (*(ks-1) == '{' && *(kp-1) == '}') {
--klen;
}
params[std::string(ks, klen)] = std::string(vs, vp-vs);
continue;
} else {
++kp;
++vp;
}
}
match = match ? match : (*kp == '0円' && *vp == '0円');
if (match) {
auto method_handlers = iter->second;
for (auto iter = method_handlers->begin(); iter != method_handlers->end(); ++iter) {
if (iter->method == req->method) {
for (auto& param : params) {
// RESTful /:field/ => req->query_params[field]
req->query_params[param.first] = param.second;
}
if (handler) *handler = &iter->handler;
return 0;
}
}
if (params.size() == 0) {
if (handler) *handler = NULL;
return HTTP_STATUS_METHOD_NOT_ALLOWED;
}
}
}
if (handler) *handler = NULL;
return HTTP_STATUS_NOT_FOUND;
}
void HttpService::Static(const char* path, const char* dir) {
std::string strPath(path);
if (strPath.back() != '/') strPath += '/';
std::string strDir(dir);
if (strDir.back() == '/') strDir.pop_back();
staticDirs[strPath] = strDir;
}
std::string HttpService::GetStaticFilepath(const char* path) {
std::string filepath;
for (auto iter = staticDirs.begin(); iter != staticDirs.end(); ++iter) {
if (hv_strstartswith(path, iter->first.c_str())) {
filepath = iter->second + (path + iter->first.length() - 1);
break;
}
}
if (filepath.empty()) {
return filepath;
}
if (filepath.back() == '/') {
filepath += home_page;
}
return filepath;
}
void HttpService::Proxy(const char* path, const char* url) {
proxies[path] = url;
}
std::string HttpService::GetProxyUrl(const char* path) {
std::string url;
for (auto iter = proxies.begin(); iter != proxies.end(); ++iter) {
if (hv_strstartswith(path, iter->first.c_str())) {
url = iter->second + (path + iter->first.length());
break;
}
}
return url;
}
void HttpService::AddTrustProxy(const char* host) {
trustProxies.emplace_back(host);
}
void HttpService::AddNoProxy(const char* host) {
noProxies.emplace_back(host);
}
bool HttpService::IsTrustProxy(const char* host) {
if (!host || *host == '0円') return false;
bool trust = true;
if (trustProxies.size() != 0) {
trust = false;
for (const auto& trust_proxy : trustProxies) {
if (hv_wildcard_match(host, trust_proxy.c_str())) {
trust = true;
break;
}
}
}
if (noProxies.size() != 0) {
for (const auto& no_proxy : noProxies) {
if (hv_wildcard_match(host, no_proxy.c_str())) {
trust = false;
break;
}
}
}
return trust;
}
void HttpService::AllowCORS() {
Use(HttpMiddleware::CORS);
}
}
Loading...
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

🔥 比libevent/libuv/asio更易用的国产网络库,用来开发 TCP/UDP/SSL/HTTP/WebSocket/MQTT 客户端/服务端
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/cppprojects/libhv.git
git@gitee.com:cppprojects/libhv.git
cppprojects
libhv
libhv
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /