From 7529ba1dd1f7903b70e5e5300e6fb99764f9df6e Mon Sep 17 00:00:00 2001 From: Alex Hultman Date: Tue, 11 Sep 2018 20:04:52 +0200 Subject: [PATCH] Clean up & document HttpResponse.h --- design.dia | Bin 2537 -> 2545 bytes main.cpp | 2 +- src/new_design/AsyncSocket.h | 4 ++++ src/new_design/HttpResponse.h | 26 ++++++++------------------ src/new_design/HttpResponseData.h | 2 ++ 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/design.dia b/design.dia index a12b6e4ae62454d940b8faf8e035a9fbfd190127..85e356cd84877d9990707ef90012819f352d8c71 100644 GIT binary patch delta 2484 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 delta 2436 zcmV-~348YO6X_F>A%D%xMYd*ZcjuZCpayS@<+V){axuSsCEGOEU@(?N0y$LW1CaGf zvaO@@aE|rkPoJ0J;Dse=z@x_@M#gZ!qA8yR(fo1v*MEL{@Pt#&>zH~c|w;1 zaYU5LcaOtGmc>7eM(gz&g`1RSJV9ZwLMa>lO~a6mM4{2}>3_{&uwTK9W>kJweoC_} z2_~zI4I;W^kHZO_ewrtI70rf4sj}RZhddd)(C~5i_PKlwM`cB$N=+wfkLjFE5=K8Y zS8j-x?{}*_W=Xx`Wz5q+6v;O6L6L@fam3^sC`W2Adh~43eS6oqBqY;{U z%w~2MBQ#$HGnSsYn5$(PYFd=VM(4)8UQTgnWuIKG znkpk2KVf{Kay=P#p0vd3N=?1 z7a2>+mVf@TTbmBb*`{pCplm5m z*M4ug$Pxd(BNoDLM^zTG<#@`I=y0*zXXkR6+<)dBc5rL&9AucT+emj zLVusd?Kz$<=)okqn?j9l^_QbG7VaS%hb)>OPNBOsx2vX+(fPdUh4y+vXc+SKSllZI;64QZov_aoxTl7{1FerRLl zXM<yL-+qZVlwsrZ=mfYxH``m7Dc?vegUktS;{LI@cw)e}4hD z7)qz=7vcQ5Obi)c*87r8GxWdPGk*OCf z2py8^5J?t)#8zMIeKTO;Bj+&?1t1DQ6o4oIQ2?Ry0ah%#2Nkb^z%3IPii!j2H~ks-N)jSQ!h z?TQwbETh9S5oEJKIECFhm1K+YL0nAR;cG65?fy&p$nJdZWH-66@`nb9MXTkp5Webn z#)Q}SPuWCNZN~4qV zb-c$ud$fxfOb_bZelu9mXjWba8P5ai2D@*M%_T>U#pSWMdaQF8@LFq-I;b~QEh=%u zv@NG^7g<^@su1$rLdX;*)g;LD5Yw&t39pXYrrWj%$;apdHieVo;Y?o!|S$$mB-xOW=7fWMt<1pY0 zz!!io0AB#U0DJ-X0`LXk3&0nEF92TvzHr}s!R~=C*jLChlrm(SWQaZaphjDNnxT5< z+JOb^R~}#F-8fkIIo(9lfAi@l29GZSf35&r0k{Hi1>g$66@V)MR{*X6TmiTOaD_YJ z3coYqLDMk!l6T}t!l9!K7;NOYrdrNgE5cwQkK{U*L=29QGjBiNuwnF?3yO~8zDp{_ zoUKRPY1LbQwg=D1G=jA&K7paz^49mKq2JXg^)}K40H@+ zVe=a4fPM6^U6ZQ@Co+ELA$p$j1BPsbZT$&=Qf8a|XUeR<9oMfZt;XU@eT#x+Db9s~&4!Ap{T` z$}xZ@x&p8lDwe$^_6|laz6P*Y?pr%vkDYy7e;2&|gP1kNECaX&9&kP2dXpds6@R}I zT#vExCcZ9mOxM=W>xGc*6+)8N3*XYu4^?>UE*8{ExTo1S&aFZ?w34ebtxZYI8^`>z5UHhGf46Ss*#K`t@H{W*c z_d?YquH0qExoKK|eDDqnnlADj!|AgiL53y9Q{}t?tOr;RupVH&Hdv1vd3y_3PZ~+T zGORysQ!V9`H4nKi(Qi|w4#{_}lQxyO$nkPwf73R#VepRpa6rTqVB$UtmOn*+O@9TO z3N{sN>McC8-cqrtef|J`cDEL+ydNwPrp@$<$H?pbDO}hfuMm=!)ijXh6#-Q4EpOP; zG=9w`39hE>^;8meY=IqH!1{spyWIMj3OlxV`gUwN?NBQ3Q)XfLEE3%T)uxFYcNb7C zMeiV>`q2xr z9psvYkaQ<)4_WfvzlkWW&&%DCr>YWIwriteStatus(uWS::HTTP_200_OK)->write([](int offset) { - return std::string_view("Hello world!"); + return std::string_view("Hello world!").substr(offset); }, 12); }); diff --git a/src/new_design/AsyncSocket.h b/src/new_design/AsyncSocket.h index b993208..5934ecd 100644 --- a/src/new_design/AsyncSocket.h +++ b/src/new_design/AsyncSocket.h @@ -111,6 +111,10 @@ struct AsyncSocket : StaticDispatch { } + void *getExt() { + return static_dispatch(us_ssl_socket_ext, us_socket_ext)((SOCKET_TYPE *) this); + } + void close() { static_dispatch(us_ssl_socket_close, us_socket_close)((SOCKET_TYPE *) this); } diff --git a/src/new_design/HttpResponse.h b/src/new_design/HttpResponse.h index 320b4f8..bc7ca19 100644 --- a/src/new_design/HttpResponse.h +++ b/src/new_design/HttpResponse.h @@ -1,26 +1,26 @@ #ifndef HTTPRESPONSE_H #define HTTPRESPONSE_H +/* An HttpResponse is the channel on which you send back a response */ + #include "AsyncSocket.h" #include "HttpResponseData.h" namespace uWS { +/* Some pre-defined status constants to use with writeStatus */ const char *HTTP_200_OK = "200 OK"; template struct HttpResponse : public AsyncSocket { private: - - using SOCKET_TYPE = typename StaticDispatch::SOCKET_TYPE; - using StaticDispatch::static_dispatch; - HttpResponseData *getHttpResponseData() { - return (HttpResponseData *) static_dispatch(us_ssl_socket_ext, us_socket_ext)((SOCKET_TYPE *) this); + return (HttpResponseData *) AsyncSocket::getExt(); } public: + /* Write the HTTP status */ HttpResponse *writeStatus(std::string_view status) { AsyncSocket::write("HTTP/1.1 ", 9); AsyncSocket::write(status.data(), status.length()); @@ -28,6 +28,7 @@ public: return this; } + /* Write an HTTP header with string value */ HttpResponse *writeHeader(std::string_view key, std::string_view value) { AsyncSocket::write(key.data(), key.length()); AsyncSocket::write(": ", 2); @@ -36,12 +37,9 @@ public: return this; } + /* Attach a write handler for sending data. Length must be specified up front and chunks might be read more than once */ void write(std::function cb, int length) { - // what if the streamer cannot return any data? - // then it should return something to pause write, and then start it again - // basically we need throttling std::string_view chunk = cb(0); - AsyncSocket::write("Content-Length: ", 16); AsyncSocket::writeUnsigned(chunk.length()); AsyncSocket::write("\r\n\r\n", 4); @@ -50,19 +48,11 @@ public: } } - // this will probably not be this clean: it will most probably want to do some active pulling of data? + /* Attach a read handler for data sent. Will be called with a chunk of size 0 when FIN */ void read(std::function handler) { HttpResponseData *data = getHttpResponseData(); - data->inStream = handler; } - - // this should not be anything other than a simple convenience wrapper of streams! - void end(std::string_view data) { - writeStatus("200 OK")->write([data](int offset) { - return std::string_view(data.data() + offset, data.length() - offset); - }, data.length()); - } }; } diff --git a/src/new_design/HttpResponseData.h b/src/new_design/HttpResponseData.h index 01956c5..5d3e2e0 100644 --- a/src/new_design/HttpResponseData.h +++ b/src/new_design/HttpResponseData.h @@ -1,6 +1,8 @@ #ifndef HTTPRESPONSEDATA_H #define HTTPRESPONSEDATA_H +/* This data belongs to the HttpResponse */ + #include "HttpParser.h" #include