webServer别人的学习了



废话不多说,先上效果图:

启动web server:

commandline

 

浏览器截图:

ftp

 

 

 

 

下载使用(暂时只有Windows版,Linux版有时间的话补上):miniweb.rar

 

 

 

下面直接贴出主要实现代码:

Http类主要负责接收、解析客户端请求,然后通过WebAction类响应并发送相应的数据

Http.h

  1. #ifndef _HTTP_H  
  2. #define _HTTP_H  
  3.   
  4. #include <WinSock2.h>  
  5. #include <iostream>  
  6. #include "zfqstring.h"  
  7.   
  8. class Http  
  9. {  
  10. public:  
  11.     Http(SOCKET m_socket, zfqstring id, zfqstring pwd);  
  12.     virtual ~Http(void);  
  13. public:  
  14.     int Send(char* data, UINT len);  
  15.     int Recv(char* data, UINT len);  
  16.     int RecvByLine(char* data, UINT len);  
  17.     BOOL HttpRequestResponse();  
  18.     BOOL Parse(char* data);  
  19.     BOOL Query();  
  20.   
  21. protected:  
  22.     //  
  23.     zfqstring m_hostaddr;  
  24.     unsigned short m_hostport;  
  25.     //  
  26.     zfqstring m_id;  
  27.     zfqstring m_pwd;  
  28.     //  
  29.     zfqstring m_loginid;  
  30.     zfqstring m_loginpwd;  
  31.     //  
  32.     zfqstring m_postdata;  
  33.     zfqstring m_page;  
  34.     DWORD m_method;  
  35.     DWORD m_contentlength;  
  36.     //  
  37.     SOCKET m_socket;  
  38. };  
  39.   
  40. #endif  

 

Http.cpp

  1. #include "StdAfx.h"  
  2. #include "Http.h"  
  3. #include "Constant.h"  
  4. #include "Base64.h"  
  5. #include "FtpWebAction.h"  
  6.   
  7. Http::Http(SOCKET m_socket, zfqstring id, zfqstring pwd)  
  8. {  
  9.     this->m_socket = m_socket;  
  10.     m_id = id;  
  11.     m_pwd = pwd;  
  12. }  
  13.   
  14. Http::~Http(void)  
  15. {  
  16.     if(m_socket)  
  17.         closesocket(m_socket);  
  18. }  
  19.   
  20. int Http::Send(char* data, UINT len )  
  21. {  
  22.     long already_time = 0;  
  23.     struct fd_set fdset;  
  24.     struct timeval timeout;  
  25.     timeout.tv_sec = SELECT_WAIT_TIME;  
  26.     timeout.tv_usec = 0;  
  27.     size_t nSend = 0;  
  28.     size_t tLen = 0;  
  29.     while(1)  
  30.     {  
  31.         FD_ZERO(&fdset);  
  32.         FD_SET(m_socket, &fdset);  
  33.         int ret = select(m_socket + 1, NULL, &fdset, NULL, &timeout);  
  34.         switch(ret)  
  35.         {  
  36.         case 1:  
  37.             already_time = 0;  
  38.             tLen = send(m_socket, data, len - nSend, 0);  
  39.             nSend += tLen;  
  40.             if(nSend == len)  
  41.                 return SOCKET_SENDRECV_OK;  
  42.             break;  
  43.         case 0:  
  44.             already_time += SELECT_WAIT_TIME;  
  45.             if(already_time >= MAX_WAIT_TIME_FOR_SENDRECV)  
  46.             {  
  47.                 closesocket(m_socket);  
  48.                 return SOCKET_SENDRECV_TIMEOUT;  
  49.             }  
  50.             break;  
  51.         default:  
  52.             return SOCKET_SENDRECV_ERROR;  
  53.         }  
  54.     }  
  55. }  
  56.   
  57. int Http::Recv(char* data, UINT len )  
  58. {  
  59.     long already_time = 0;  
  60.     struct fd_set fdset;  
  61.     struct timeval timeout;  
  62.     timeout.tv_sec = SELECT_WAIT_TIME;  
  63.     timeout.tv_usec = 0;  
  64.     size_t nRecv = 0;  
  65.     size_t tLen = 0;  
  66.     while(1)  
  67.     {  
  68.         FD_ZERO(&fdset);  
  69.         FD_SET(m_socket, &fdset);  
  70.         int ret = select(m_socket + 1, &fdset, NULL, NULL, &timeout);  
  71.         switch(ret)  
  72.         {  
  73.         case 1:  
  74.             already_time = 0;  
  75.             tLen = recv(m_socket, data + nRecv, len - nRecv, 0);  
  76.             if(tLen <= 0)  
  77.                 return nRecv;  
  78.             nRecv += tLen;  
  79.             if(nRecv == len)  
  80.                 return nRecv;  
  81.             break;  
  82.         case 0:  
  83.             already_time += SELECT_WAIT_TIME;  
  84.             if(already_time >= MAX_WAIT_TIME_FOR_SENDRECV)  
  85.             {  
  86.                 closesocket(m_socket);  
  87.                 return SOCKET_SENDRECV_TIMEOUT;  
  88.             }  
  89.             break;  
  90.         default:  
  91.             return SOCKET_SENDRECV_ERROR;  
  92.         }  
  93.     }  
  94. }  
  95.   
  96. int Http::RecvByLine(char* data, UINT len)  
  97. {  
  98.     long already_time = 0;  
  99.     struct fd_set fdset;  
  100.     struct timeval timeout;  
  101.     timeout.tv_sec = SELECT_WAIT_TIME;  
  102.     timeout.tv_usec = 0;  
  103.     size_t nRecv = 0;  
  104.     size_t tLen = 0;  
  105.     while(1)  
  106.     {  
  107.         if(nRecv >= len - 1)  
  108.         {  
  109.             data[nRecv] = '/0';  
  110.             char tempbuff[2];  
  111.             while(1)  
  112.             {  
  113.                 recv(m_socket, tempbuff, 1, 0);  
  114.                 if(tempbuff[0] == '/n')  
  115.                     break;  
  116.             }  
  117.             return SOCKET_SENDRECV_TOOLONG;  
  118.         }  
  119.         //  
  120.         FD_ZERO(&fdset);  
  121.         FD_SET(m_socket, &fdset);  
  122.         int ret = select(m_socket + 1, &fdset, NULL, NULL, &timeout);  
  123.         switch(ret)  
  124.         {  
  125.         case 1:  
  126.             already_time = 0;  
  127.             tLen = recv(m_socket, data + nRecv, 1, 0);  
  128.             if(tLen <= 0)  
  129.             {  
  130.                 data[nRecv] = '/0';  
  131.                 return SOCKET_SENDRECV_ERROR;  
  132.             }  
  133.             nRecv += tLen;  
  134.             if(data[nRecv - 1] == '/n')  
  135.                 goto L1;  
  136.         case 0:  
  137.             already_time += SELECT_WAIT_TIME;  
  138.             if(already_time >= MAX_WAIT_TIME_FOR_SENDRECV)  
  139.             {  
  140.                 closesocket(m_socket);  
  141.                 return SOCKET_SENDRECV_TIMEOUT;  
  142.             }  
  143.             break;  
  144.         default:  
  145.             return SOCKET_SENDRECV_ERROR;  
  146.         }  
  147.     }  
  148. L1:  
  149.     if(data[nRecv - 2] == '/r')  
  150.     {  
  151.         data[nRecv - 2] = '/0';  
  152.     }  
  153.     else if(data[nRecv - 1] == '/n')  
  154.     {  
  155.         data[nRecv - 1] = '/0';  
  156.     }  
  157.     return SOCKET_SENDRECV_OK;  
  158. }  
  159.   
  160. BOOL Http::Parse( char* data )  
  161. {  
  162.     if(strncmp(data, "GET ", 4) == 0)  
  163.     {  
  164.         m_method = HTTP_METHOD_GET;  
  165.   
  166.         m_page = data;  
  167.         m_page.Cutout("GET /"" ");  
  168.         m_page.Cutout(NULL, "?");  
  169.   
  170.         m_postdata = data;  
  171.         m_postdata.Cutout("?"" ");  
  172.         m_postdata += "&";  
  173.     }  
  174.     else if(strncmp(data, "POST ", 5) == 0)  
  175.     {  
  176.         m_method = HTTP_METHOD_POST;  
  177.   
  178.         m_page = data;  
  179.         m_page.Cutout("POST /"" ");  
  180.     }  
  181.     else if(strncmp(data, "PUT ", 4) == 0)  
  182.     {  
  183.         m_method = HTTP_METHOD_PUT;  
  184.   
  185.         m_page = data;  
  186.         m_page.Cutout("PUT /"" ");  
  187.     }  
  188.     else if(strncmp(data, "Content-Length:", 15) == 0)  
  189.     {  
  190.         sscanf(data, "Content-Length: %d", &m_contentlength);  
  191.     }  
  192.     else if(strncmp(data, "Host:", 5) == 0)  
  193.     {  
  194.         zfqstring tempstr;  
  195.         tempstr = data;  
  196.         tempstr.Cutout("Host: ", NULL);  
  197.         m_hostaddr = tempstr;  
  198.         m_hostaddr.Cutout(NULL, ":");  
  199.         tempstr.Cutout(":", NULL);  
  200.         m_hostport = atoi(tempstr.GetString());  
  201.     }  
  202.     else if(strncmp(data, "Authorization:", 14) == 0)  
  203.     {  
  204.         zfqstring tempstr;  
  205.         tempstr = data;  
  206.         tempstr.Cutout("Authorization: Basic ", NULL);  
  207.         tempstr = Base64::Decode(tempstr);  
  208.   
  209.         m_loginid = tempstr;  
  210.         m_loginpwd = tempstr;  
  211.         m_loginid.Cutout(NULL, ":");  
  212.         m_loginpwd.Cutout(":", NULL);  
  213.     }  
  214.     else if(strcmp(data, "") == 0)  
  215.     {  
  216.         if(m_method == HTTP_METHOD_POST)  
  217.         {  
  218.             char* post_data = (char*)malloc(m_contentlength + 1);  
  219.             memset(post_data, 0, m_contentlength + 1);  
  220.             Recv(post_data, m_contentlength);  
  221.             m_postdata += post_data;  
  222.             free(post_data);  
  223.         }  
  224.         HttpRequestResponse();  
  225.         return FALSE;  
  226.   
  227.     }  
  228.     return TRUE;  
  229. }  
  230.   
  231. BOOL Http::Query()  
  232. {  
  233.     char command[1024];  
  234.     memset(command, 0, 1024);  
  235.     int ret = RecvByLine(command, 1024 - 1);  
  236.   
  237.     if(ret == SOCKET_SENDRECV_OK)  
  238.     {  
  239.         if(!Parse(command))  
  240.         {  
  241.             return FALSE;  
  242.         }  
  243.     }  
  244.     else if(ret == SOCKET_SENDRECV_ERROR)  
  245.     {  
  246.         return FALSE;  
  247.     }  
  248.       
  249.     return TRUE;  
  250. }  
  251.   
  252. BOOL Http::HttpRequestResponse()  
  253. {  
  254.     WebAction* webaction = new FtpWebAction(m_socket, m_id,  
  255.         m_pwd, m_hostaddr, m_hostport, m_postdata, m_page, m_loginid, m_loginpwd);  
  256.     webaction->Response();  
  257.     delete webaction;  
  258.     return TRUE;  
  259. }  

 

