Skip to content

Commit 8b72c9c

Browse files
committed
support nginx upload module proxy_pass method
support configuration of HASH algorithm type
1 parent 5ed29a5 commit 8b72c9c

File tree

20 files changed

+306
-44
lines changed

20 files changed

+306
-44
lines changed

APIList.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
只支持POST,业务处理端口
2+
3+
查询文件列表:/api/query/file
4+
5+
{
6+
"lpszTimeStart":"开始时间,可NULL",
7+
"lpszTimeEnd":"结束时间,可NULL",
8+
"lpszFileName":"文件名,可NULL",
9+
"lpszFileHash":"文件HASH,可NULL"
10+
}
11+
12+
NGINX上传代理接口:/api/event/upfile

README.en.md

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ This repository has a development and master branch. If you want to use it, plea
1212

1313
feature list:
1414
1. support file http upload and download(use put and get method)
15-
2. support private protocol transmission data(planning)
15+
2. support http api notify of event and management api interface(planning)
1616
3. support encrypt data transimission(planning)
1717
4. support mysql record infomation.
1818
5. support load banace(planning)
@@ -21,6 +21,9 @@ feature list:
2121
8. supprot speeds contral
2222
9. supprot task start and end proxy forwarding(planning)
2323
10.support p2p,bt and many more(planning)
24+
11.support second pass
25+
12.support nginx download proxy_pass
26+
13.support nginx upload module proxy_pass
2427

2528
## install
2629

@@ -30,7 +33,7 @@ XEngine need V7.13 or above
3033
vcpkg need 2021.05.11 or above
3134

3235
#### Windows
33-
use vs2019 open and complie
36+
use vs2019 x86 open and complie
3437
You need to configure the environment in the following way, otherwise you may need to set the library directory in the project yourself
3538

3639
##### install Dependent library
@@ -73,6 +76,17 @@ make FLAGS=CleanAll clear
7376
5. run
7477
6. use curl or postman test upload and download
7578

79+
## api list
80+
POST Method used as api server
81+
it is used as manage service.api format use to url,such as:POST /api/query/file
82+
The three-segment format is fixed,first api is a fixed,second api of query is a type,third api of file is a name
83+
support api list reference:apilist.txt
84+
85+
## second pass
86+
The Second pass is not realized by the server, it is by the client
87+
upload file second pass is first check the HASH file is on the server, if has file on the server, it will directly prompt the upload is successful.
88+
The realization of downloading second transmission is to first query the local file save path through HASH, and download it directly if it exists.
89+
7690
## directory struct
7791
- XEngine_Docment docment directory
7892
- XEngine_Release install directory

README.md

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
11
# XEngine_Storage
22

33
## 介绍
4-
c c++ 存储服务 c c++ 文件存储服务
4+
c c++ 存储服务 c c++ 文件存储服务
55
c c++ file storage service
66
这是一个上传下载服务API网关,不是文件同步服务,也不是云存储.
7-
这个服务的主要目的是为了给有上传下载服务业务需求的用户使用(比如需要上传下载服务器的开发人员).
7+
这个服务的主要目的是为了给有上传下载服务业务需求的用户使用(比如需要开发上传下载服务的开发人员).
88

99
## 软件特性
1010
基于libXEngine开发并实现的一套简洁高性能跨平台网络存储服务
1111
本仓库有开发和主分支,如果要使用,请使用master分支下的代码
1212
软件特性:
1313
1. 支持HTTP协议上传和下载(采用PUT和GET)
14-
2. 支持二进制私有协议传送数据(规划中)
14+
2. 支持HTTP API接口事件通知与管理(规划中)
1515
3. 支持加密传输(规划中)
1616
4. 采用MYSQL记录信息
1717
5. 支持分布式(规划中)
1818
6. 支持HTTP和私有验证(规划中)
1919
7. 支持详尽的日志和配置信息
2020
8. 支持传输速率控制
21-
9. 支持任务开始结束代理转发(规划中)
22-
10.支持P2P,BT,数据分发(规划中)
21+
9. 支持任务开始结束代理转发(规划中)
22+
10.支持P2P,BT,数据分发(规划中)
23+
11.支持秒传
24+
12.支持NGINX 下载透传代理(规划中)
25+
13.支持NGINX UPLOAD MODULE上传代理
2326

2427
## 安装教程
2528

