| // 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_ |