Modify:Goahead open source code.

This commit is contained in:
Fancy code 2024-02-29 23:29:35 -08:00
parent 480d5ee9c7
commit 08031ed4fa
11 changed files with 3652 additions and 17 deletions

3546
external/goahead-5.2.0/modify/http.c vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -9,6 +9,7 @@ include_directories(
${UTILS_SOURCE_PATH}/StatusCode/include ${UTILS_SOURCE_PATH}/StatusCode/include
${UTILS_SOURCE_PATH}/Log/include ${UTILS_SOURCE_PATH}/Log/include
${UTILS_SOURCE_PATH}/FxHttpServer/include ${UTILS_SOURCE_PATH}/FxHttpServer/include
${UTILS_SOURCE_PATH}/WebServer/include
${HAL_SOURCE_PATH}/include ${HAL_SOURCE_PATH}/include
) )
#do not rely on any other library #do not rely on any other library
@ -21,7 +22,7 @@ aux_source_directory(./src/Protocol/SixFrame SRC_FILES)
set(TARGET_NAME AppManager) set(TARGET_NAME AppManager)
add_library(${TARGET_NAME} STATIC ${SRC_FILES}) add_library(${TARGET_NAME} STATIC ${SRC_FILES})
target_link_libraries(${TARGET_NAME} FxHttpServer StatusCode Log) target_link_libraries(${TARGET_NAME} WebServer StatusCode Log)
if ("${CLANG_TIDY_SUPPORT}" MATCHES "true") if ("${CLANG_TIDY_SUPPORT}" MATCHES "true")
add_custom_target( add_custom_target(

View File

@ -14,8 +14,9 @@
*/ */
#include "AppManager.h" #include "AppManager.h"
#include "AppManagerMakePtr.h" #include "AppManagerMakePtr.h"
#include "FxHttpServer.h" // #include "FxHttpServer.h"
#include "ILog.h" #include "ILog.h"
#include "WebServer.h"
AppManager::AppManager() AppManager::AppManager()
{ {
// //
@ -49,7 +50,8 @@ void AppManager::HttpServerStart(void)
} }
void AppManager::HttpServerStop(void) void AppManager::HttpServerStop(void)
{ {
FxHttpServerExit(); // FxHttpServerExit();
WebServerExit();
if (mHttpSever.joinable()) { if (mHttpSever.joinable()) {
mHttpSever.join(); mHttpSever.join();
} }
@ -66,6 +68,9 @@ void AppManager::HttpServerThread(void)
appImpl->AppRequestHandle(url, urlLength, responseHandle, context); appImpl->AppRequestHandle(url, urlLength, responseHandle, context);
} }
}; };
FxHttpServerInit(httpHandle, 8080); // FxHttpServerInit(httpHandle, 8080);
FxHttpServerUnInit(); // FxHttpServerUnInit();
WebServerParam web = {.mIp = "192.168.1.29", .mPort = 8888, .mHttpRequestHandle = httpHandle};
WebServerInit(web);
WebServerUnInit();
} }

View File

@ -31,7 +31,6 @@ bool CreateAppManagerModule(void)
bool DestroyAppManagerModule(void) bool DestroyAppManagerModule(void)
{ {
auto instance = std::make_shared<IAppManager>(); auto instance = std::make_shared<IAppManager>();
IAppManager::GetInstance()->UnInit();
IAppManager::GetInstance(&instance); IAppManager::GetInstance(&instance);
return true; return true;
} }

View File

