blob: c074778a7db6ef57c87acf62b5f395cf4c5ab2d6 [file] [log] [blame]
Vitaly Buka4615e0d2015-10-14 15:35:12 -07001// Copyright 2015 The Weave Authors. All rights reserved.
Vitaly Buka7d556392015-08-13 20:06:48 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBWEAVE_SRC_DATA_ENCODING_H_
6#define LIBWEAVE_SRC_DATA_ENCODING_H_
7
8#include <string>
9#include <utility>
10#include <vector>
11
Vitaly Buka7d556392015-08-13 20:06:48 -070012namespace weave {
13
14using WebParamList = std::vector<std::pair<std::string, std::string>>;
15
16// Encode/escape string to be used in the query portion of a URL.
17// If |encodeSpaceAsPlus| is set to true, spaces are encoded as '+' instead
18// of "%20"
19std::string UrlEncode(const char* data, bool encodeSpaceAsPlus);
20
21inline std::string UrlEncode(const char* data) {
22 return UrlEncode(data, true);
23}
24
25// Decodes/unescapes a URL. Replaces all %XX sequences with actual characters.
26// Also replaces '+' with spaces.
27std::string UrlDecode(const char* data);
28
29// Converts a list of key-value pairs into a string compatible with
30// 'application/x-www-form-urlencoded' content encoding.
31std::string WebParamsEncode(const WebParamList& params, bool encodeSpaceAsPlus);
32
33inline std::string WebParamsEncode(const WebParamList& params) {
34 return WebParamsEncode(params, true);
35}
36
37// Parses a string of '&'-delimited key-value pairs (separated by '=') and
38// encoded in a way compatible with 'application/x-www-form-urlencoded'
39// content encoding.
40WebParamList WebParamsDecode(const std::string& data);
41
42// Encodes binary data using base64-encoding.
43std::string Base64Encode(const void* data, size_t size);
44
45// Encodes binary data using base64-encoding and wraps lines at 64 character
46// boundary using LF as required by PEM (RFC 1421) specification.
47std::string Base64EncodeWrapLines(const void* data, size_t size);
48
49// Decodes the input string from Base64.
Vitaly Bukaa04405e2015-08-13 18:28:14 -070050bool Base64Decode(const std::string& input, std::vector<uint8_t>* output);
Vitaly Buka7d556392015-08-13 20:06:48 -070051
Vitaly Bukaa04405e2015-08-13 18:28:14 -070052// Helper wrappers to use std::string and std::vector<uint8_t> as binary data
Vitaly Buka7d556392015-08-13 20:06:48 -070053// containers.
Vitaly Bukaa04405e2015-08-13 18:28:14 -070054inline std::string Base64Encode(const std::vector<uint8_t>& input) {
Vitaly Buka7d556392015-08-13 20:06:48 -070055 return Base64Encode(input.data(), input.size());
56}
Vitaly Bukaa04405e2015-08-13 18:28:14 -070057inline std::string Base64EncodeWrapLines(const std::vector<uint8_t>& input) {
Vitaly Buka7d556392015-08-13 20:06:48 -070058 return Base64EncodeWrapLines(input.data(), input.size());
59}
60inline std::string Base64Encode(const std::string& input) {
61 return Base64Encode(input.data(), input.size());
62}
63inline std::string Base64EncodeWrapLines(const std::string& input) {
64 return Base64EncodeWrapLines(input.data(), input.size());
65}
66inline bool Base64Decode(const std::string& input, std::string* output) {
Vitaly Bukaa04405e2015-08-13 18:28:14 -070067 std::vector<uint8_t> blob;
Vitaly Buka7d556392015-08-13 20:06:48 -070068 if (!Base64Decode(input, &blob))
69 return false;
70 *output = std::string{blob.begin(), blob.end()};
71 return true;
72}
73
74} // namespace weave
75
76#endif // LIBWEAVE_SRC_DATA_ENCODING_H_