@@ -29,7 +32,7 @@ XEngine版本需要V7.13或者以上版本
2932
vcpkg 需要2021.05.11以上版本
3033

3134
#### Windows
32-
使用VS2019 打开并且编译
35+
使用VS2019 x86打开并且编译
3336
你需要按照下面的方式配置环境,不然你可能需要自己在项目中设置库目录
3437
##### 三方库环境
3538
需要使用VCPKG安装环境.代码地址:https://github.com/microsoft/vcpkg
@@ -75,6 +78,17 @@ make FLAGS=CleanAll 清理编译
7578
- XEngine_Release 安装目录结构
7679
- XEngine_Source 源代目录结构
7780

81+
## API列表
82+
POST方法在本服务中用作于API.
83+
API用于管理服务器.API列表格式使用URL来识别,比如,POST /api/query/file
84+
三段格式是固定的,第一个api固定值,第二个query表示API类型,第三个file表示api名
85+
支持的API列表参考:apilist.txt
86+
87+
## 秒传实现
88+
秒传的实现不是靠服务器实现的,而是靠客户端实现的.
89+
上传秒传的实现是先通过HASH查询文件是否在服务器,如果存在就不上传直接提示客户端上传成功.
90+
下载秒传的实现是先通过HASH查询本地文件保存路径,如果存在就直接下载完成.
91+
7892
## 参与贡献
7993

8094
1. Fork 本仓库

