1
#pragma once
2

            
3
#include <map>
4
#include <string>
5
#include <vector>
6

            
7
#include "envoy/http/header_map.h"
8

            
9
#include "absl/container/btree_map.h"
10
#include "absl/strings/string_view.h"
11
#include "absl/types/optional.h"
12

            
13
namespace Envoy {
14
namespace Http {
15
namespace Utility {
16

            
17
using QueryParamsVector = std::vector<std::pair<std::string, std::string>>;
18

            
19
class QueryParamsMulti {
20
private:
21
  absl::btree_map<std::string, std::vector<std::string>> data_;
22

            
23
public:
24
  void remove(absl::string_view key);
25
  void add(absl::string_view key, absl::string_view value);
26
  void overwrite(absl::string_view key, absl::string_view value);
27
  std::string toString() const;
28
  std::string replaceQueryString(const HeaderString& path) const;
29
  absl::optional<std::string> getFirstValue(absl::string_view key) const;
30

            
31
776
  const absl::btree_map<std::string, std::vector<std::string>>& data() const { return data_; }
32

            
33
  static QueryParamsMulti parseParameters(absl::string_view data, size_t start, bool decode_params);
34
  static QueryParamsMulti parseQueryString(absl::string_view url);
35
  static QueryParamsMulti parseAndDecodeQueryString(absl::string_view url);
36
};
37

            
38
} // namespace Utility
39
} // namespace Http
40
} // namespace Envoy