HttpSession类主要负责服务器端轮询,并借助于Http完成对客户端的响应

HttpSession.h

  1. #ifndef _HTTPSESSION_H  
  2. #define _HTTPSESSION_H  
  3.   
  4. #include "Http.h"  
  5.   
  6. class HttpSession  
  7. {  
  8. public:  
  9.     HttpSession(SOCKET socket, zfqstring id, zfqstring pwd);  
  10.     virtual ~HttpSession(void);  
  11. public:  
  12.     void LoopResponse();  
  13.   
  14. protected:  
  15.     Http* m_http;  
  16. };  
  17.   
  18. #endif  

HttpSession.cpp

  1. #include "StdAfx.h"  
  2. #include "HttpSession.h"  
  3.   
  4. HttpSession::HttpSession(SOCKET socket, zfqstring id, zfqstring pwd)  
  5. {  
  6.     m_http = new Http(socket, id, pwd);  
  7. }  
  8.   
  9. HttpSession::~HttpSession(void)  
  10. {  
  11.     if(NULL != m_http)  
  12.         delete m_http;  
  13.     m_http = NULL;  
  14. }  
  15.   
  16. void HttpSession::LoopResponse()  
  17. {  
  18.     if(m_http)  
  19.     {  
  20.         while(1)  
  21.         {  
  22.             if(!m_http->Query())  
  23.                 break;  
  24.         }  
  25.     }  
  26. }  

WebAction类是服务器和客户端进行cgi交互的基类

WebAction.h

  1. #ifndef _WEBACTION_H  
  2. #define _WEBACTION_H  
  3.   
  4. #include "zfqstring.h"  
  5. #include "Constant.h"  
  6. #include <WinSock2.h>  
  7.   
  8. class WebAction  
  9. {  
  10. public:  
  11.     WebAction();  
  12.     virtual ~WebAction(void);  
  13. public:  
  14.     virtual const char* Body(){return m_body.GetString();}  
  15.     virtual void Response();  
  16.     virtual int Send(const char* data, size_t len);  
  17. protected:  
  18.     //  
  19.     zfqstring m_hostaddr;  
  20.     unsigned short m_hostport;  
  21.     //  
  22.     zfqstring m_id;  
  23.     zfqstring m_pwd;  
  24.     //  
  25.     zfqstring m_loginid;  
  26.     zfqstring m_loginpwd;  
  27.     //  
  28.     zfqstring m_postdata;  
  29.     zfqstring m_page;  
  30.     //  
  31.     zfqstring m_body;  
  32.     //  
  33.     SOCKET m_socket;  
  34. };  
  35.   
  36. #endif  