XEngine_Release/XEngine_Config/XEngine_Config.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
},
3333
"XStorage": {
3434
"nUseMode": 1,
35+
"nHashMode": 2,
3536
"tszHttpAddr": "http://192.168.1.4",
3637
"tszNginAddr": "http://192.168.1.4:5010",
3738
"tszFileDir": "./XEngine_File"
@@ -42,6 +43,7 @@
4243
},
4344
"XVer": {
4445
"StorageVersion": [
46+
"1.2.0.1001 Build20210618",
4547
"1.1.0.1001 Build20210611",
4648
"1.0.0.1001 Build20210501"
4749
]

XEngine_Source/StorageModule_Config/Config_Define.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ typedef struct tag_XEngine_ServerConfig
5454
struct
5555
{
5656
int nUseMode;
57+
int nHashMode;
5758
TCHAR tszHttpAddr[MAX_PATH];
5859
TCHAR tszNginAddr[MAX_PATH];
5960
TCHAR tszFileDir[MAX_PATH];

XEngine_Source/StorageModule_Config/Config_Json/Config_Json.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,15 @@ BOOL CConfig_Json::Config_Json_File(LPCTSTR lpszConfigFile,XENGINE_SERVERCONFIG
119119
_tcscpy(pSt_ServerConfig->st_XSql.tszSQLUser,st_JsonXSql["SQLUser"].asCString());
120120
_tcscpy(pSt_ServerConfig->st_XSql.tszSQLPass,st_JsonXSql["SQLPass"].asCString());
121121

122-
if (st_JsonRoot["XStorage"].empty() || (4 != st_JsonRoot["XStorage"].size()))
122+
if (st_JsonRoot["XStorage"].empty() || (5 != st_JsonRoot["XStorage"].size()))
123123
{
124124
Config_IsErrorOccur = TRUE;
125125
Config_dwErrorCode = ERROR_XENGINE_BLOGIC_CONFIG_JSON_XSTORAGE;
126126
return FALSE;
127127
}
128128
Json::Value st_JsonXStorage = st_JsonRoot["XStorage"];
129129
pSt_ServerConfig->st_XStorage.nUseMode = st_JsonXStorage["nUseMode"].asInt();
130+
pSt_ServerConfig->st_XStorage.nHashMode = st_JsonXStorage["nHashMode"].asInt();
130131
_tcscpy(pSt_ServerConfig->st_XStorage.tszHttpAddr, st_JsonXStorage["tszHttpAddr"].asCString());
131132
_tcscpy(pSt_ServerConfig->st_XStorage.tszNginAddr, st_JsonXStorage["tszNginAddr"].asCString());
132133
_tcscpy(pSt_ServerConfig->st_XStorage.tszFileDir, st_JsonXStorage["tszFileDir"].asCString());

XEngine_Source/XEngine_StorageApp/Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XE
55
LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_ManagePool -lXEngine_OPenSsl -lHelpComponents_XLog -lXEngine_ProcSdk -lXEngine_SystemApi -lRfcComponents_HttpServer -lXStorage_SQLPacket -lXStorage_Protocol -lStorageModule_Config -lStorageModule_Session
66
LIBEX = -static-libgcc -ldl -lrt -lpthread
77
LOADSO = -Wl,-rpath=./,--disable-new-dtags
8-
LIBINCLUDE = StorageApp_Config.o StorageApp_Download.o StorageApp_Network.o StorageApp_Task.o StorageApp_UPLoader.o XEngine_StorageApp.o
8+
LIBINCLUDE = StorageApp_Config.o StorageApp_Download.o StorageApp_Network.o StorageApp_Center.o StorageApp_UPLoader.o XEngine_StorageApp.o
99

1010
ifeq ($(RELEASE),1)
1111
FLAGS = -c -O2
@@ -30,8 +30,8 @@ StorageApp_Download.o:./StorageApp_Download.cpp
3030
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Download.cpp
3131
StorageApp_Network.o:./StorageApp_Network.cpp
3232
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Network.cpp
33-
StorageApp_Task.o:./StorageApp_Task.cpp
34-
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Task.cpp
33+
StorageApp_Center.o:./StorageApp_Center.cpp
34+
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_Center.cpp
3535
StorageApp_UPLoader.o:./StorageApp_UPLoader.cpp
3636
$(CC) $(DEBUG) $(FLAGS) $(UNICODE) ./StorageApp_UPLoader.cpp
3737
XEngine_StorageApp.o:./XEngine_StorageApp.cpp

XEngine_Source/XEngine_StorageApp/StorageApp_Center.cpp

Lines changed: 69 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam)
2424
for (int j = 0; j < ppSt_PKTClient[i]->nPktCount; j++)
2525
{
2626
int nMsgLen = 10240;
27+
int nHdrCount = 0;
28+
CHAR** ppszListHdr = NULL;
2729
//获得指定上传客户端触发信息
28-
if (RfcComponents_HttpServer_GetClientEx(xhCenterHttp, ppSt_PKTClient[i]->tszClientAddr, tszMsgBuffer, &nMsgLen, &st_HTTPParam))
30+
if (RfcComponents_HttpServer_GetClientEx(xhCenterHttp, ppSt_PKTClient[i]->tszClientAddr, tszMsgBuffer, &nMsgLen, &st_HTTPParam, &ppszListHdr, &nHdrCount))
2931
{
30-
XEngine_Task_HttpCenter(ppSt_PKTClient[i]->tszClientAddr, tszMsgBuffer, nMsgLen, &st_HTTPParam);
32+
XEngine_Task_HttpCenter(ppSt_PKTClient[i]->tszClientAddr, tszMsgBuffer, nMsgLen, &st_HTTPParam, ppszListHdr, nHdrCount);
3133
}
3234
}
3335
}
@@ -64,7 +66,7 @@ BOOL XEngine_Task_HttpCenter_APIList(LPCTSTR lpszUrlName, TCHAR* ptszAPIVersion,
6466
_tcscpy(ptszAPIName, ptszTokStr);
6567
return TRUE;
6668
}
67-
BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam)
69+
BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount)
6870
{
6971
int nSDLen = 2048;
7072
TCHAR tszSDBuffer[2048];
@@ -101,11 +103,13 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int
101103
return FALSE;
102104
}
103105

