Don't leave content-length on empty response

This commit is contained in:
Alex Hultman
2018-12-29 14:27:50 +01:00
parent 6befbd4a37
commit d597041ca4
5 changed files with 18 additions and 14 deletions
+7 -4
View File
@@ -50,6 +50,10 @@ private:
using StaticDispatch<SSL>::static_dispatch; using StaticDispatch<SSL>::static_dispatch;
public: public:
void registerTag() {
}
~TemplatedApp() { ~TemplatedApp() {
} }
@@ -135,8 +139,6 @@ public:
ExtensionsNegotiator<true> extensionsNegotiator(wantedOptions); ExtensionsNegotiator<true> extensionsNegotiator(wantedOptions);
extensionsNegotiator.readOffer(extensions); extensionsNegotiator.readOffer(extensions);
std::cout << extensions << " => " << extensionsNegotiator.generateOffer() << std::endl;
/* Todo: remove these mid string copies */ /* Todo: remove these mid string copies */
res->writeHeader("Sec-WebSocket-Extensions", extensionsNegotiator.generateOffer()); res->writeHeader("Sec-WebSocket-Extensions", extensionsNegotiator.generateOffer());
@@ -155,6 +157,8 @@ public:
/* Add mark, we don't want to end anything */ /* Add mark, we don't want to end anything */
res->writeHeader("WebSocket-Server", "uWebSockets")->end(); res->writeHeader("WebSocket-Server", "uWebSockets")->end();
/* todo: What about HttpResponseData here? */
/* Adopting a socket invalidates it, do not rely on it directly to carry any data */ /* Adopting a socket invalidates it, do not rely on it directly to carry any data */
WebSocket<SSL, true> *webSocket = (WebSocket<SSL, true> *) StaticDispatch<SSL>::static_dispatch(us_ssl_socket_context_adopt_socket, us_socket_context_adopt_socket)( WebSocket<SSL, true> *webSocket = (WebSocket<SSL, true> *) StaticDispatch<SSL>::static_dispatch(us_ssl_socket_context_adopt_socket, us_socket_context_adopt_socket)(
(typename StaticDispatch<SSL>::SOCKET_CONTEXT_TYPE *) webSocketContext, (typename StaticDispatch<SSL>::SOCKET_TYPE *) res, sizeof(WebSocketData) + sizeof(UserData)); (typename StaticDispatch<SSL>::SOCKET_CONTEXT_TYPE *) webSocketContext, (typename StaticDispatch<SSL>::SOCKET_TYPE *) res, sizeof(WebSocketData) + sizeof(UserData));
@@ -171,8 +175,7 @@ public:
behavior.open(webSocket, req); behavior.open(webSocket, req);
} }
// todo: perform all the checks such as shutdown, closed, etc! /* We do not need to check for any close or shutdown here as we immediately return from get handler */
// bug? or does this happen automatically? no!
} else { } else {
/* For now we do not support having HTTP and websocket routes on the same URL */ /* For now we do not support having HTTP and websocket routes on the same URL */
-5
View File
@@ -41,13 +41,8 @@ protected:
); );
} }
// we need a type safe realType = getData<MiddleType>
/* Get socket extension */ /* Get socket extension */
void *getExt() { void *getExt() {
// we might have multiple inheritance so need to know the middle type
return static_dispatch(us_ssl_socket_ext, us_socket_ext)((SOCKET_TYPE *) this); return static_dispatch(us_ssl_socket_ext, us_socket_ext)((SOCKET_TYPE *) this);
} }
+1
View File
@@ -312,6 +312,7 @@ public:
}); });
} }
// this can be removed? or at least set by default to something like Apache server does
void onUnhandled(std::function<void(uWS::HttpResponse<SSL> *, uWS::HttpRequest *)> handler) { void onUnhandled(std::function<void(uWS::HttpResponse<SSL> *, uWS::HttpRequest *)> handler) {
HttpContextData<SSL> *httpContextData = getSocketContextData(); HttpContextData<SSL> *httpContextData = getSocketContextData();
+1 -1
View File
@@ -36,7 +36,7 @@ private:
}; };
HttpRouter<RouterData> router; HttpRouter<RouterData> router;
void *upgradedWebSocket; void *upgradedWebSocket = nullptr;
}; };
} }
+9 -4
View File
@@ -95,10 +95,15 @@ private:
} else { } else {
/* Write content-length on first call */ /* Write content-length on first call */
if (!(httpResponseData->state & HttpResponseData<SSL>::HTTP_END_CALLED)) { if (!(httpResponseData->state & HttpResponseData<SSL>::HTTP_END_CALLED)) {
/* We have a known send size */ /* Ending with no response should not leave any content-length */
Super::write("Content-Length: ", 16); if (totalSize) {
writeUnsigned(totalSize); /* We have a known send size */
Super::write("\r\n\r\n", 4); Super::write("Content-Length: ", 16);
writeUnsigned(totalSize);
Super::write("\r\n\r\n", 4);
} else {
Super::write("\r\n", 2);
}
/* Mark end called */ /* Mark end called */
httpResponseData->state |= HttpResponseData<SSL>::HTTP_END_CALLED; httpResponseData->state |= HttpResponseData<SSL>::HTTP_END_CALLED;