WebAction.cpp

  1. #include "StdAfx.h"  
  2. #include "WebAction.h"  
  3.   
  4. WebAction::WebAction()  
  5. {  
  6.   
  7. }  
  8.   
  9. WebAction::~WebAction(void)  
  10. {  
  11. }  
  12.   
  13. int WebAction::Send(const char* data, size_t len )  
  14. {  
  15.     long already_time = 0;  
  16.     struct fd_set fdset;  
  17.     struct timeval timeout;  
  18.     timeout.tv_sec = SELECT_WAIT_TIME;  
  19.     timeout.tv_usec = 0;  
  20.     size_t nSend = 0;  
  21.     size_t tLen = 0;  
  22.     while(1)  
  23.     {  
  24.         FD_ZERO(&fdset);  
  25.         FD_SET(m_socket, &fdset);  
  26.         int ret = select(m_socket + 1, NULL, &fdset, NULL, &timeout);  
  27.         switch(ret)  
  28.         {  
  29.         case 1:  
  30.             already_time = 0;  
  31.             tLen = send(m_socket, data, len - nSend, 0);  
  32.             nSend += tLen;  
  33.             if(nSend == len)  
  34.                 return SOCKET_SENDRECV_OK;  
  35.             break;  
  36.         case 0:  
  37.             already_time += SELECT_WAIT_TIME;  
  38.             if(already_time >= MAX_WAIT_TIME_FOR_SENDRECV)  
  39.             {  
  40.                 closesocket(m_socket);  
  41.                 return SOCKET_SENDRECV_TIMEOUT;  
  42.             }  
  43.             break;  
  44.         default:  
  45.             return SOCKET_SENDRECV_ERROR;  
  46.         }  
  47.     }  
  48. }  
  49.   
  50. void WebAction::Response()  
  51. {  
  52.       
  53. }  

FtpWebAction类继承自WebAction,专门用于传输文件

FtpWebAction.h

  1. #ifndef _FTPWEBACTION_H  
  2. #define _FTPWEBACTION_H  
  3.   
  4. #include "webaction.h"  
  5.   
  6. class FtpWebAction :  
  7.     public WebAction  
  8. {  
  9. public:  
  10.     FtpWebAction(SOCKET m_socket, zfqstring m_id, zfqstring m_pwd,  
  11.         zfqstring m_hostaddr, unsigned m_hostport, zfqstring m_postdata,  
  12.         zfqstring m_page, zfqstring m_loginid, zfqstring m_loginpwd);  
  13.     virtual ~FtpWebAction(void);  
  14. public:  
  15.     void Response();  
  16. private:  
  17.     void _handle_specialstr(char* str);  
  18.     int _parse_parameter(const char* postdata, const char* keyname, char* htmlStr);  
  19.     void _format_okheader(const char* result, const char* type, int len, char* htmlStr);  
  20.     void _format_okheader(const char* result, const char* type, const char* len, const char* filename, char* htmlStr);  
  21. };  
  22.   
  23. #endif  

