144 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# 1. Goahead开发文档
 | 
						||
 | 
						||
## 1.1. Goahead版本
 | 
						||
 | 
						||
5.2.0
 | 
						||
 | 
						||
## 1.2. 编译脚本
 | 
						||
 | 
						||
```
 | 
						||
# build goahead before make libgo.a
 | 
						||
add_custom_command(
 | 
						||
    OUTPUT ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile
 | 
						||
    COMMAND echo "tar zxvf goahead-5.2.0.tar.gz"
 | 
						||
    COMMAND tar zxvf goahead-5.2.0.tar.gz                    // 解压源码包
 | 
						||
    WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/
 | 
						||
)
 | 
						||
add_custom_command(
 | 
						||
    OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a
 | 
						||
    DEPENDS ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile
 | 
						||
    COMMAND make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} 
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgo.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a // 拷贝静态库到output目录
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libmbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a // 拷贝静态库到output目录
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgoahead-mbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a // 拷贝静态库到output目录
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.crt ${PLATFORM_PATH}/cmake-shell/ // 拷贝self.crt,self.key两个到运行目录;
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.key ${PLATFORM_PATH}/cmake-shell/ // 拷贝self.crt,self.key两个到运行目录;
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/route.txt ${GOAHEAD_CONFIG_FILE_PATH} // 配置文件两个:route.txt,auth.txt;
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/auth.txt ${GOAHEAD_CONFIG_FILE_PATH} // 配置文件两个:route.txt,auth.txt;
 | 
						||
    WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead
 | 
						||
)
 | 
						||
add_custom_target(
 | 
						||
    libgo.a // 创建goahead目标
 | 
						||
    DEPENDS ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a
 | 
						||
)
 | 
						||
```
 | 
						||
 | 
						||
## 1.3. 环境配置
 | 
						||
 | 
						||
1. 拷贝self.crt,self.key两个到运行目录;
 | 
						||
2. 配置文件两个:route.txt,auth.txt;
 | 
						||
 | 
						||
  self.crt,self.key两个文件默认使用当前路径,需要配置。
 | 
						||
 | 
						||
详见配置:**GOAHEAD_CONFIG_FILE_PATH**
 | 
						||
 | 
						||
```
 | 
						||
# ------------ build GoAhead ------------ #
 | 
						||
set(GOAHEAD_DOCUMENTS_PATH                 "web")
 | 
						||
set(GOAHEAD_UPLOAD_TMP_PATH                "./goahead")
 | 
						||
set(GOAHEAD_UPLOAD_PATH                    "${GOAHEAD_UPLOAD_TMP_PATH}")
 | 
						||
set(GOAHEAD_LIMIT_POST                     "335544320") # If not defined means using default setting. See goahead-linux-static-fancy.mk
 | 
						||
# GOAHEAD_CONFIG_FILE_PATH should be set when cross compile
 | 
						||
set(GOAHEAD_CONFIG_FILE_PATH               ".")
 | 
						||
# ------------ build GoAhead end ------------ #
 | 
						||
```
 | 
						||
 | 
						||
转换成ME_GOAHEAD_SSL_KEY和ME_GOAHEAD_SSL_CERTIFICATE两个宏来指定文件路径。
 | 
						||
 | 
						||
```
 | 
						||
add_custom_command(
 | 
						||
    OUTPUT ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a
 | 
						||
    DEPENDS ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/Makefile
 | 
						||
    COMMAND make CC=${CMAKE_C_COMPILER} ARCH=${SET_ARCH} PROFILE=${LIB_TYPE} ME_GOAHEAD_UPLOAD_DIR=\"${GOAHEAD_UPLOAD_TMP_PATH}\" 
 | 
						||
    ME_GOAHEAD_SSL_KEY=\"${GOAHEAD_CONFIG_FILE_PATH}/self.key\" ME_GOAHEAD_SSL_CERTIFICATE=\"${GOAHEAD_CONFIG_FILE_PATH}/self.crt\"
 | 
						||
    ${ME_GOAHEAD_LIMIT_POST} -f ../modify/goahead-linux-static-fancy.mk
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgo.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgo.a
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libmbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libmbedtls.a
 | 
						||
    COMMAND mv ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/libgoahead-mbedtls.a ${EXTERNAL_LIBS_OUTPUT_PATH}/libgoahead-mbedtls.a
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.crt ${PLATFORM_PATH}/cmake-shell/
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/build/${GOAHEAD_INCLUDE_PATH}/bin/self.key ${PLATFORM_PATH}/cmake-shell/
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/route.txt ${GOAHEAD_CONFIG_FILE_PATH}
 | 
						||
    COMMAND cp ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead/test/auth.txt ${GOAHEAD_CONFIG_FILE_PATH}
 | 
						||
    WORKING_DIRECTORY ${EXTERNAL_SOURCE_PATH}/goahead-5.2.0/GoAhead
 | 
						||
)
 | 
						||
```
 | 
						||
 | 
						||
