80 lines
4.2 KiB
C
80 lines
4.2 KiB
C
|
#pragma once
|
||
|
|
||
|
#include <string>
|
||
|
#include <map>
|
||
|
#include <memory>
|
||
|
#include <pthread.h>
|
||
|
#include "mongoose.h"
|
||
|
#include "LockQueue.hpp"
|
||
|
#include <time.h>
|
||
|
#include <functional>
|
||
|
#include <sstream>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
#ifndef _WIN64
|
||
|
#define Logi(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [%llu][I] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec, (unsigned long long)pthread_self());printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
#define Logw(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [%llu][W] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec, (unsigned long long)pthread_self());printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
#define Loge(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [%llu][E] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec, (unsigned long long)pthread_self());printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
#else
|
||
|
#define Logi(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [I] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec );printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
#define Logw(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [W] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec );printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
#define Loge(fmt, ...) {time_t timep; time(&timep); struct tm *p = localtime(&timep); printf("%4d-%02d-%02d %02d:%02d:%02d [E] ", 1900+p->tm_year, 1+p->tm_mon, p->tm_mday, p-> tm_hour, p->tm_min, p->tm_sec );printf(fmt, ##__VA_ARGS__);printf("\n");fflush(stdout);}
|
||
|
|
||
|
#endif
|
||
|
#define W_HTTP_GET (1 << 0)
|
||
|
#define W_HTTP_POST (1 << 1)
|
||
|
#define W_HTTP_PUT (1 << 2)
|
||
|
#define W_HTTP_DELETE (1 << 3)
|
||
|
#define W_HTTP_HEAD (1 << 4)
|
||
|
#define W_HTTP_ALL 0xFF
|
||
|
|
||
|
using HttpChunkQueue = LockQueue<string *>;
|
||
|
using HttpSendQueue = LockQueue<string *>;
|
||
|
|
||
|
struct HttpReqMsg
|
||
|
{
|
||
|
mg_connection *httpConnection = nullptr;
|
||
|
string method; // GET POST PUT DELETE
|
||
|
string uri;
|
||
|
map<string, string> querys; // the params in uri
|
||
|
string proto; // http version
|
||
|
// the params in header, all key letters are converted to lowercase, eg "Content-Length" change to "content-length"
|
||
|
map<string, string> headers;
|
||
|
string body;
|
||
|
int64_t totalBodySize;
|
||
|
shared_ptr<HttpChunkQueue> chunkQueue;
|
||
|
shared_ptr<HttpSendQueue> sendQueue;
|
||
|
int64_t recvChunkSize = 0;
|
||
|
bool finishRecvChunk = false;
|
||
|
bool isKeepingAlive = false;
|
||
|
int64_t lastKeepAliveTime = 0;
|
||
|
};
|
||
|
|
||
|
using HttpCbFun = std::function<void(shared_ptr<HttpReqMsg> &)>;
|
||
|
using HttpFilterFun = std::function<bool(shared_ptr<HttpReqMsg> &)>;
|
||
|
|
||
|
class IHttpServer
|
||
|
{
|
||
|
public:
|
||
|
IHttpServer(){}
|
||
|
virtual ~IHttpServer(){}
|
||
|
virtual bool init(int maxEventThreadNum) = 0;
|
||
|
virtual bool startHttp(string strip, int port) = 0;
|
||
|
virtual bool startHttps(int port, string certPath, string keyPath) = 0;
|
||
|
virtual bool stop() = 0;
|
||
|
virtual bool run() = 0;
|
||
|
virtual bool isRunning() = 0;
|
||
|
virtual void addHttpApi(const string &uri, HttpCbFun fun, int httpMethods) = 0;
|
||
|
virtual void addChunkHttpApi(const string &uri, HttpCbFun fun, int httpMethods) = 0;
|
||
|
virtual void setHttpFilter(HttpFilterFun filter) = 0;
|
||
|
virtual void forceCloseHttpConnection(shared_ptr<HttpReqMsg> httpMsg) = 0;
|
||
|
virtual void httpReplyJson(shared_ptr<HttpReqMsg> httpMsg, int httpCode, string head, string body) = 0;
|
||
|
virtual void addSendMsgToQueue(shared_ptr<HttpReqMsg> httpMsg, const char* data, int len) = 0;
|
||
|
virtual void addSendMsgToQueue(shared_ptr<HttpReqMsg> httpMsg, string *sendMsg) = 0;
|
||
|
virtual string formJsonBody(int code, string message, string body="") = 0;
|
||
|
virtual bool isClientDisconnect(shared_ptr<HttpReqMsg> httpMsg) = 0;
|
||
|
virtual shared_ptr<string> deQueueHttpChunk(shared_ptr<HttpReqMsg> httpMsg) = 0;
|
||
|
virtual bool addStaticWebDir(const string &dir, const string &header = "") = 0;
|
||
|
};
|