forked from RamseyK/httpserver
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHTTPServer.h
More file actions
executable file
·102 lines (81 loc) · 3.03 KB
/
HTTPServer.h
File metadata and controls
executable file
·102 lines (81 loc) · 3.03 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
httpserver
HTTPServer.h
Copyright 2011-2021 Ramsey Kant
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
#ifndef _HTTPSERVER_H_
#define _HTTPSERVER_H_
#include <unordered_map>
#include <vector>
#include <string>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <fcntl.h>
#ifdef __linux__
#include <kqueue/sys/event.h> // libkqueue Linux - only works if libkqueue is compiled from Github sources
#else
#include <sys/event.h> // kqueue BSD / OS X
#endif
#include "Client.h"
#include "HTTPRequest.h"
#include "HTTPResponse.h"
#include "ResourceHost.h"
#define INVALID_SOCKET -1
#define QUEUE_SIZE 1024
class HTTPServer {
// Server Socket
int listenPort;
int listenSocket; // Descriptor for the listening socket
struct sockaddr_in serverAddr; // Structure for the server address
int dropUid; // setuid to this after bind()
int dropGid; // setgid to this after bind()
// Kqueue
struct timespec kqTimeout = {2, 0}; // Block for 2 seconds and 0ns at the most
int kqfd; // kqueue descriptor
struct kevent evList[QUEUE_SIZE]; // Events that have triggered a filter in the kqueue (max QUEUE_SIZE at a time)
// Client map, maps Socket descriptor to Client object
std::unordered_map<int, Client*> clientMap;
// Resources / File System
std::vector<ResourceHost*> hostList; // Contains all ResourceHosts
std::unordered_map<std::string, ResourceHost*> vhosts; // Virtual hosts. Maps a host string to a ResourceHost to service the request
// Connection processing
void updateEvent(int ident, short filter, u_short flags, u_int fflags, int data, void *udata);
void acceptConnection();
Client *getClient(int clfd);
void disconnectClient(Client* cl, bool mapErase = true);
void readClient(Client* cl, int data_len); // Client read event
bool writeClient(Client* cl, int avail_bytes); // Client write event
ResourceHost* getResourceHostForRequest(HTTPRequest* req);
// Request handling
void handleRequest(Client* cl, HTTPRequest* req);
void handleGet(Client* cl, HTTPRequest* req);
void handleOptions(Client* cl, HTTPRequest* req);
void handleTrace(Client* cl, HTTPRequest* req);
// Response
void sendStatusResponse(Client* cl, int status, std::string msg = "");
void sendResponse(Client* cl, HTTPResponse* resp, bool disconnect);
public:
bool canRun;
public:
HTTPServer(std::vector<std::string> vhost_aliases, int port, std::string diskpath, int drop_uid=0, int drop_gid=0);
~HTTPServer();
bool start();
void stop();
// Main event loop
void process();
};
#endif