106+
LPCTSTR lpszEvent = _T("Event");
104107
LPCTSTR lpszQuery = _T("query");
108+
LPCTSTR lpszEventUPFile = _T("UPFile");
105109
LPCTSTR lpszQueryFile = _T("file");
106-
if (0 == _tcsncmp(lpszQuery, tszAPIMethod, _tcslen(lpszQuery)))
110+
if (0 == _tcsnicmp(lpszQuery, tszAPIMethod, _tcslen(lpszQuery)))
107111
{
108-
if (0 == _tcsncmp(lpszQueryFile, tszAPIName, _tcslen(lpszQueryFile)))
112+
if (0 == _tcsnicmp(lpszQueryFile, tszAPIName, _tcslen(lpszQueryFile)))
109113
{
110114
int nMsgLen = 10240;
111115
TCHAR tszFileName[MAX_PATH];
@@ -135,5 +139,65 @@ BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int
135139
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListFile, nListCount);
136140
}
137141
}
142+
else if (0 == _tcsnicmp(lpszEvent, tszAPIMethod, _tcslen(lpszEvent)))
143+
{
144+
if (0 == _tcsnicmp(lpszEventUPFile, tszAPIName, _tcslen(lpszEventUPFile)))
145+
{
146+
LPCTSTR lpszContentType = _T("Content-Type");
147+
LPCTSTR lpszBoundaryStr = _T("boundary=");
148+
TCHAR tszContentStr[MAX_PATH];
149+
TCHAR tszBoundarTmp[MAX_PATH];
150+
TCHAR tszBoundarStr[MAX_PATH];
151+
TCHAR tszFileDir[MAX_PATH];
152+
XSTORAGECORE_DBFILE st_DBFile;
153+
154+
memset(tszContentStr, '\0', MAX_PATH);
155+
memset(tszBoundarTmp, '\0', MAX_PATH);
156+
memset(tszBoundarStr, '\0', MAX_PATH);
157+
memset(tszContentStr, '\0', MAX_PATH);
158+
memset(tszFileDir, '\0', MAX_PATH);
159+
memset(&st_DBFile, '\0', sizeof(XSTORAGECORE_DBFILE));
160+
161+
if (!RfcComponents_HttpHelp_GetField(&pptszListHdr, nHdrCount, lpszContentType, tszContentStr))
162+
{
163+
st_HDRParam.bIsClose = TRUE;
164+
st_HDRParam.nHttpCode = 400;
165+
166+
RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
167+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
168+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求的HTTP头内容不正确,没有类型字段"), lpszClientAddr);
169+
return FALSE;
170+
}
171+
if (!BaseLib_OperatorString_FromStrGetKeyValue(tszContentStr, lpszBoundaryStr, NULL, tszBoundarTmp))
172+
{
173+
st_HDRParam.bIsClose = TRUE;
174+
st_HDRParam.nHttpCode = 400;
175+
176+
RfcComponents_HttpServer_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
177+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
178+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,请求的HTTP头内容不正确,没有Boundary值"), lpszClientAddr);
179+
return FALSE;
180+
}
181+
_stprintf(tszBoundarStr, _T("--%s\r\n"), tszBoundarTmp);
182+
183+
XStorageProtocol_Core_REQUPEvent(lpszMsgBuffer, tszBoundarStr, st_DBFile.st_ProtocolFile.tszFileName, tszFileDir, st_DBFile.st_ProtocolFile.tszFileHash, &st_DBFile.st_ProtocolFile.nFileSize);
184+
_tcscpy(st_DBFile.st_ProtocolFile.tszFilePath, st_ServiceCfg.st_XStorage.tszFileDir);
185+
186+
if (XStorageSQL_File_FileInsert(&st_DBFile))
187+
{
188+
st_HDRParam.nHttpCode = 200;
189+
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
190+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
191+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("业务客户端:%s,处理NGINX代理上传文件成功,文件名:%s,大小:%lld"), lpszClientAddr, tszFileDir, st_DBFile.st_ProtocolFile.nFileSize);
192+
}
193+
else
194+
{
195+
st_HDRParam.nHttpCode = 403;
196+
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
197+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
198+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("业务客户端:%s,处理NGINX代理上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, XStorageDB_GetLastError());
199+
}
200+
}
201+
}
138202
return TRUE;
139203
}

XEngine_Source/XEngine_StorageApp/StorageApp_Center.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33
XHTHREAD CALLBACK XEngine_Center_HTTPThread(LPVOID lParam);
44
BOOL XEngine_Task_HttpCenter_APIList(LPCTSTR lpszUrlName, TCHAR* ptszAPIVersion, TCHAR* ptszAPIMethod, TCHAR* ptszAPIName);
5-
BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam);
5+
BOOL XEngine_Task_HttpCenter(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, RFCCOMPONENTS_HTTP_REQPARAM* pSt_HTTPParam, TCHAR** pptszListHdr, int nHdrCount);

XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ extern XHANDLE xhCenterHttp;
6868
extern XENGINE_SERVERCONFIG st_ServiceCfg;
6969

7070
#include "StorageApp_Network.h"
71-
#include "StorageApp_Task.h"
7271
#include "StorageApp_Config.h"
7372
#include "StorageApp_Download.h"
7473
#include "StorageApp_UPLoader.h"

0 commit comments

Comments
 (0)