xref: /aosp_15_r20/external/cronet/net/websockets/websocket_extension_parser.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_WEBSOCKETS_WEBSOCKET_EXTENSION_PARSER_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_WEBSOCKETS_WEBSOCKET_EXTENSION_PARSER_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <string>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker #include <vector>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/websockets/websocket_extension.h"
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace net {
18*6777b538SAndroid Build Coastguard Worker 
19*6777b538SAndroid Build Coastguard Worker class NET_EXPORT_PRIVATE WebSocketExtensionParser {
20*6777b538SAndroid Build Coastguard Worker  public:
21*6777b538SAndroid Build Coastguard Worker   WebSocketExtensionParser();
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker   WebSocketExtensionParser(const WebSocketExtensionParser&) = delete;
24*6777b538SAndroid Build Coastguard Worker   WebSocketExtensionParser& operator=(const WebSocketExtensionParser&) = delete;
25*6777b538SAndroid Build Coastguard Worker 
26*6777b538SAndroid Build Coastguard Worker   ~WebSocketExtensionParser();
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   // Parses the given string as a Sec-WebSocket-Extensions header value.
29*6777b538SAndroid Build Coastguard Worker   //
30*6777b538SAndroid Build Coastguard Worker   // There must be no newline characters in the input. LWS-concatenation must
31*6777b538SAndroid Build Coastguard Worker   // have already been done before calling this method.
32*6777b538SAndroid Build Coastguard Worker   //
33*6777b538SAndroid Build Coastguard Worker   // Returns true if the method was successful (no syntax error was found).
34*6777b538SAndroid Build Coastguard Worker   bool Parse(const char* data, size_t size);
Parse(const std::string & data)35*6777b538SAndroid Build Coastguard Worker   bool Parse(const std::string& data) {
36*6777b538SAndroid Build Coastguard Worker     return Parse(data.data(), data.size());
37*6777b538SAndroid Build Coastguard Worker   }
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // Returns the result of the last Parse() method call.
extensions()40*6777b538SAndroid Build Coastguard Worker   const std::vector<WebSocketExtension>& extensions() const {
41*6777b538SAndroid Build Coastguard Worker     return extensions_;
42*6777b538SAndroid Build Coastguard Worker   }
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker  private:
45*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool Consume(char c);
46*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool ConsumeExtension(WebSocketExtension* extension);
47*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool ConsumeExtensionParameter(
48*6777b538SAndroid Build Coastguard Worker       WebSocketExtension::Parameter* parameter);
49*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool ConsumeToken(std::string_view* token);
50*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool ConsumeQuotedToken(std::string* token);
51*6777b538SAndroid Build Coastguard Worker   void ConsumeSpaces();
52*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool Lookahead(char c);
53*6777b538SAndroid Build Coastguard Worker   [[nodiscard]] bool ConsumeIfMatch(char c);
54*6777b538SAndroid Build Coastguard Worker 
55*6777b538SAndroid Build Coastguard Worker   // The current position in the input string.
56*6777b538SAndroid Build Coastguard Worker   const char* current_;
57*6777b538SAndroid Build Coastguard Worker   // The pointer of the end of the input string.
58*6777b538SAndroid Build Coastguard Worker   const char* end_;
59*6777b538SAndroid Build Coastguard Worker   std::vector<WebSocketExtension> extensions_;
60*6777b538SAndroid Build Coastguard Worker };
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker }  // namespace net
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker #endif  // NET_WEBSOCKETS_WEBSOCKET_EXTENSION_PARSER_H_
65