133 lines
4.5 KiB
C
133 lines
4.5 KiB
C
|
#ifndef HTTPD_H
|
||
|
#define HTTPD_H
|
||
|
|
||
|
#include "httpd-com.h"
|
||
|
#include "esp_types.h"
|
||
|
|
||
|
#define HTTPDVER "0.4"
|
||
|
|
||
|
#define HTTPD_CGI_MORE 0
|
||
|
#define HTTPD_CGI_DONE 1
|
||
|
#define HTTPD_CGI_NOTFOUND 2
|
||
|
#define HTTPD_CGI_AUTHENTICATED 3
|
||
|
|
||
|
#define HTTPD_METHOD_GET 1
|
||
|
#define HTTPD_METHOD_POST 2
|
||
|
#define HTTPD_METHOD_PUT 3
|
||
|
|
||
|
|
||
|
#define HTTPD_MAX_CONNECTIONS 2
|
||
|
#define HTTPD_STACKSIZE (4*1024)
|
||
|
#define ESP32
|
||
|
|
||
|
|
||
|
typedef struct HttpdPriv HttpdPriv;
|
||
|
typedef struct HttpdConnData HttpdConnData;
|
||
|
typedef struct HttpdPostData HttpdPostData;
|
||
|
|
||
|
typedef int (* cgiSendCallback)(HttpdConnData *connData);
|
||
|
typedef int (* cgiRecvHandler)(HttpdConnData *connData, char *data, int len);
|
||
|
|
||
|
//Max amount of simultaneous connections
|
||
|
#define MAX_CONN 8
|
||
|
//Max length of request head. This is statically allocated for each connection.
|
||
|
#define MAX_HEAD_LEN 1024
|
||
|
//Max post buffer len. This is dynamically malloc'ed if needed.
|
||
|
#define MAX_POST 1024
|
||
|
//Max send buffer len. This is allocated on the stack.
|
||
|
#define MAX_SENDBUFF_LEN 1460
|
||
|
//If some data can't be sent because the underlaying socket doesn't accept the data (like the nonos
|
||
|
//layer is prone to do), we put it in a backlog that is dynamically malloc'ed. This defines the max
|
||
|
//size of the backlog.
|
||
|
#define MAX_BACKLOG_SIZE (4*1024)
|
||
|
|
||
|
typedef struct HttpSendBacklogItem HttpSendBacklogItem;
|
||
|
|
||
|
struct HttpSendBacklogItem {
|
||
|
int len;
|
||
|
HttpSendBacklogItem *next;
|
||
|
char data[];
|
||
|
};
|
||
|
|
||
|
//Flags
|
||
|
#define HFL_HTTP11 (1<<0)
|
||
|
#define HFL_CHUNKED (0<<1)
|
||
|
#define HFL_SENDINGBODY (1<<2)
|
||
|
#define HFL_DISCONAFTERSENT (1<<3)
|
||
|
#define HFL_ONLYRESPONSEOK (1<<4)
|
||
|
|
||
|
|
||
|
//Private data for http connection
|
||
|
struct HttpdPriv {
|
||
|
char head[MAX_HEAD_LEN];
|
||
|
int headPos;
|
||
|
char *sendBuff;
|
||
|
int sendBuffLen;
|
||
|
char *chunkHdr;
|
||
|
HttpSendBacklogItem *sendBacklog;
|
||
|
int sendBacklogSize;
|
||
|
int flags;
|
||
|
};
|
||
|
|
||
|
//A struct describing a http connection. This gets passed to cgi functions.
|
||
|
struct HttpdConnData {
|
||
|
ConnTypePtr conn; // The TCP connection. Exact type depends on the platform.
|
||
|
char requestType; // One of the HTTPD_METHOD_* values
|
||
|
char *url; // The URL requested, without hostname or GET arguments
|
||
|
char *getArgs; // The GET arguments for this request, if any.
|
||
|
const void *cgiArg; // Argument to the CGI function, as stated as the 3rd argument of
|
||
|
// the builtInUrls entry that referred to the CGI function.
|
||
|
void *cgiData; // Opaque data pointer for the CGI function
|
||
|
char *hostName; // Host name field of request
|
||
|
HttpdPriv *priv; // Opaque pointer to data for internal httpd housekeeping
|
||
|
cgiSendCallback cgi; // CGI function pointer
|
||
|
cgiRecvHandler recvHdl; // Handler for data received after headers, if any
|
||
|
HttpdPostData *post; // POST data structure
|
||
|
int remote_port; // Remote TCP port
|
||
|
uint8_t remote_ip[4]; // IP address of client
|
||
|
uint8_t slot; // Slot ID
|
||
|
};
|
||
|
|
||
|
//A struct describing the POST data sent inside the http connection. This is used by the CGI functions
|
||
|
struct HttpdPostData {
|
||
|
int len; // POST Content-Length
|
||
|
int buffSize; // The maximum length of the post buffer
|
||
|
int buffLen; // The amount of bytes in the current post buffer
|
||
|
int received; // The total amount of bytes received so far
|
||
|
char *buff; // Actual POST data buffer
|
||
|
char *multipartBoundary;
|
||
|
};
|
||
|
|
||
|
//A struct describing an url. This is the main struct that's used to send different URL requests to
|
||
|
//different routines.
|
||
|
typedef struct {
|
||
|
const char *url;
|
||
|
cgiSendCallback cgiCb;
|
||
|
const void *cgiArg;
|
||
|
} HttpdBuiltInUrl;
|
||
|
|
||
|
int cgiRedirect(HttpdConnData *connData);
|
||
|
int cgiRedirectToHostname(HttpdConnData *connData);
|
||
|
int cgiRedirectApClientToHostname(HttpdConnData *connData);
|
||
|
void httpdRedirect(HttpdConnData *conn, char *newUrl);
|
||
|
int httpdUrlDecode(char *val, int valLen, char *ret, int retLen);
|
||
|
int httpdFindArg(char *line, char *arg, char *buff, int buffLen);
|
||
|
void httpdInit(HttpdBuiltInUrl *fixedUrls, int port);
|
||
|
const char *httpdGetMimetype(char *url);
|
||
|
void httpdDisableTransferEncoding(HttpdConnData *conn);
|
||
|
void httpdStartResponse(HttpdConnData *conn, int code);
|
||
|
void httpdHeader(HttpdConnData *conn, const char *field, const char *val);
|
||
|
void httpdEndHeaders(HttpdConnData *conn);
|
||
|
int httpdGetHeader(HttpdConnData *conn, char *header, char *ret, int retLen);
|
||
|
int httpdSend(HttpdConnData *conn, const char *data, int len);
|
||
|
void httpdFlushSendBuffer(HttpdConnData *conn);
|
||
|
|
||
|
//Platform dependent code should call these.
|
||
|
void httpdSentCb(ConnTypePtr conn, char *remIp, int remPort);
|
||
|
void httpdRecvCb(ConnTypePtr conn, char *remIp, int remPort, char *data, unsigned short len);
|
||
|
void httpdDisconCb(ConnTypePtr conn, char *remIp, int remPort);
|
||
|
int httpdConnectCb(ConnTypePtr conn, char *remIp, int remPort);
|
||
|
|
||
|
|
||
|
#endif
|