@ -8,7 +8,7 @@ include_directories(
./tool/include ./tool/include
${UTILS_SOURCE_PATH}/Log/include ${UTILS_SOURCE_PATH}/Log/include
${UTILS_SOURCE_PATH}/StatusCode/include ${UTILS_SOURCE_PATH}/StatusCode/include
# ${UTILS_SOURCE_PATH}/UartDevice/include # ${UTILS_SOURCE_PATH}/WebServer/include
# ${UTILS_SOURCE_PATH}/McuProtocol/include # ${UTILS_SOURCE_PATH}/McuProtocol/include
${UTILS_SOURCE_PATH}/KeyControl/include ${UTILS_SOURCE_PATH}/KeyControl/include
${UTILS_SOURCE_PATH}/LedControl/include ${UTILS_SOURCE_PATH}/LedControl/include

View File

@ -14,6 +14,7 @@
*/ */
#include "IAppManager.h" #include "IAppManager.h"
#include "ILog.h" #include "ILog.h"
// #include "WebServer.h"
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <thread> #include <thread>

View File

@ -24,7 +24,8 @@ TEST(WebServerTest, Demo)
{ {
CreateLogModule(); CreateLogModule();
ILogInit(LOG_INSTANCE_TYPE_END); ILogInit(LOG_INSTANCE_TYPE_END);
WebServerInit(); WebServerParam web = {.mIp = "192.168.1.29", .mPort = 8080};
WebServerInit(web);
// std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 10)); // std::this_thread::sleep_for(std::chrono::milliseconds(1000 * 10));
ILogUnInit(); ILogUnInit();
} }

View File

@ -15,8 +15,6 @@ include_directories(
# ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs # ${EXTERNAL_SOURCE_PATH}/libconfig/libconfig-1.7.3/lib/.libs
# ) # )
if (NOT DEFINED GOAHEAD_DOCUMENTS_PATH) if (NOT DEFINED GOAHEAD_DOCUMENTS_PATH)
set(GOAHEAD_DOCUMENTS_PATH "web") set(GOAHEAD_DOCUMENTS_PATH "web")
endif() endif()
@ -68,6 +66,7 @@ add_custom_command(
OUTPUT ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile OUTPUT ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile
COMMAND echo "tar zxvf goahead-5.2.0.tar.gz" COMMAND echo "tar zxvf goahead-5.2.0.tar.gz"
COMMAND tar zxvf goahead-5.2.0.tar.gz COMMAND tar zxvf goahead-5.2.0.tar.gz
COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/modify/http.c ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/src
WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/ WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/
) )
add_custom_command( add_custom_command(

View File

@ -37,3 +37,37 @@ add_custom_target(
1. 拷贝self.crt,self.key两个到运行目录 1. 拷贝self.crt,self.key两个到运行目录
2. 配置文件两个route.txtauth.txt 2. 配置文件两个route.txtauth.txt
## 1.4. 代码整改
&emsp;&emsp; 由于官方源码是不超时阻塞,为了方便自动化测试,把官方源码的不超时阻塞改成超时阻塞。
```
PUBLIC void websServiceEvents(int *finished)
{
int delay, nextEvent;
if (finished) {
*finished = 0;
}
// ===================== added by xiao ===================== //
// delay = 0; // open source code
#define TIME_OUT_MS 1000
delay = TIME_OUT_MS; // modifed by xiao, time out 1000 ms
// ===================== added by xiao end ===================== //
while (!finished || !*finished) {
if (socketSelect(-1, delay)) {
socketProcess();
}
#if ME_GOAHEAD_CGI
delay = websCgiPoll();
#else
delay = MAXINT;
#endif
nextEvent = websRunEvents();
delay = min(delay, nextEvent);
// ===================== added by xiao ===================== //
delay = (delay <= 0 || delay >= TIME_OUT_MS) ? TIME_OUT_MS : delay;
// ===================== added by xiao end ===================== //
}
}
```

View File

@ -18,7 +18,16 @@
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
StatusCode WebServerInit(void); typedef void (*ResponseHandle)(const char *, void *);
typedef void (*HttpHandleCallback)(const char *, const unsigned int, ResponseHandle, void *);
typedef struct web_server_param
{
const char *mIp;
int mPort;
HttpHandleCallback mHttpRequestHandle;
} WebServerParam;
StatusCode WebServerInit(const WebServerParam webParam);
StatusCode WebServerExit(void);
StatusCode WebServerUnInit(void); StatusCode WebServerUnInit(void);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -27,7 +27,10 @@ static void logHeader(void)
{ {
char home[ME_GOAHEAD_LIMIT_STRING]; char home[ME_GOAHEAD_LIMIT_STRING];
getcwd(home, sizeof(home)); char *result = getcwd(home, sizeof(home));
if (nullptr == result) {
LogWarning("Can't get path.\n");
}
logmsg(2, "Configuration for %s", ME_TITLE); logmsg(2, "Configuration for %s", ME_TITLE);
logmsg(2, "---------------------------------------------"); logmsg(2, "---------------------------------------------");
logmsg(2, "Version: %s", ME_VERSION); logmsg(2, "Version: %s", ME_VERSION);
@ -47,7 +50,30 @@ void initPlatform(void)
signal(SIGKILL, sigHandler); signal(SIGKILL, sigHandler);
signal(SIGPIPE, SIG_IGN); signal(SIGPIPE, SIG_IGN);
} }
StatusCode WebServerInit(void) static bool testHandler(Webs *wp)
{
if (smatch(wp->path, "/")) {
// websRewriteRequest(wp, "/home.html");
/* Fall through */
}
LogInfo("sssssssssssssssssssssssssssss url = %s\n", wp->url);
// websSetStatus(wp, HTTP_CODE_OK);
// websWriteHeaders(wp, 0, 0);
// websWriteEndHeaders(wp);
// websWrite(wp, "<html><body><h2>");
// websWrite(wp, "sssssssssssssssssssssss");
// websWrite(wp, "</h2></body></html>\n");
// websDone(wp);
websSetStatus(wp, 200);
websWriteHeaders(wp, -1, 0);
websWriteHeader(wp, "Content-Type", "text/plain");
websWriteEndHeaders(wp);
websWrite(wp, "Hello Legacy World\n");
websDone(wp);
return 1;
return 1;
}
StatusCode WebServerInit(const WebServerParam webParam)
{ {
websSetDebug(1); websSetDebug(1);
logSetPath("stdout:2"); logSetPath("stdout:2");
@ -55,8 +81,10 @@ StatusCode WebServerInit(void)
constexpr int BUF_LENGTH = 128; constexpr int BUF_LENGTH = 128;
char routePath[BUF_LENGTH] = {0}; char routePath[BUF_LENGTH] = {0};
char authPath[BUF_LENGTH] = {0}; char authPath[BUF_LENGTH] = {0};
char listen[BUF_LENGTH] = {0};
snprintf(routePath, BUF_LENGTH, "%s/route.txt", GOAHEAD_CONFIG_FILE_PATH); snprintf(routePath, BUF_LENGTH, "%s/route.txt", GOAHEAD_CONFIG_FILE_PATH);
snprintf(authPath, BUF_LENGTH, "%s/auth.txt", GOAHEAD_CONFIG_FILE_PATH); snprintf(authPath, BUF_LENGTH, "%s/auth.txt", GOAHEAD_CONFIG_FILE_PATH);
snprintf(listen, BUF_LENGTH, "%s:%d", webParam.mIp, webParam.mPort);
initPlatform(); initPlatform();
if (websOpen(documents, routePath) < 0) { if (websOpen(documents, routePath) < 0) {
LogError("Cannot initialize server. Exiting.\n"); LogError("Cannot initialize server. Exiting.\n");
@ -67,12 +95,24 @@ StatusCode WebServerInit(void)
LogError("Cannot load %s", authPath); LogError("Cannot load %s", authPath);
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
if (websListen("192.168.1.189:8080") < 0) { if (websListen(listen) < 0) {
return CreateStatusCode(STATUS_CODE_NOT_OK); return CreateStatusCode(STATUS_CODE_NOT_OK);
} }
websDefineHandler("test", 0, testHandler, 0, 0);
websAddRoute("/test", "test", 0);
websServiceEvents(&finished); websServiceEvents(&finished);
logmsg(1, "Instructed to exit\n"); logmsg(1, "Instructed to exit\n");
websClose(); websClose();
return CreateStatusCode(STATUS_CODE_OK); return CreateStatusCode(STATUS_CODE_OK);
} }
StatusCode WebServerUnInit(void) { return CreateStatusCode(STATUS_CODE_OK); } StatusCode WebServerExit(void)
{
LogInfo("Stop goahead web server.\n");
finished = 1;
return CreateStatusCode(STATUS_CODE_OK);
}
StatusCode WebServerUnInit(void)
{
LogInfo("WebServerUnInit.\n");
return CreateStatusCode(STATUS_CODE_OK);
}