aboutsummaryrefslogtreecommitdiffhomepage
path: root/node_modules/uws/src/Extensions.cpp
diff options
context:
space:
mode:
authorYaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx>2017-11-29 11:44:34 +0300
committerYaroslav De La Peña Smirnov <yaros.rus_89@live.com.mx>2017-11-29 11:44:34 +0300
commit67fdec20726e48ba3a934cb25bb30d47ec4a4f29 (patch)
tree37fd9f4f0b0c20103e1646fc83021e4765de3680 /node_modules/uws/src/Extensions.cpp
downloadspanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.tar.gz
spanish-checkers-67fdec20726e48ba3a934cb25bb30d47ec4a4f29.zip
Initial commit, version 0.5.3
Diffstat (limited to 'node_modules/uws/src/Extensions.cpp')
-rw-r--r--node_modules/uws/src/Extensions.cpp131
1 files changed, 131 insertions, 0 deletions
diff --git a/node_modules/uws/src/Extensions.cpp b/node_modules/uws/src/Extensions.cpp
new file mode 100644
index 0000000..ef8f9da
--- /dev/null
+++ b/node_modules/uws/src/Extensions.cpp
@@ -0,0 +1,131 @@
+#include "Extensions.h"
+
+namespace uWS {
+
+enum ExtensionTokens {
+ TOK_PERMESSAGE_DEFLATE = 1838,
+ TOK_SERVER_NO_CONTEXT_TAKEOVER = 2807,
+ TOK_CLIENT_NO_CONTEXT_TAKEOVER = 2783,
+ TOK_SERVER_MAX_WINDOW_BITS = 2372,
+ TOK_CLIENT_MAX_WINDOW_BITS = 2348
+};
+
+class ExtensionsParser {
+private:
+ int *lastInteger = nullptr;
+
+public:
+ bool perMessageDeflate = false;
+ bool serverNoContextTakeover = false;
+ bool clientNoContextTakeover = false;
+ int serverMaxWindowBits = 0;
+ int clientMaxWindowBits = 0;
+
+ int getToken(const char *&in, const char *stop);
+ ExtensionsParser(const char *data, size_t length);
+};
+
+int ExtensionsParser::getToken(const char *&in, const char *stop) {
+ while (!isalnum(*in) && in != stop) {
+ in++;
+ }
+
+ int hashedToken = 0;
+ while (isalnum(*in) || *in == '-' || *in == '_') {
+ if (isdigit(*in)) {
+ hashedToken = hashedToken * 10 - (*in - '0');
+ } else {
+ hashedToken += *in;
+ }
+ in++;
+ }
+ return hashedToken;
+}
+
+ExtensionsParser::ExtensionsParser(const char *data, size_t length) {
+ const char *stop = data + length;
+ int token = 1;
+ for (; token && token != TOK_PERMESSAGE_DEFLATE; token = getToken(data, stop));
+
+ perMessageDeflate = (token == TOK_PERMESSAGE_DEFLATE);
+ while ((token = getToken(data, stop))) {
+ switch (token) {
+ case TOK_PERMESSAGE_DEFLATE:
+ return;
+ case TOK_SERVER_NO_CONTEXT_TAKEOVER:
+ serverNoContextTakeover = true;
+ break;
+ case TOK_CLIENT_NO_CONTEXT_TAKEOVER:
+ clientNoContextTakeover = true;
+ break;
+ case TOK_SERVER_MAX_WINDOW_BITS:
+ serverMaxWindowBits = 1;
+ lastInteger = &serverMaxWindowBits;
+ break;
+ case TOK_CLIENT_MAX_WINDOW_BITS:
+ clientMaxWindowBits = 1;
+ lastInteger = &clientMaxWindowBits;
+ break;
+ default:
+ if (token < 0 && lastInteger) {
+ *lastInteger = -token;
+ }
+ break;
+ }
+ }
+}
+
+template <bool isServer>
+ExtensionsNegotiator<isServer>::ExtensionsNegotiator(int wantedOptions) {
+ options = wantedOptions;
+}
+
+template <bool isServer>
+std::string ExtensionsNegotiator<isServer>::generateOffer() {
+ std::string extensionsOffer;
+ if (options & Options::PERMESSAGE_DEFLATE) {
+ extensionsOffer += "permessage-deflate";
+
+ if (options & Options::CLIENT_NO_CONTEXT_TAKEOVER) {
+ extensionsOffer += "; client_no_context_takeover";
+ }
+
+ if (options & Options::SERVER_NO_CONTEXT_TAKEOVER) {
+ extensionsOffer += "; server_no_context_takeover";
+ }
+ }
+
+ return extensionsOffer;
+}
+
+template <bool isServer>
+void ExtensionsNegotiator<isServer>::readOffer(std::string offer) {
+ if (isServer) {
+ ExtensionsParser extensionsParser(offer.data(), offer.length());
+ if ((options & PERMESSAGE_DEFLATE) && extensionsParser.perMessageDeflate) {
+ if (extensionsParser.clientNoContextTakeover || (options & CLIENT_NO_CONTEXT_TAKEOVER)) {
+ options |= CLIENT_NO_CONTEXT_TAKEOVER;
+ }
+
+ if (extensionsParser.serverNoContextTakeover) {
+ options |= SERVER_NO_CONTEXT_TAKEOVER;
+ } else {
+ options &= ~SERVER_NO_CONTEXT_TAKEOVER;
+ }
+ } else {
+ options &= ~PERMESSAGE_DEFLATE;
+ }
+ } else {
+ // todo!
+ }
+}
+
+template <bool isServer>
+int ExtensionsNegotiator<isServer>::getNegotiatedOptions() {
+ return options;
+}
+
+template class ExtensionsNegotiator<true>;
+template class ExtensionsNegotiator<false>;
+
+}