add and compile tinyweb

This commit is contained in:
2019-12-04 23:50:02 +01:00
parent 4e93bae908
commit da4dc1e0d4
8 changed files with 2172 additions and 113 deletions

View File

@@ -28,20 +28,100 @@
/*------------------------------- INCLUDES ----------------------------------*/
#include "CivetServer.h"
#include "web/handler/exit-handler.h"
#include <string.h>
#include "web-server.h"
#define EXIT_URI "/exit"
//404前回调(未找到页面/文件时回调,此功能便于程序返回自定义功能)返回0表示没有适合的处理请求需要发送404错误
char on_request(void* data, uv_stream_t* client, tw_peerAddr* pa, tw_reqHeads* heads)
{
// struct sockaddr_in serveraddr, peeraddr;
// char serv_ip[17],peer_ip[17], tmp[1024];
// int addrlen = sizeof(struct sockaddr);
// int r;
//
// //获取clientAddr: http://www.codes51.com/article/detail_113112.html
// //本地接入地址
// r = uv_tcp_getsockname((uv_tcp_t*)client, (struct sockaddr*)&serveraddr, &addrlen);
// //网络字节序转换成主机字符序
// uv_ip4_name(&serveraddr, (char*)serv_ip, sizeof(serv_ip));
// //客户端的地址
// r = uv_tcp_getpeername((uv_tcp_t*)client, (struct sockaddr*)&peeraddr, &addrlen);
// //网络字节序转换成主机字符序
// uv_ip4_name(&peeraddr, (char*)peer_ip, sizeof(peer_ip));
//
// sprintf(tmp, "<h1>Page not found:</h1><url>%s<br>%s<br></url><br><br><br><i>server%s:%d\t\tpeer%s:%d</i>\n", heads->path, (heads->query?heads->query:""), serv_ip, ntohs(serveraddr.sin_port), peer_ip, ntohs(peeraddr.sin_port));
//#ifdef _MSC_VER //Windows下需要转换编码
// size_t ll = strlen(tmp);
// char *ch = GB2U8(tmp, &ll);
// tw_send_200_OK(client, "text/html", ch, -1, 0);
// free(ch);
//#else //linux 下系统是和源代码文件编码都是是utf8的就不需要转换
// tw_send_200_OK(client, "text/html", tmp, -1, 0);
//#endif // _MSC_VER
//
printf(" sk:%zd Request:\n",pa->sk);
printf(" Query: %s\n",heads->query);
printf(" Path: %s\n",heads->path);
printf(" Host: %s\n",heads->host);
printf(" Cookie: %s\n", heads->cookie);
printf(" Range: %lld-%lld\n",heads->Range_frm,heads->Range_to);
printf(" data(%zd): %s\n", heads->len,heads->data);
if (!heads->cookie)
{
char ck[512];
tw_make_setcookie(ck, 255,"TINYSSID","FDSAFdfafdsafds", 3600 * 8, NULL, heads->path);
tw_make_setcookie(ck + strlen(ck),255,"TINYSSID2","faFDSAF45dsafds", 0, heads->host, NULL);
sprintf(ck + strlen(ck), "WWW-Authenticate: Basic realm=\".\"\r\n");
size_t len;
char* rp = tw_format_http_respone(client, "401 Unauthorized", ck, "text/plan", "", -1, &len);
tw_send_data(client, rp, len, 0, 1);
return 1;
}
return 0;
}
char on_socket_data(void* data, uv_stream_t* client, tw_peerAddr* pa, membuf_t* buf)
{
if (buf->size < 1)
return 1;//防止发生数据为空
if (pa->flag & 0x2) { //WebSocket
printf((const char*)buf->data, buf->size < 256 ? buf->size : 256);
printf("-------------------------------------------ws:%zd dlen=%zd\n%s\n-------------------------------------------\n",pa->sk, buf->size, buf->data);
ulong len = buf->size;
char* p = WebSocketMakeFrame(buf->data, &len, 1);//文本帧
tw_send_data(client, p, len, 0, 1);
} else { //Socket
printf("-------------------------------------------sk:%zd dlen=%zd\n%s\n-------------------------------------------\n",pa->sk, buf->size, buf->data);
tw_send_data(client, buf->data, buf->size, 1, 0);
}
return 1;
}
char on_close(void* data, uv_stream_t* client, tw_peerAddr* pa)
{
//printf("closed: sk=%zd [%s:%d] from:%s:%d cli:%d\n", pa->sk, pa->ip, pa->port, pa->fip, pa->fport, client->loop->active_tcp_streams);
return 0;
}
char on_connect(void* data, uv_stream_t* client, tw_peerAddr* pa)
{
//printf("connected: sk=%zd [%s:%d] from:%s:%d cli:%d\n",pa->sk,pa->ip,pa->port,pa->fip,pa->fport, client->loop->active_tcp_streams);
return 0;
}
char on_error(void* data, uv_stream_t* client, tw_peerAddr* pa, int errcode, char* errstr)
{
//printf("error: sk=%zd [%s:%d] from:%s:%d cli:%d %s\n", pa->sk, pa->ip, pa->port, pa->fip, pa->fport, client->loop->active_tcp_streams,errstr);
return 0;
}
/*! ----------------------------------------------------------------------------
* @fn WebServer
*
* @brief Constructor of the Web Server Object.
*/
WebServer::WebServer(void) : m_server(NULL)
WebServer::WebServer(void)
{
}
@@ -53,7 +133,6 @@ WebServer::WebServer(void) : m_server(NULL)
WebServer::~WebServer(void)
{
delete m_server;
}
/*! ----------------------------------------------------------------------------
@@ -61,18 +140,22 @@ WebServer::~WebServer(void)
*
* @brief Setup the Web server
*/
int WebServer::setup(const char *a_document_root, const char *a_port, struct event_base *an_evt_loop)
int WebServer::setup(char *a_document_root, int a_port, uv_loop_t *an_evt_loop)
{
std::vector<std::string> the_options;
memset(&m_conf, 0, sizeof(m_conf));
m_conf.dirlist = 1;//目录列表
//conf.ip = NULL;// "127.0.0.1";
m_conf.port = a_port;
m_conf.doc_dir = a_document_root;
m_conf.doc_index = NULL;// Default homepage
//m_conf.doc_dir = NULL;// The directory where the default program files are located
the_options.push_back("document_root");
the_options.push_back(a_document_root);
the_options.push_back("listening_ports");
the_options.push_back(a_port);
m_server = new CivetServer(the_options);
m_server->addHandler(EXIT_URI, new ExitHandler(an_evt_loop));
m_conf.on_request = on_request;
m_conf.on_data = on_socket_data;
m_conf.on_close = on_close;
m_conf.on_connect = on_connect;
m_conf.on_error = on_error;
tinyweb_start(an_evt_loop, &m_conf);
return 0;
}