FtpWebAction.cpp

  1. #include "StdAfx.h"  
  2. #include "FtpWebAction.h"  
  3.   
  4. #include "PathUtil.h"  
  5. #include "IoUtil.h"  
  6.   
  7. #include "imgrc.h"  
  8.   
  9. #define MAX_PATH_LENGTH 256  
  10.   
  11. #define AUTHORIZATION_HTML_401 /  
  12. "HTTP/1.1 401 Unauthorized/r/n"/  
  13. "WWW-Authenticate: Basic Realm=/"Mini Webserver For Ftp Login/"/r/n"/  
  14. "Server: MiniWebserver/r/n"/  
  15. "Content-Type: text/html/r/n"/  
  16. "/r/n"/  
  17. "<html><head><title>401 Unauthorized</title></head><body><h1>401 Unauthorized</h1><hr>Sorry, you are unauthorized.</body></html>/r/n"/  
  18. "/r/n"  
  19.   
  20. #define VERSIONINFO_HTML /  
  21. "<hr><br>Mini Webserver For Ftp<br>"/  
  22. "Copyright (C) 2009 Yysdsyl <a href="/" mce_href="/""mailto:yysdsyl@qq.com/">yysdsyl@qq.com</a>"  
  23.   
  24. #define ERRORINFO_HTML_404 /  
  25. "HTTP/1.1 404 Error/r/n"/  
  26. "Server: MiniWebserver/r/n"/  
  27. "Content-Type: text/html/r/n"/  
  28. "/r/n"/  
  29. "<html><head><title>404 Error</title></head><body><h1>404 Error</h1><hr>Not Found the Web.</body></html>/r/n"/  
  30. "/r/n"  
  31.   
  32. #define ERRORINFO_HTML_500 /  
  33. "HTTP/1.1 500 OK/r/n"/  
  34. "Server: MiniWebserver/r/n"/  
  35. "Content-Type: text/html/r/n"/  
  36. "/r/n"/  
  37. "<html><head><title>500 Error</title></head><body><h1>500 Error</h1><hr>Server Error. Please Reload.</body></html>/r/n"/  
  38. "/r/n"  
  39.   
  40. #define OKHEADER_HTML_200 /  
  41. "HTTP/1.1 %s/r/n"/  
  42. "pragma: no-cache/r/n"/  
  43. "Connection: Keep-Alive/r/n"/  
  44. "Server: MiniWebserver/r/n"/  
  45. "Content-Type: text/html/r/n"/  
  46. "/r/n"  
  47.   
  48. #define OKHEADER_DOWNLOAD_200 /  
  49. "HTTP/1.1 200 OK/r/n"/  
  50. "pragma: no-cache/r/n"/  
  51. "Connection: Keep-Alive/r/n"/  
  52. "Server: MiniWebserver/r/n"/  
  53. "Content-Disposition: attachment;filename=test.dat/r/n"/  
  54. "Content-Type: application/octet-stream/r/n"/  
  55. "/r/n"  
  56.   
  57. #define HEADERMASK_HTML /  
  58. "HTTP/1.1 %s/r/n"/  
  59. "pragma: no-cache/r/n"/  
  60. "Connection: Keep-Alive/r/n"/  
  61. "Server: MiniWebserver/r/n"/  
  62. "Content-Type: %s/r/n"/  
  63. "Content-Length: %ld/r/n"/  
  64. "/r/n"  
  65.   
  66. #define HEADERMASK_SPECIAL_HTML /  
  67. "HTTP/1.1 %s/r/n"/  
  68. "pragma: no-cache/r/n"/  
  69. "Connection: Keep-Alive/r/n"/  
  70. "Server: MiniWebserver/r/n"/  
  71. "Content-Type: %s/r/n"/  
  72. "Content-Disposition: attachment;filename=%s/r/n"/  
  73. "Content-Length: %s/r/n"/  
  74. "/r/n"  
  75.   
  76.   
  77. FtpWebAction::FtpWebAction(SOCKET m_socket, zfqstring m_id, zfqstring m_pwd,  
  78.                            zfqstring m_hostaddr, unsigned m_hostport, zfqstring m_postdata,  
  79.                            zfqstring m_page, zfqstring m_loginid, zfqstring m_loginpwd)  
  80. {  
  81.     this->m_socket = m_socket;  
  82.     this->m_id = m_id;  
  83.     this->m_pwd = m_pwd;  
  84.     this->m_hostaddr = m_hostaddr;  
  85.     this->m_hostport = m_hostport;  
  86.     this->m_postdata = m_postdata;  
  87.     this->m_page = m_page;  
  88.     this->m_loginid = m_loginid;  
  89.     this->m_loginpwd = m_loginpwd;  
  90. }  
  91.   
  92. FtpWebAction::~FtpWebAction(void)  
  93. {  
  94. }  
  95.   
  96. void FtpWebAction::Response()  
  97. {  
  98.     char htmlStr[1024];  
  99.     memset(htmlStr, 0, 1024);  
  100.     if(m_id == m_loginid && m_pwd == m_loginpwd)  
  101.     {  
  102.         if((m_page == "") || (m_page == "list.html"))  
  103.         {  
  104.             zfqstring fileListHtml = "";  
  105.   
  106.             char ftpPath[MAX_PATH_LENGTH];  
  107.             memset(ftpPath, 0, MAX_PATH_LENGTH);  
  108.             _parse_parameter(m_postdata.GetString(), "path", ftpPath);  
  109.   
  110.             char szDir[MAX_PATH_LENGTH];  
  111.             GetCurrentDirectory(MAX_PATH_LENGTH, szDir);  
  112.             zfqstring szHomeDir = szDir;  
  113.   
  114.             PathUtil pathutil(ftpPath);  
  115.             if(pathutil.m_existflag == 0)  
  116.             {  
  117.                 zfqstring fullpath = szHomeDir;  
  118.                 fullpath += "/";  
  119.                 fullpath += pathutil.GetFullPath();  
  120.   
  121.                 IoUtil ioutil(fullpath.GetString());  
  122.                 FILELIST_VECTOR lv;  
  123.                 ioutil.Dir(lv);  
  124.                 char tmpHeader[1024];  
  125.                 sprintf(tmpHeader, "<h2>Index Of %s/</h2>", ftpPath);  
  126.                 fileListHtml += tmpHeader;  
  127.                 fileListHtml += "<hr>";  
  128.                 fileListHtml += "<table>";  
  129.                 fileListHtml += "<tr><td></td><td><font color=/"red/">Name</font></td><td align=/"right/"><font color=/"red/">   Size   </font></td><td><font color=/"red/">Last Modified Time</font></td></tr>";  
  130.                 for(size_t i = 0; i < lv.size(); i++)  
  131.                 {  
  132.                     zfqstring tmpStr = ftpPath;  
  133.                     tmpStr += "/";  
  134.                     tmpStr += lv[i].filename;  
  135.                     PathUtil tmpPathUtil(tmpStr.GetString(), FMT_UNIX);  
  136.                       
  137.                     zfqstring urlencodepath = "";  
  138.                     const char* tmpChar = tmpPathUtil.GetFullPath();  
  139.                     for(size_t j = 0; j < strlen(tmpChar); j++)  
  140.                     {  
  141.                         char urlencodestr[4];  
  142.                         unsigned char cc = tmpChar[j];  
  143.                         sprintf(urlencodestr, "%%%02X", cc);  
  144.                         urlencodepath += urlencodestr;  
  145.                     }  
  146.   
  147.                     char tableHtml[1024];  
  148.   
  149.                     if(strcmp(lv[i].attribute, "DIR") == 0)  
  150.                     {  
  151.                         if(strcmp(lv[i].filename, "..") == 0)  
  152.                         {  
  153.                             sprintf(tableHtml, "<tr><td colspan=/"4/"><a href="/" mce_href="/""list.html?path=%s/"><img src="/" mce_src="/""up.gif/" border=/"0/">Parent Directory</a></td></tr>", urlencodepath.GetString());  
  154.                         }  
  155.                         else if(strcmp(lv[i].filename, ".") == 0)  
  156.                         {  
  157.                             sprintf(tableHtml, "%s""");  
  158.                         }  
  159.                         else  
  160.                         {  
  161.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""forder.gif/"></td><td><a href="/" mce_href="/""list.html?path=%s/"><b>%s/</b></a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  162.                                 urlencodepath.GetString(), lv[i].filename, "-", lv[i].lastmodifiedtime);  
  163.                         }  
  164.                     }  
  165.                     else  
  166.                     {  
  167.                         zfqstring tmpFileName = lv[i].filename;  
  168.                         if(tmpFileName.EndWith(".avi") || tmpFileName.EndWith(".AVI"))  
  169.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""avi.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  170.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  171.                         else if(tmpFileName.EndWith(".bat") || tmpFileName.EndWith(".BAT") || tmpFileName.EndWith(".cmd") || tmpFileName.EndWith(".CMD"))  
  172.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""cmd.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  173.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  174.                         else if(tmpFileName.EndWith(".bmp") || tmpFileName.EndWith(".BMP"))  
  175.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""bmp.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  176.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  177.                         else if(tmpFileName.EndWith(".chm") || tmpFileName.EndWith(".CHM"))  
  178.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""chm.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  179.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  180.                         else if(tmpFileName.EndWith(".dll") || tmpFileName.EndWith(".DLL"))  
  181.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""dll.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  182.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  183.                         else if(tmpFileName.EndWith(".doc") || tmpFileName.EndWith(".DOC"))  
  184.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""doc.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  185.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  186.                         else if(tmpFileName.EndWith(".exe") || tmpFileName.EndWith(".EXE"))  
  187.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""exe.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  188.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  189.                         else if(tmpFileName.EndWith(".html") || tmpFileName.EndWith(".HTML") || tmpFileName.EndWith(".htm") || tmpFileName.EndWith(".HTM"))  
  190.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""html.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  191.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  192.                         else if(tmpFileName.EndWith(".iso") || tmpFileName.EndWith(".ISO"))  
  193.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""iso.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  194.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  195.                         else if(tmpFileName.EndWith(".jpg") || tmpFileName.EndWith(".JPG") || tmpFileName.EndWith(".jpeg") || tmpFileName.EndWith(".JPEG"))  
  196.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""jpg.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  197.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  198.                         else if(tmpFileName.EndWith(".mp3") || tmpFileName.EndWith(".MP3"))  
  199.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""mp3.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  200.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  201.                         else if(tmpFileName.EndWith(".pdf") || tmpFileName.EndWith(".PDF"))  
  202.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""pdf.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  203.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  204.                         else if(tmpFileName.EndWith(".png") || tmpFileName.EndWith(".PNG") || tmpFileName.EndWith(".gif") || tmpFileName.EndWith(".GIF"))  
  205.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""png.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  206.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  207.                         else if(tmpFileName.EndWith(".ppt") || tmpFileName.EndWith(".PPT"))  
  208.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""ppt.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  209.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  210.                         else if(tmpFileName.EndWith(".rar") || tmpFileName.EndWith(".RAR") || tmpFileName.EndWith(".zip") || tmpFileName.EndWith(".ZIP"))  
  211.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""rar.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  212.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  213.                         else if(tmpFileName.EndWith(".rm") || tmpFileName.EndWith(".RM") || tmpFileName.EndWith(".rmvb") || tmpFileName.EndWith(".RMVB"))  
  214.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""rm.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  215.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  216.                         else if(tmpFileName.EndWith(".txt") || tmpFileName.EndWith(".TXT"))  
  217.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""txt.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  218.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  219.                         else if(tmpFileName.EndWith(".wmv") || tmpFileName.EndWith(".WMV"))  
  220.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""wmv.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  221.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  222.                         else if(tmpFileName.EndWith(".xls") || tmpFileName.EndWith(".XLS"))  
  223.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""xls.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  224.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  225.                         else if(tmpFileName.EndWith(".xml") || tmpFileName.EndWith(".XML"))  
  226.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""xml.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  227.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  228.                         else  
  229.                             sprintf(tableHtml, "<tr><td><img src="/" mce_src="/""unknown.gif/"></td><td><a href="/" mce_href="/""download.html?path=%s/">%s</a></td><td align=/"right/">   %s   </td><td>%s</td></tr>",   
  230.                             urlencodepath.GetString(), lv[i].filename, lv[i].filesize, lv[i].lastmodifiedtime);  
  231.   
  232.                     }  
  233.                     fileListHtml += tableHtml;  
  234.                 }  
  235.                 fileListHtml += "</table>";  
  236.                   
  237.                 m_body = OKHEADER_HTML_200;  
  238.                 m_body += "<html><head><title>Mini Webserver For Ftp</title></head><body><h1><font color=/"red/">Mini Webserver For Ftp - </font><font color=/"green/">";  
  239.                 m_body += m_id;  
  240.                 m_body += "</font><hr>";  
  241.                 m_body += fileListHtml;  
  242.                 m_body += VERSIONINFO_HTML"</body></html>/r/n/r/n";  
  243.             }  
  244.             else  
  245.             {  
  246.                 m_body = AUTHORIZATION_HTML_401;  
  247.             }  
  248.         }  
  249.         else if(m_page == (zfqstring)"up.gif")  
  250.         {  
  251.             _format_okheader("200 OK","image/gif"sizeof(UP_ICONDATA),htmlStr);  
  252.             Send(htmlStr, strlen(htmlStr));  
  253.             Send((char*)UP_ICONDATA, sizeof(UP_ICONDATA));  
  254.             return;  
  255.         }  
  256.         else if(m_page == (zfqstring)"forder.gif")  
  257.         {  
  258.             _format_okheader("200 OK","image/gif"sizeof(FOLDER_ICONDATA),htmlStr);  
  259.             Send(htmlStr, strlen(htmlStr));  
  260.             Send((char*)FOLDER_ICONDATA, sizeof(FOLDER_ICONDATA));  
  261.             return;  
  262.         }  
  263.         else if(m_page == (zfqstring)"unknown.gif")  
  264.         {  
  265.             _format_okheader("200 OK","image/gif"sizeof(UNKNOWN_ICONDATA),htmlStr);  
  266.             Send(htmlStr, strlen(htmlStr));  
  267.             Send((char*)UNKNOWN_ICONDATA, sizeof(UNKNOWN_ICONDATA));  
  268.             return;  
  269.         }  
  270.         else if(m_page == (zfqstring)"avi.gif")  
  271.         {  
  272.             _format_okheader("200 OK","image/gif"sizeof(AVI_ICONDATA),htmlStr);  
  273.             Send(htmlStr, strlen(htmlStr));  
  274.             Send((char*)AVI_ICONDATA, sizeof(AVI_ICONDATA));  
  275.             return;  
  276.         }  
  277.         else if(m_page == (zfqstring)"bat.gif")  
  278.         {  
  279.             _format_okheader("200 OK","image/gif"sizeof(BAT_ICONDATA),htmlStr);  
  280.             Send(htmlStr, strlen(htmlStr));  
  281.             Send((char*)BAT_ICONDATA, sizeof(BAT_ICONDATA));  
  282.             return;  
  283.         }  
  284.         else if(m_page == (zfqstring)"bmp.gif")  
  285.         {  
  286.             _format_okheader("200 OK","image/gif"sizeof(BMP_ICONDATA),htmlStr);  
  287.             Send(htmlStr, strlen(htmlStr));  
  288.             Send((char*)BMP_ICONDATA, sizeof(BMP_ICONDATA));  
  289.             return;  
  290.         }  
  291.         else if(m_page == (zfqstring)"chm.gif")  
  292.         {  
  293.             _format_okheader("200 OK","image/gif"sizeof(CHM_ICONDATA),htmlStr);  
  294.             Send(htmlStr, strlen(htmlStr));  
  295.             Send((char*)CHM_ICONDATA, sizeof(CHM_ICONDATA));  
  296.             return;  
  297.         }  
  298.         else if(m_page == (zfqstring)"dll.gif")  
  299.         {  
  300.             _format_okheader("200 OK","image/gif"sizeof(DLL_ICONDATA),htmlStr);  
  301.             Send(htmlStr, strlen(htmlStr));  
  302.             Send((char*)DLL_ICONDATA, sizeof(DLL_ICONDATA));  
  303.             return;  
  304.         }  
  305.         else if(m_page == (zfqstring)"doc.gif")  
  306.         {  
  307.             _format_okheader("200 OK","image/gif"sizeof(DOC_ICONDATA),htmlStr);  
  308.             Send(htmlStr, strlen(htmlStr));  
  309.             Send((char*)DOC_ICONDATA, sizeof(DOC_ICONDATA));  
  310.             return;  
  311.         }  
  312.         else if(m_page == (zfqstring)"exe.gif")  
  313.         {  
  314.             _format_okheader("200 OK","image/gif"sizeof(EXE_ICONDATA),htmlStr);  
  315.             Send(htmlStr, strlen(htmlStr));  
  316.             Send((char*)EXE_ICONDATA, sizeof(EXE_ICONDATA));  
  317.             return;  
  318.         }  
  319.         else if(m_page == (zfqstring)"html.gif")  
  320.         {  
  321.             _format_okheader("200 OK","image/gif"sizeof(HTML_ICONDATA),htmlStr);  
  322.             Send(htmlStr, strlen(htmlStr));  
  323.             Send((char*)HTML_ICONDATA, sizeof(HTML_ICONDATA));  
  324.             return;  
  325.         }  
  326.         else if(m_page == (zfqstring)"up.gif")  
  327.         {  
  328.             _format_okheader("200 OK","image/gif"sizeof(UP_ICONDATA),htmlStr);  
  329.             Send(htmlStr, strlen(htmlStr));  
  330.             Send((char*)UP_ICONDATA, sizeof(UP_ICONDATA));  
  331.             return;  
  332.         }  
  333.         else if(m_page == (zfqstring)"iso.gif")  
  334.         {  
  335.             _format_okheader("200 OK","image/gif"sizeof(ISO_ICONDATA),htmlStr);  
  336.             Send(htmlStr, strlen(htmlStr));  
  337.             Send((char*)ISO_ICONDATA, sizeof(ISO_ICONDATA));  
  338.             return;  
  339.         }  
  340.         else if(m_page == (zfqstring)"jpg.gif")  
  341.         {  
  342.             _format_okheader("200 OK","image/gif"sizeof(JPG_ICONDATA),htmlStr);  
  343.             Send(htmlStr, strlen(htmlStr));  
  344.             Send((char*)JPG_ICONDATA, sizeof(JPG_ICONDATA));  
  345.             return;  
  346.         }  
  347.         else if(m_page == (zfqstring)"mp3.gif")  
  348.         {  
  349.             _format_okheader("200 OK","image/gif"sizeof(MP3_ICONDATA),htmlStr);  
  350.             Send(htmlStr, strlen(htmlStr));  
  351.             Send((char*)MP3_ICONDATA, sizeof(MP3_ICONDATA));  
  352.             return;  
  353.         }  
  354.         else if(m_page == (zfqstring)"pdf.gif")  
  355.         {  
  356.             _format_okheader("200 OK","image/gif"sizeof(PDF_ICONDATA),htmlStr);  
  357.             Send(htmlStr, strlen(htmlStr));  
  358.             Send((char*)PDF_ICONDATA, sizeof(PDF_ICONDATA));  
  359.             return;  
  360.         }  
  361.         else if(m_page == (zfqstring)"png.gif")  
  362.         {  
  363.             _format_okheader("200 OK","image/gif"sizeof(PNG_ICONDATA),htmlStr);  
  364.             Send(htmlStr, strlen(htmlStr));  
  365.             Send((char*)PNG_ICONDATA, sizeof(PNG_ICONDATA));  
  366.             return;  
  367.         }  
  368.         else if(m_page == (zfqstring)"ppt.gif")  
  369.         {  
  370.             _format_okheader("200 OK","image/gif"sizeof(PPT_ICONDATA),htmlStr);  
  371.             Send(htmlStr, strlen(htmlStr));  
  372.             Send((char*)PPT_ICONDATA, sizeof(PPT_ICONDATA));  
  373.             return;  
  374.         }  
  375.         else if(m_page == (zfqstring)"rar.gif")  
  376.         {  
  377.             _format_okheader("200 OK","image/gif"sizeof(RAR_ICONDATA),htmlStr);  
  378.             Send(htmlStr, strlen(htmlStr));  
  379.             Send((char*)RAR_ICONDATA, sizeof(RAR_ICONDATA));  
  380.             return;  
  381.         }  
  382.         else if(m_page == (zfqstring)"rm.gif")  
  383.         {  
  384.             _format_okheader("200 OK","image/gif"sizeof(RM_ICONDATA),htmlStr);  
  385.             Send(htmlStr, strlen(htmlStr));  
  386.             Send((char*)RM_ICONDATA, sizeof(RM_ICONDATA));  
  387.             return;  
  388.         }  
  389.         else if(m_page == (zfqstring)"txt.gif")  
  390.         {  
  391.             _format_okheader("200 OK","image/gif"sizeof(TXT_ICONDATA),htmlStr);  
  392.             Send(htmlStr, strlen(htmlStr));  
  393.             Send((char*)TXT_ICONDATA, sizeof(TXT_ICONDATA));  
  394.             return;  
  395.         }  
  396.         else if(m_page == (zfqstring)"wmv.gif")  
  397.         {  
  398.             _format_okheader("200 OK","image/gif"sizeof(WMV_ICONDATA),htmlStr);  
  399.             Send(htmlStr, strlen(htmlStr));  
  400.             Send((char*)WMV_ICONDATA, sizeof(WMV_ICONDATA));  
  401.             return;  
  402.         }  
  403.         else if(m_page == (zfqstring)"xls.gif")  
  404.         {  
  405.             _format_okheader("200 OK","image/gif"sizeof(XLS_ICONDATA),htmlStr);  
  406.             Send(htmlStr, strlen(htmlStr));  
  407.             Send((char*)XLS_ICONDATA, sizeof(XLS_ICONDATA));  
  408.             return;  
  409.         }  
  410.         else if(m_page == (zfqstring)"xml.gif")  
  411.         {  
  412.             _format_okheader("200 OK","image/gif"sizeof(XML_ICONDATA),htmlStr);  
  413.             Send(htmlStr, strlen(htmlStr));  
  414.             Send((char*)XML_ICONDATA, sizeof(XML_ICONDATA));  
  415.             return;  
  416.         }  
  417.         else if(m_page == (zfqstring)"download.html")  
  418.         {  
  419.             char ftpPath[MAX_PATH_LENGTH];  
  420.             memset(ftpPath,0,MAX_PATH_LENGTH);  
  421.             _parse_parameter(m_postdata.GetString(), "path", ftpPath);  
  422.   
  423.             char szDir[MAX_PATH_LENGTH];  
  424.             GetCurrentDirectory(MAX_PATH_LENGTH, szDir);  
  425.             zfqstring szHomeDir = szDir;  
  426.   
  427.             PathUtil pathutil(ftpPath);  
  428.             if(pathutil.m_existflag == 0)  
  429.             {  
  430.                 zfqstring fullpath = szHomeDir;  
  431.                 fullpath += "/";  
  432.                 fullpath += pathutil.GetFullPath();  
  433.   
  434.                 IoUtil ioutil(fullpath.GetString());  
  435.                 char filesizeStr[32];  
  436.                 memset(filesizeStr, 0, 32);  
  437.                 ioutil.GetFileSize(filesizeStr);  
  438.   
  439.                 zfqstring downloaditem = ftpPath;  
  440.                 downloaditem.ShiftLowCase();  
  441.                 char savename[MAX_PATH_LENGTH];  
  442.                 strcpy(savename, pathutil.GetLastElement());  
  443.                 _format_okheader("200 OK""application/octet-stream", filesizeStr, savename, htmlStr);  
  444. //                 if(downloaditem.EndWith(".asf"))  
  445. //                     _format_okheader("200 OK", "video/x-ms-asf", filesizeStr, savename, htmlStr);  
  446. //                 else if(downloaditem.EndWith(".avi"))  
  447. //                     _format_okheader("200 OK", "video/x-msvideo", filesizeStr, savename, htmlStr);  
  448. //                 else if(downloaditem.EndWith(".asp"))  
  449. //                     _format_okheader("200 OK", "text/asp", filesizeStr, savename, htmlStr);  
  450. //                 else if(downloaditem.EndWith(".bmp"))  
  451. //                     _format_okheader("200 OK", "application/x-bmp", filesizeStr, savename, htmlStr);  
  452. //                 else if(downloaditem.EndWith(".css"))  
  453. //                     _format_okheader("200 OK", "text/css", filesizeStr, savename, htmlStr);  
  454. //                 else if(downloaditem.EndWith(".dll"))  
  455. //                     _format_okheader("200 OK", "application/x-msdownload", filesizeStr, savename, htmlStr);  
  456. //                 else if(downloaditem.EndWith(".doc"))  
  457. //                     _format_okheader("200 OK", "application/msword", filesizeStr, savename, htmlStr);  
  458. //                 else if(downloaditem.EndWith(".exe"))  
  459. //                     _format_okheader("200 OK", "application/x-msdownload", filesizeStr, savename, htmlStr);  
  460. //                 else if(downloaditem.EndWith(".ico"))  
  461. //                     _format_okheader("200 OK", "image/x-icon", filesizeStr, savename, htmlStr);  
  462. //                 else if(downloaditem.EndWith(".jpg") || downloaditem.EndWith(".jpeg"))  
  463. //                     _format_okheader("200 OK", "image/jpeg", filesizeStr, savename, htmlStr);  
  464. //                 else if(downloaditem.EndWith(".js"))  
  465. //                     _format_okheader("200 OK", "application/x-javascript", filesizeStr, savename, htmlStr);  
  466. //                 else if(downloaditem.EndWith(".mdb"))  
  467. //                     _format_okheader("200 OK", "application/x-mdb", filesizeStr, savename, htmlStr);  
  468. //                 else if(downloaditem.EndWith(".mp3"))  
  469. //                     _format_okheader("200 OK", "audio/mp3", filesizeStr, savename, htmlStr);  
  470. //                 else if(downloaditem.EndWith(".mp4"))  
  471. //                     _format_okheader("200 OK", "video/mpeg4", filesizeStr, savename, htmlStr);  
  472. //                 else if(downloaditem.EndWith(".mpg") || downloaditem.EndWith(".mpeg"))  
  473. //                     _format_okheader("200 OK", "video/mpg", filesizeStr, savename, htmlStr);  
  474. //                 else if(downloaditem.EndWith(".pdf"))  
  475. //                     _format_okheader("200 OK", "application/pdf", filesizeStr, savename, htmlStr);  
  476. //                 else if(downloaditem.EndWith(".png"))  
  477. //                     _format_okheader("200 OK", "image/png", filesizeStr, savename, htmlStr);  
  478. //                 else if(downloaditem.EndWith(".ppm"))  
  479. //                     _format_okheader("200 OK", "application/x-ppm", filesizeStr, savename, htmlStr);  
  480. //                 else if(downloaditem.EndWith(".ppt"))  
  481. //                     _format_okheader("200 OK", "application/vnd.ms-powerpoint", filesizeStr, savename, htmlStr);  
  482. //                 else if(downloaditem.EndWith(".rm") || downloaditem.EndWith(".rmvb"))  
  483. //                     _format_okheader("200 OK", "application/vnd.rn-realmedia", filesizeStr, savename, htmlStr);  
  484. //                 else if(downloaditem.EndWith(".tif") || downloaditem.EndWith(".tiff"))  
  485. //                     _format_okheader("200 OK", "image/tiff", filesizeStr, savename, htmlStr);  
  486. //                 else if(downloaditem.EndWith(".txt") || downloaditem.EndWith(".c") || downloaditem.EndWith(".h") ||  
  487. //                     downloaditem.EndWith(".cpp") || downloaditem.EndWith(".py") || downloaditem.EndWith(".php"))  
  488. //                     _format_okheader("200 OK", "text/plain", filesizeStr, savename, htmlStr);  
  489. //                 else if(downloaditem.EndWith(".wav"))  
  490. //                     _format_okheader("200 OK", "audio/wav", filesizeStr, savename, htmlStr);  
  491. //                 else if(downloaditem.EndWith(".wmv"))  
  492. //                     _format_okheader("200 OK", "video/x-ms-wmv", filesizeStr, savename, htmlStr);  
  493. //                 else if(downloaditem.EndWith(".xls"))  
  494. //                     _format_okheader("200 OK", "application/vnd.ms-excel", filesizeStr, savename, htmlStr);  
  495. //                 else if(downloaditem.EndWith(".gif"))  
  496. //                     _format_okheader("200 OK", "image/gif", filesizeStr, savename, htmlStr);  
  497. //                 else if(downloaditem.EndWith(".htm") || downloaditem.EndWith(".html"))  
  498. //                     _format_okheader("200 OK", "text/html", filesizeStr, savename, htmlStr);  
  499. //                 else  
  500. //                     _format_okheader("200 OK", "application/octet-stream", filesizeStr, savename, htmlStr);  
  501.   
  502.                 Send(htmlStr, strlen(htmlStr));  
  503.                 ioutil.SendFile(m_socket, 0);  
  504.                 return;  
  505.             }  
  506.             else  
  507.             {  
  508.                 m_body = AUTHORIZATION_HTML_401;  
  509.             }  
  510.         }  
  511.         else  
  512.         {  
  513.             m_body = ERRORINFO_HTML_404;  
  514.         }  
  515.     }  
  516.     else  
  517.     {  
  518.         m_body = AUTHORIZATION_HTML_401;  
  519.     }  
  520.   
  521.     char a[1024];  
  522.     _parse_parameter("&id=10&pwd=中文""pwd", a);  
  523.   
  524.     Send(m_body.GetString(), m_body.GetLength());  
  525. }  
  526.   
  527. void FtpWebAction::_handle_specialstr(char* str )  
  528. {  
  529.       
  530.     int len = strlen(str) + 1;  
  531.     for(int i = 0; i< len; i++)  
  532.     {  
  533.         if(str[i] == '+')  
  534.         {  
  535.             str[i] = ' ';  
  536.         }  
  537.         else if(str[i] == '%')  
  538.         {  
  539.             char temp[5];  
  540.             memset(temp, 0, 5);  
  541.             unsigned char c;  
  542.             sprintf(temp, "%c%c", str[i + 1], str[i + 2]);  
  543.             c = strtol(temp, NULL, 16);  
  544.             str[i] = c;  
  545.             for(int j = i + 3; j < len; j++)  
  546.             {  
  547.                 str[j - 2] = str[j];  
  548.             }  
  549.             len -= 2;  
  550.         }  
  551.     }  
  552. }  
  553.   
  554. int FtpWebAction::_parse_parameter(const char* postdata,const char* keyname, char* htmlStr)  
  555. {  
  556.     size_t i;  
  557.     char* p = NULL;  
  558.     size_t key_len = strlen(keyname);  
  559.     size_t postdata_len = strlen(postdata);  
  560.     char* szTemp = (char*)malloc(postdata_len + 1);  
  561.     memset(szTemp, 0, postdata_len + 1);  
  562.     p = (char*)strstr(postdata, keyname);  
  563.     if(p != NULL)  
  564.     {  
  565.         if(postdata[p - postdata + key_len] != '=')  
  566.         {  
  567.             free(szTemp);  
  568.             return -1;  
  569.         }  
  570.         i = 0;  
  571.         while(1)  
  572.         {  
  573.             if((postdata[p - postdata + key_len + i + 1] != '&') &&  
  574.                 (postdata[p - postdata + key_len + i + 1] != '/0'))  
  575.             {  
  576.                 szTemp[i] = postdata[p - postdata + key_len + i + 1];  
  577.                 i++;  
  578.             }  
  579.             else  
  580.             {  
  581.                 break;  
  582.             }  
  583.         }  
  584.         szTemp[i] = '/0';  
  585.     }  
  586.     else  
  587.     {  
  588.         free(szTemp);  
  589.         return -1;  
  590.     }  
  591.   
  592.     if((htmlStr != NULL))  
  593.     {  
  594.         _handle_specialstr(szTemp);  
  595.         strcpy(htmlStr, szTemp);  
  596.     }  
  597.     else  
  598.     {  
  599.         free(szTemp);  
  600.         return -1;  
  601.     }  
  602.     free(szTemp);  
  603.     return 0;  
  604. }  
  605.   
  606. void FtpWebAction::_format_okheader(const char* result, const char* type, int len, char* htmlStr )  
  607. {  
  608.     sprintf(htmlStr, HEADERMASK_HTML, result, type, len);  
  609. }  
  610.   
  611. void FtpWebAction::_format_okheader(const char* result, const char* type, const char* len, const char* filename, char* htmlStr )  
  612. {  
  613.     sprintf(htmlStr, HEADERMASK_SPECIAL_HTML, result, type, filename, len);  
  614. }  

