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