## 1.4. 代码整改
 | 
						||
 | 
						||
### 1.4.1. web服务安全退出
 | 
						||
 | 
						||
  由于官方源码是不超时阻塞,为了方便自动化测试,把官方源码的不超时阻塞改成超时阻塞。
 | 
						||
```
 | 
						||
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 ===================== //
 | 
						||
    }
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### 1.4.2. HTTP POST 文件限制
 | 
						||
 | 
						||
  源码限制POST文件大小太小,这里修改为32M。
 | 
						||
 | 
						||
```
 | 
						||
```
 | 
						||
 | 
						||
## 1.5. goahead的bug
 | 
						||
 | 
						||
  当goahead使用无效的ip进行listen时,asan工具会报内存泄漏问题,目前暂时忽略该bug
 | 
						||
 | 
						||
```
 | 
						||
=================================================================
 | 
						||
==1420508==ERROR: LeakSanitizer: detected memory leaks
 | 
						||
 | 
						||
Direct leak of 17 byte(s) in 1 object(s) allocated from:
 | 
						||
    #0 0x7f3f4325d808 in __interceptor_malloc ../../../../src/libsanitizer/asan/asan_malloc_linux.cc:144
 | 
						||
    #1 0x55bc16b87490 in walloc src/alloc.c:280
 | 
						||
    #2 0x55bc16b991ae in sclone src/runtime.c:2430
 | 
						||
    #3 0x55bc16b9be26 in socketParseAddress src/socket.c:1334
 | 
						||
    #4 0x55bc16b891bf in websListen src/http.c:646
 | 
						||
    #5 0x55bc16b86f59 in WebServerInit /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/utils/WebServer/src/WebServer.cpp:152
 | 
						||
    #6 0x55bc16b81f4a in AppManager::HttpServerThread(app_param const&) /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/middleware/AppManager/src/AppManager.cpp:79
 | 
						||
    #7 0x55bc16b829f0 in operator() /home/xiaojiazhu/project/rkipc/battery/ipc-rk1106/ipc-sdk/middleware/AppManager/src/AppManager.cpp:52
 | 
						||
    #8 0x55bc16b829f0 in __invoke_impl<void, AppManager::HttpServerStart(const AppParam&)::<lambda(std::shared_ptr<AppManager>)>, std::shared_ptr<AppManager> > /usr/include/c++/9/bits/invoke.h:60
 | 
						||
    #9 0x55bc16b829f0 in __invoke<AppManager::HttpServerStart(const AppParam&)::<lambda(std::shared_ptr<AppManager>)>, std::shared_ptr<AppManager> > /usr/include/c++/9/bits/invoke.h:95
 | 
						||
    #10 0x55bc16b829f0 in _M_invoke<0, 1> /usr/include/c++/9/thread:244
 | 
						||
    #11 0x55bc16b829f0 in operator() /usr/include/c++/9/thread:251
 | 
						||
    #12 0x55bc16b829f0 in _M_run /usr/include/c++/9/thread:195
 | 
						||
    #13 0x7f3f4301bdf3  (/lib/x86_64-linux-gnu/libstdc++.so.6+0xd6df3)
 | 
						||
 | 
						||
SUMMARY: AddressSanitizer: 17 byte(s) leaked in 1 allocation(s).
 | 
						||
``` |