MiniWebserver类主要负责启动webserver

MiniWebserver.h

  1. #ifndef _MINIWEBSERVER_H  
  2. #define _MINIWEBSERVER_H  
  3.   
  4. #include <WinSock2.h>  
  5. #include "zfqstring.h"  
  6.   
  7. class MiniWebserver  
  8. {  
  9. public:  
  10.     MiniWebserver(void);  
  11.     virtual ~MiniWebserver(void);  
  12. public:  
  13.     void Run(unsigned short listenport, zfqstring id = "anonymous", zfqstring pwd = "");  
  14.     void Stop();  
  15. protected:  
  16.     SOCKET m_listen;  
  17.     HANDLE m_stopevent;  
  18. };  
  19.   
  20. typedef struct    
  21. {  
  22.     SOCKET m_sessionsocket;  
  23.     char m_id[30];  
  24.     char m_pwd[30];  
  25. }HttpSessionHandleParam;  
  26.   
  27. #endif  

MiniWebserver.cpp

  1. #include "StdAfx.h"  
  2. #include "MiniWebserver.h"  
  3. #include "HttpSession.h"  
  4. #include <process.h>  
  5.   
  6. static unsigned __stdcall HttpSessionHandleThread(void* lParam)  
  7. {  
  8.     HttpSessionHandleParam* hsParam = (HttpSessionHandleParam*)lParam;  
  9.     HttpSession* pHS = new HttpSession(hsParam->m_sessionsocket, (zfqstring)hsParam->m_id, (zfqstring)hsParam->m_pwd);  
  10.     pHS->LoopResponse();  
  11.     delete pHS;  
  12.     delete hsParam;  
  13.     return 0;  
  14. }  
  15.   
  16. MiniWebserver::MiniWebserver(void):m_listen(-1),m_stopevent(0)  
  17. {  
  18.     WSADATA wsaData;  
  19.     WSAStartup(MAKEWORD(2, 2), &wsaData);  
  20. }  
  21.   
  22. MiniWebserver::~MiniWebserver(void)  
  23. {  
  24.     if(m_listen)  
  25.         closesocket(m_listen);  
  26.     m_listen = -1;  
  27.   
  28.     WSACleanup();  
  29. }  
  30.   
  31. void MiniWebserver::Run(unsigned short listenport, zfqstring id, zfqstring pwd)  
  32. {  
  33.     //  
  34.     HANDLE m_hMutex = CreateMutex(NULL, FALSE, "MUTEX_MINIWEBSERVER");  
  35.     if(GetLastError() == ERROR_ALREADY_EXISTS)  
  36.     {  
  37.         CloseHandle(m_hMutex);  
  38.         m_hMutex = NULL;  
  39.         return;  
  40.     }  
  41.     //  
  42.     m_stopevent = CreateEvent(NULL, FALSE, FALSE,"EVENT_STOPMINIWEBSERVER");  
  43.     if(!m_stopevent)  
  44.         return;  
  45.   
  46.     //  
  47.     unsigned long flag = 1;  
  48.     sockaddr_in server_addr;  
  49.     m_listen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  
  50.     if(m_listen == INVALID_SOCKET)  
  51.     {  
  52.         return;  
  53.     }  
  54.     memset(&server_addr, 0, sizeof(sockaddr_in));  
  55.     server_addr.sin_family = AF_INET;  
  56.     server_addr.sin_port = htons(listenport);  
  57.     server_addr.sin_addr.s_addr = INADDR_ANY;  
  58.     if(bind(m_listen, (sockaddr*)&server_addr, sizeof(sockaddr_in)) == SOCKET_ERROR)  
  59.     {  
  60.         m_listen = -1;  
  61.         return;  
  62.     }  
  63.     ioctlsocket(m_listen, FIONBIO, &flag);  
  64.     if(listen(m_listen, 5)  ==  SOCKET_ERROR)  
  65.     {  
  66.         closesocket(m_listen);  
  67.         m_listen = -1;  
  68.         return;  
  69.     }  
  70.   
  71.     //  
  72.     struct fd_set fdset;   
  73.     struct timeval timeout;   
  74.     timeout.tv_sec = 0;   
  75.     timeout.tv_usec = 50000;  
  76.     while(WaitForSingleObject(m_stopevent, 10) != WAIT_OBJECT_0 )  
  77.     {  
  78.         //  
  79.         FD_ZERO(&fdset);  
  80.         FD_SET(m_listen, &fdset);  
  81.         int ret = select(m_listen + 1, &fdset, NULL, NULL, &timeout);  
  82.         if( ret == 1)   
  83.         {  
  84.             if(FD_ISSET(m_listen, &fdset))  
  85.             {  
  86.                 HttpSessionHandleParam* pSH = new HttpSessionHandleParam();  
  87.                 pSH->m_sessionsocket = accept(m_listen, NULL, NULL);  
  88.                 strcpy(pSH->m_id, id.GetString());  
  89.                 strcpy(pSH->m_pwd, pwd.GetString());  
  90.                 HANDLE handle;  
  91.                 unsigned threadID;  
  92.                 handle = (HANDLE)_beginthreadex(NULL, 0, HttpSessionHandleThread, pSH, 0, &threadID);  
  93.                 if(handle)  
  94.                     CloseHandle(handle);  
  95.             }  
  96.         }  
  97.         else if(ret < 0)  
  98.             break;  
  99.     }  
  100.     closesocket(m_listen);  
  101.     m_listen = -1;  
  102.     if(m_stopevent)  
  103.         CloseHandle(m_stopevent);  
  104.     return;  
  105. }  
  106.   
  107. void MiniWebserver::Stop()  
  108. {  
  109.     if(m_stopevent)  
  110.         SetEvent(m_stopevent);  
  111. }  

