Roughly implement ideas
This commit is contained in:
@@ -18,7 +18,8 @@ SOURCES += \
|
||||
HEADERS += \
|
||||
src/Hub.h \
|
||||
src/Http.h \
|
||||
src/Context.h
|
||||
src/Context.h \
|
||||
src/uWS.h
|
||||
#uSockets/libusockets.h \
|
||||
#uSockets/internal/eventing/epoll.h \
|
||||
#uSockets/internal/networking/bsd.h \
|
||||
|
||||
@@ -1,59 +1,22 @@
|
||||
// uWS.h
|
||||
#include "Hub.h"
|
||||
// this is roughly the interfaces I plan for (with changes and additional helpers added with time)
|
||||
// much speaks for a header-only or header-mostly implementation now that uSockets is properly isolating its internal headers
|
||||
|
||||
char largeBuf[] = "HTTP/1.1 200 OK\r\nContent-Length: 512\r\n\r\n";
|
||||
int largeHttpBufSize = sizeof(largeBuf) + 512 - 1;
|
||||
char *largeHttpBuf;
|
||||
#include "uWS.h"
|
||||
|
||||
int main() {
|
||||
largeHttpBuf = (char *) malloc(largeHttpBufSize);
|
||||
memcpy(largeHttpBuf, largeBuf, sizeof(largeBuf) - 1);
|
||||
|
||||
std::cout << "HttpSocket size: " << sizeof(HttpSocket) << std::endl;
|
||||
std::cout << "HttpSocket size: " << sizeof(HttpSocket::Data) << std::endl;
|
||||
char *buffer = new char[512];
|
||||
|
||||
// either use this, or use onHttpRoute but not both
|
||||
uWS::defaultHub.onHttpRequest([](HttpSocket *s, HttpRequest *req) {
|
||||
uWS::defaultHub.onHttpRequest([buffer](HttpSocket *s, HttpRequest *req) {
|
||||
|
||||
// we do not care for routers just yet!
|
||||
if (req->getUrl() == "/") {
|
||||
// just write back for now!
|
||||
|
||||
us_socket *us = (us_socket *) s;
|
||||
us_socket_write(us, largeHttpBuf, largeHttpBufSize, 0);
|
||||
|
||||
s->writeStatus(200)->writeHeader("Server", "µWebSockets v0.15")->end(buffer, 512);
|
||||
} else {
|
||||
|
||||
|
||||
std::cout << "Got HTTP request at URL: " << req->getUrl() << std::endl;
|
||||
}
|
||||
|
||||
|
||||
// get the URL here!
|
||||
|
||||
|
||||
|
||||
// an http socket can BOTH send buffered data AND have one stream in and one stream out!
|
||||
|
||||
// writeStatus(234314234)
|
||||
// writeHeader(key, value)
|
||||
// streamOut(asdasdasdsad)
|
||||
|
||||
// if some asshole posted data, stream it in
|
||||
/*s->streamIn([]() {
|
||||
|
||||
});*/
|
||||
|
||||
//std::cout << "Got data: " << std::string(data, length) << std::endl;
|
||||
|
||||
// s->writeStatus();
|
||||
// s->writeHeader();
|
||||
|
||||
// if url == / then stream index.htm
|
||||
|
||||
// stream out the response
|
||||
/*s->stream(largeHttpBufSize, [](int offset) {
|
||||
return std::make_pair(largeHttpBuf + offset, largeHttpBufSize - offset);
|
||||
});*/
|
||||
}).listen("localhost", 3000, 0).run();
|
||||
|
||||
// todo: important swapping to SSL should be .secureListen(same interfaces) and work out of the box!
|
||||
|
||||
+53
-9
@@ -70,18 +70,65 @@ struct HttpRequest {
|
||||
};
|
||||
|
||||
|
||||
// HttpSocket is the ext of us_socket
|
||||
// HttpSocket is an alias for us_socket
|
||||
struct HttpSocket {
|
||||
|
||||
// incomplete headers buffer
|
||||
std::string headerBuffer;
|
||||
// chunked response will be tricky with this buffering scheme
|
||||
// if we do not fit, we can always use the header buffer for this (both in and out!)
|
||||
// put first 8kb chunk in the http buffer, then from there it's the stream's job!
|
||||
// httpheaders should only have 1 stream in and 1 stream out, but we can have helper wrappers
|
||||
|
||||
//
|
||||
// data is stored in ext
|
||||
struct Data {
|
||||
// incomplete headers buffer
|
||||
std::string headerBuffer;
|
||||
int offset = 0;
|
||||
|
||||
HttpSocket() {
|
||||
std::function<std::pair<const char *, int>(int)> outStream;
|
||||
};
|
||||
|
||||
// cork is stored in hub
|
||||
char *getCorkBuffer() {
|
||||
// context -> hub -> cork buffer
|
||||
|
||||
us_socket *s = (us_socket *) this;
|
||||
|
||||
// get the loop from the context!
|
||||
//return us_socket_context_loop(us_socket_get_context(s));
|
||||
|
||||
|
||||
return corkBuffer;
|
||||
}
|
||||
|
||||
HttpSocket *writeStatus(int status) {
|
||||
char *corkBuffer = getCorkBuffer();
|
||||
|
||||
char largeBuf[] = "HTTP/1.1 200 OK\r\nContent-Length: 512\r\n\r\n";
|
||||
|
||||
memcpy(corkBuffer + corkOffset, largeBuf, sizeof(largeBuf) - 1);
|
||||
corkOffset += sizeof(largeBuf) - 1;
|
||||
|
||||
return this;
|
||||
}
|
||||
|
||||
HttpSocket *writeHeader(char *key, char *value) {
|
||||
return this;
|
||||
}
|
||||
|
||||
void end(char *data, int length) {
|
||||
us_socket *s = (us_socket *) this;
|
||||
|
||||
char *corkBuffer = getCorkBuffer();
|
||||
memcpy(corkBuffer + corkOffset, data, length);
|
||||
corkOffset += length;
|
||||
|
||||
us_socket_write(s, corkBuffer, corkOffset, 0);
|
||||
corkOffset = 0;
|
||||
}
|
||||
|
||||
// can't create this!
|
||||
HttpSocket() = delete;
|
||||
|
||||
// the HttpParser should maybe be moved out of this into its own HttpProtocol.h like with websocket?
|
||||
void parse(char *data, int length) {
|
||||
|
||||
@@ -89,10 +136,7 @@ struct HttpSocket {
|
||||
|
||||
}
|
||||
|
||||
int offset = 0;
|
||||
|
||||
std::function<std::pair<const char *, int>(int)> outStream;
|
||||
void stream(int length, decltype(outStream) stream);
|
||||
void stream(int length, decltype(Data::outStream) stream);
|
||||
};
|
||||
|
||||
#endif // HTTP_H
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
// should lie in hub and be connected with pre/post callbacks
|
||||
char *corkBuffer = new char[1024];
|
||||
int corkOffset = 0;
|
||||
|
||||
#ifndef HUB_H
|
||||
#define HUB_H
|
||||
|
||||
|
||||
Reference in New Issue
Block a user