1// Copyright 2014 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef LIBBRILLO_BRILLO_URL_UTILS_H_
6#define LIBBRILLO_BRILLO_URL_UTILS_H_
7
8#include <string>
9#include <vector>
10
11#include <base/compiler_specific.h>
12#include <base/macros.h>
13#include <brillo/brillo_export.h>
14#include <brillo/data_encoding.h>
15
16namespace brillo {
17
18namespace url {
19
20// Appends a subpath to url and delimiting then with '/' if the path doesn't
21// end with it already. Also handles URLs with query parameters/fragment.
22BRILLO_EXPORT std::string Combine(
23    const std::string& url,
24    const std::string& subpath) WARN_UNUSED_RESULT;
25BRILLO_EXPORT std::string CombineMultiple(
26    const std::string& url,
27    const std::vector<std::string>& parts) WARN_UNUSED_RESULT;
28
29// Removes the query string/fragment from |url| and returns the query string.
30// This method actually modifies |url|. So, if you call it on this:
31//    http://www.test.org/?foo=bar
32// it will modify |url| to "http://www.test.org/" and return "?foo=bar"
33BRILLO_EXPORT std::string TrimOffQueryString(std::string* url);
34
35// Returns the query string, if available.
36// For example, for the following URL:
37//    http://server.com/path/to/object?k=v&foo=bar#fragment
38// Here:
39//    http://server.com/path/to/object - is the URL of the object,
40//    ?k=v&foo=bar                     - URL query string
41//    #fragment                        - URL fragment string
42// If |remove_fragment| is true, the function returns the query string without
43// the fragment. Otherwise the fragment is included as part of the result.
44BRILLO_EXPORT std::string GetQueryString(const std::string& url,
45                                         bool remove_fragment);
46
47// Parses the query string into a set of key-value pairs.
48BRILLO_EXPORT data_encoding::WebParamList GetQueryStringParameters(
49    const std::string& url);
50
51// Returns a value of the specified query parameter, or empty string if missing.
52BRILLO_EXPORT std::string GetQueryStringValue(
53    const std::string& url,
54    const std::string& name);
55BRILLO_EXPORT std::string GetQueryStringValue(
56    const data_encoding::WebParamList& params,
57    const std::string& name);
58
59// Removes the query string and/or a fragment part from URL.
60// If |remove_fragment| is specified, the fragment is also removed.
61// For example:
62//    http://server.com/path/to/object?k=v&foo=bar#fragment
63// true  -> http://server.com/path/to/object
64// false -> http://server.com/path/to/object#fragment
65BRILLO_EXPORT std::string RemoveQueryString(
66    const std::string& url,
67    bool remove_fragment) WARN_UNUSED_RESULT;
68
69// Appends a single query parameter to the URL.
70BRILLO_EXPORT std::string AppendQueryParam(
71    const std::string& url,
72    const std::string& name,
73    const std::string& value) WARN_UNUSED_RESULT;
74// Appends a list of query parameters to the URL.
75BRILLO_EXPORT std::string AppendQueryParams(
76    const std::string& url,
77    const data_encoding::WebParamList& params) WARN_UNUSED_RESULT;
78
79// Checks if the URL has query parameters.
80BRILLO_EXPORT bool HasQueryString(const std::string& url);
81
82}  // namespace url
83}  // namespace brillo
84
85#endif  // LIBBRILLO_BRILLO_URL_UTILS_H_
86