| // Copyright 2015 The Weave Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef LIBWEAVE_SRC_DATA_ENCODING_H_ |
| #define LIBWEAVE_SRC_DATA_ENCODING_H_ |
| |
| #include <string> |
| #include <utility> |
| #include <vector> |
| |
| namespace weave { |
| |
| using WebParamList = std::vector<std::pair<std::string, std::string>>; |
| |
| // Encode/escape string to be used in the query portion of a URL. |
| // If |encodeSpaceAsPlus| is set to true, spaces are encoded as '+' instead |
| // of "%20" |
| std::string UrlEncode(const char* data, bool encodeSpaceAsPlus); |
| |
| inline std::string UrlEncode(const char* data) { |
| return UrlEncode(data, true); |
| } |
| |
| // Decodes/unescapes a URL. Replaces all %XX sequences with actual characters. |
| // Also replaces '+' with spaces. |
| std::string UrlDecode(const char* data); |
| |
| // Converts a list of key-value pairs into a string compatible with |
| // 'application/x-www-form-urlencoded' content encoding. |
| std::string WebParamsEncode(const WebParamList& params, bool encodeSpaceAsPlus); |
| |
| inline std::string WebParamsEncode(const WebParamList& params) { |
| return WebParamsEncode(params, true); |
| } |
| |
| // Parses a string of '&'-delimited key-value pairs (separated by '=') and |
| // encoded in a way compatible with 'application/x-www-form-urlencoded' |
| // content encoding. |
| WebParamList WebParamsDecode(const std::string& data); |
| |
| // Encodes binary data using base64-encoding. |
| std::string Base64Encode(const void* data, size_t size); |
| |
| // Encodes binary data using base64-encoding and wraps lines at 64 character |
| // boundary using LF as required by PEM (RFC 1421) specification. |
| std::string Base64EncodeWrapLines(const void* data, size_t size); |
| |
| // Decodes the input string from Base64. |
| bool Base64Decode(const std::string& input, std::vector<uint8_t>* output); |
| |
| // Helper wrappers to use std::string and std::vector<uint8_t> as binary data |
| // containers. |
| inline std::string Base64Encode(const std::vector<uint8_t>& input) { |
| return Base64Encode(input.data(), input.size()); |
| } |
| inline std::string Base64EncodeWrapLines(const std::vector<uint8_t>& input) { |
| return Base64EncodeWrapLines(input.data(), input.size()); |
| } |
| inline std::string Base64Encode(const std::string& input) { |
| return Base64Encode(input.data(), input.size()); |
| } |
| inline std::string Base64EncodeWrapLines(const std::string& input) { |
| return Base64EncodeWrapLines(input.data(), input.size()); |
| } |
| inline bool Base64Decode(const std::string& input, std::string* output) { |
| std::vector<uint8_t> blob; |
| if (!Base64Decode(input, &blob)) |
| return false; |
| *output = std::string{blob.begin(), blob.end()}; |
| return true; |
| } |
| |
| } // namespace weave |
| |
| #endif // LIBWEAVE_SRC_DATA_ENCODING_H_ |