blob: c074778a7db6ef57c87acf62b5f395cf4c5ab2d6 [file] [log] [blame]
// 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.
#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.size());
inline std::string Base64EncodeWrapLines(const std::vector<uint8_t>& input) {
return Base64EncodeWrapLines(, input.size());
inline std::string Base64Encode(const std::string& input) {
return Base64Encode(, input.size());
inline std::string Base64EncodeWrapLines(const std::string& input) {
return Base64EncodeWrapLines(, 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