Commit 4c398216 by xiongziliang

添加http服务器配置项:是否支持vhost

parent 36e8dcfa
Subproject commit b38a866916d166fba8a33275b9375f185fcf3671 Subproject commit 02c344efb0eba8bd4f1eec8fb5dce3db5bda284a
...@@ -93,6 +93,10 @@ const char kKeepAliveSecond[] = HTTP_FIELD"keepAliveSecond"; ...@@ -93,6 +93,10 @@ const char kKeepAliveSecond[] = HTTP_FIELD"keepAliveSecond";
#define HTTP_MAX_REQ_CNT 100 #define HTTP_MAX_REQ_CNT 100
const char kMaxReqCount[] = HTTP_FIELD"maxReqCount"; const char kMaxReqCount[] = HTTP_FIELD"maxReqCount";
//文件服务器是否启动虚拟主机
const char kEnableVhost[] = HTTP_FIELD"enableVhost";
//http 字符编码 //http 字符编码
#if defined(_WIN32) #if defined(_WIN32)
#define HTTP_CHAR_SET "gb2312" #define HTTP_CHAR_SET "gb2312"
...@@ -126,6 +130,7 @@ onceToken token([](){ ...@@ -126,6 +130,7 @@ onceToken token([](){
mINI::Instance()[kCharSet] = HTTP_CHAR_SET; mINI::Instance()[kCharSet] = HTTP_CHAR_SET;
mINI::Instance()[kRootPath] = HTTP_ROOT_PATH; mINI::Instance()[kRootPath] = HTTP_ROOT_PATH;
mINI::Instance()[kNotFound] = HTTP_NOT_FOUND; mINI::Instance()[kNotFound] = HTTP_NOT_FOUND;
mINI::Instance()[kEnableVhost] = 1;
},nullptr); },nullptr);
}//namespace Http }//namespace Http
......
...@@ -165,6 +165,8 @@ extern const char kCharSet[]; ...@@ -165,6 +165,8 @@ extern const char kCharSet[];
extern const char kRootPath[]; extern const char kRootPath[];
//http 404错误提示内容 //http 404错误提示内容
extern const char kNotFound[]; extern const char kNotFound[];
//文件服务器是否启动虚拟主机
extern const char kEnableVhost[];
}//namespace Http }//namespace Http
......
...@@ -105,9 +105,6 @@ HttpSession::HttpSession(const Socket::Ptr &pSock) : TcpSession(pSock) { ...@@ -105,9 +105,6 @@ HttpSession::HttpSession(const Socket::Ptr &pSock) : TcpSession(pSock) {
pSock->setSendTimeOutSecond(15); pSock->setSendTimeOutSecond(15);
//起始接收buffer缓存设置为4K,节省内存 //起始接收buffer缓存设置为4K,节省内存
pSock->setReadBuffer(std::make_shared<BufferRaw>(4 * 1024)); pSock->setReadBuffer(std::make_shared<BufferRaw>(4 * 1024));
GET_CONFIG_AND_REGISTER(string,rootPath,Http::kRootPath);
_strPath = rootPath;
} }
HttpSession::~HttpSession() { HttpSession::~HttpSession() {
...@@ -266,6 +263,9 @@ inline bool HttpSession::checkLiveFlvStream(){ ...@@ -266,6 +263,9 @@ inline bool HttpSession::checkLiveFlvStream(){
} }
return true; return true;
} }
inline bool makeMeun(const string &httpPath,const string &strFullPath,const string &vhost, string &strRet) ;
inline bool HttpSession::Handle_Req_GET(int64_t &content_len) { inline bool HttpSession::Handle_Req_GET(int64_t &content_len) {
//先看看是否为WebSocket请求 //先看看是否为WebSocket请求
if(checkWebSocket()){ if(checkWebSocket()){
...@@ -293,16 +293,19 @@ inline bool HttpSession::Handle_Req_GET(int64_t &content_len) { ...@@ -293,16 +293,19 @@ inline bool HttpSession::Handle_Req_GET(int64_t &content_len) {
auto fullUrl = string(HTTP_SCHEMA) + "://" + _parser["Host"] + _parser.FullUrl(); auto fullUrl = string(HTTP_SCHEMA) + "://" + _parser["Host"] + _parser.FullUrl();
_mediaInfo.parse(fullUrl); _mediaInfo.parse(fullUrl);
string strFile = _strPath + "/" + _mediaInfo._vhost + _parser.Url();
/////////////HTTP连接是否需要被关闭//////////////// /////////////HTTP连接是否需要被关闭////////////////
GET_CONFIG_AND_REGISTER(uint32_t,reqCnt,Http::kMaxReqCount); GET_CONFIG_AND_REGISTER(uint32_t,reqCnt,Http::kMaxReqCount);
GET_CONFIG_AND_REGISTER(bool,enableVhost,Http::kEnableVhost);
GET_CONFIG_AND_REGISTER(string,rootPath,Http::kRootPath);
string strFile = enableVhost ? rootPath + "/" + _mediaInfo._vhost + _parser.Url() :rootPath + _parser.Url();
replace(strFile,"//","/");
bool bClose = (strcasecmp(_parser["Connection"].data(),"close") == 0) || ( ++_iReqCnt > reqCnt); bool bClose = (strcasecmp(_parser["Connection"].data(),"close") == 0) || ( ++_iReqCnt > reqCnt);
//访问的是文件夹 //访问的是文件夹
if (strFile.back() == '/' || File::is_dir(strFile.data())) { if (strFile.back() == '/' || File::is_dir(strFile.data())) {
//生成文件夹菜单索引 //生成文件夹菜单索引
string strMeun; string strMeun;
if (!makeMeun(strFile,_mediaInfo._vhost, strMeun)) { if (!makeMeun(_parser.Url(),strFile,_mediaInfo._vhost, strMeun)) {
//文件夹不存在 //文件夹不存在
sendNotFound(bClose); sendNotFound(bClose);
return !bClose; return !bClose;
...@@ -432,7 +435,7 @@ inline bool HttpSession::Handle_Req_GET(int64_t &content_len) { ...@@ -432,7 +435,7 @@ inline bool HttpSession::Handle_Req_GET(int64_t &content_len) {
return true; return true;
} }
inline bool HttpSession::makeMeun(const string &strFullPath,const string &vhost, string &strRet) { inline bool makeMeun(const string &httpPath,const string &strFullPath,const string &vhost, string &strRet) {
string strPathPrefix(strFullPath); string strPathPrefix(strFullPath);
string last_dir_name; string last_dir_name;
if(strPathPrefix.back() == '/'){ if(strPathPrefix.back() == '/'){
...@@ -452,11 +455,9 @@ inline bool HttpSession::makeMeun(const string &strFullPath,const string &vhost, ...@@ -452,11 +455,9 @@ inline bool HttpSession::makeMeun(const string &strFullPath,const string &vhost,
"<body>\r\n" "<body>\r\n"
"<h1>文件索引:"; "<h1>文件索引:";
string strPath = strFullPath; ss << httpPath;
strPath = strPath.substr(_strPath.length() + vhost.length() + 1);
ss << strPath;
ss << "</h1>\r\n"; ss << "</h1>\r\n";
if (strPath != "/") { if (httpPath != "/") {
ss << "<li><a href=\""; ss << "<li><a href=\"";
ss << "/"; ss << "/";
ss << "\">"; ss << "\">";
......
...@@ -97,7 +97,6 @@ protected: ...@@ -97,7 +97,6 @@ protected:
} }
private: private:
Parser _parser; Parser _parser;
string _strPath;
Ticker _ticker; Ticker _ticker;
uint32_t _iReqCnt = 0; uint32_t _iReqCnt = 0;
//消耗的总流量 //消耗的总流量
...@@ -113,7 +112,6 @@ private: ...@@ -113,7 +112,6 @@ private:
inline bool checkWebSocket(); inline bool checkWebSocket();
inline bool emitHttpEvent(bool doInvoke); inline bool emitHttpEvent(bool doInvoke);
inline void urlDecode(Parser &parser); inline void urlDecode(Parser &parser);
inline bool makeMeun(const string &strFullPath,const string &vhost, string &strRet);
inline void sendNotFound(bool bClose); inline void sendNotFound(bool bClose);
inline void sendResponse(const char *pcStatus,const KeyValue &header,const string &strContent); inline void sendResponse(const char *pcStatus,const KeyValue &header,const string &strContent);
inline static KeyValue makeHttpHeader(bool bClose=false,int64_t iContentSize=-1,const char *pcContentType="text/html"); inline static KeyValue makeHttpHeader(bool bClose=false,int64_t iContentSize=-1,const char *pcContentType="text/html");
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论