main.cpp

  1. // miniweb.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. #include "zfqstring.h"  
  7. #include "getopt.h"  
  8. #include "MiniWebserver.h"  
  9.   
  10. using namespace std;  
  11.   
  12. int _tmain(int argc, _TCHAR* argv[])  
  13. {  
  14.     unsigned int port = 8888;  
  15.     zfqstring id = "anonymous";  
  16.     zfqstring pwd = "";  
  17.     unsigned char c;  
  18.     char* param = NULL;  
  19.     if(argc >= 2)  
  20.     {  
  21.         while((c = GetOption(argc, argv, "hi:u:p:", ¶m)) != 0)  
  22.         {  
  23.             switch(c)  
  24.             {  
  25.             case 'h':  
  26.             case -1:  
  27.             case 1:  
  28.                 printf("User Commands:/n/  
  29.                         -h : For command help/n/  
  30.                         -i : Assign the web server port number/n/  
  31.                         -u : Assign the user name/n/  
  32.                         -p : Assign the password/n/  
  33.                         ----------------/n/  
  34.                         default port : 8888/n/  
  35.                         default user/pwd : anonymous//n");  
  36.                 return -1;  
  37.             case 'i':  
  38.                 if(NULL == param)  
  39.                 {  
  40.                     printf("Please input the web server port number you want!/n");  
  41.                     return -1;  
  42.                 }  
  43.                 port = atoi(param);  
  44.                 break;  
  45.             case 'u':  
  46.                 if(NULL == param)  
  47.                 {  
  48.                     printf("Please input the user name you want!/n");  
  49.                     return -1;  
  50.                 }  
  51.                 id = param;  
  52.                 break;  
  53.             case 'p':  
  54.                 if(NULL == param)  
  55.                 {  
  56.                     printf("Please input the password you want!/n");  
  57.                     return -1;  
  58.                 }  
  59.                 pwd = param;  
  60.                 break;  
  61.             }  
  62.         }  
  63.     }  
  64.   
  65.     printf("Mini WebServer For Ftp is Running/n/  
  66.             on port : %d/n/  
  67.             user : %s/n/  
  68.             pwd : %s/n", port, id.GetString(), pwd.GetString());  
  69.   
  70.     MiniWebserver web;  
  71.     web.Run(port, id, pwd);  
  72.   
  73.     return 0;  
  74. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值