buffet: added url_utils

Added a bunch of utility functions to manipulate URLs. Stuff like
combining URLs, adding and extracting query parameters and so on.

BUG=None
TEST=New and old unit tests pass.

Change-Id: Ie8c76b611f9d985dc24aae22caf60cd22aac96a8
Reviewed-on: https://chromium-review.googlesource.com/195629
Tested-by: Alex Vakulenko <avakulenko@chromium.org>
Reviewed-by: Chris Sosa <sosa@chromium.org>
Commit-Queue: Alex Vakulenko <avakulenko@chromium.org>
diff --git a/buffet/device_registration_info.cc b/buffet/device_registration_info.cc
index c2b7780..20fbdf2 100644
--- a/buffet/device_registration_info.cc
+++ b/buffet/device_registration_info.cc
@@ -14,6 +14,7 @@
 #include "buffet/mime_utils.h"
 #include "buffet/string_utils.h"
 #include "buffet/data_encoding.h"
+#include "buffet/url_utils.h"
 
 using namespace chromeos::http;
 using namespace chromeos::data_encoding;
@@ -76,20 +77,11 @@
   return resp;
 }
 
-std::string BuildURL(std::string url,
-                     const std::string& subpath,
+std::string BuildURL(const std::string& url,
+                     const std::vector<std::string>& subpaths,
                      const WebParamList& params) {
-  if (!subpath.empty()) {
-    if (!url.empty() && url.back() != '/')
-      url += '/';
-    url += subpath;
-  }
-
-  if (!params.empty()) {
-    url += '?';
-    url += WebParamsEncode(params);
-  }
-  return url;
+  std::string result = chromeos::url::CombineMultiple(url, subpaths);
+  return chromeos::url::AppendQueryParams(result, params);
 }
 
 
@@ -104,22 +96,18 @@
 
 std::string DeviceRegistrationInfo::GetServiceURL(
     const std::string& subpath, const WebParamList& params) const {
-  return BuildURL(service_url_, subpath, params);
+  return BuildURL(service_url_, {subpath}, params);
 }
 
 std::string DeviceRegistrationInfo::GetDeviceURL(
     const std::string& subpath, const WebParamList& params) const {
   CHECK(!device_id_.empty()) << "Must have a valid device ID";
-  std::string path = "devices/" + device_id_;
-  if (!subpath.empty()) {
-    path += '/' + subpath;
-  }
-  return GetServiceURL(path, params);
+  return BuildURL(service_url_, {"devices", device_id_, subpath}, params);
 }
 
 std::string DeviceRegistrationInfo::GetOAuthURL(const std::string& subpath,
                                     const WebParamList& params) const {
-  return BuildURL(oauth_url_, subpath, params);
+  return BuildURL(oauth_url_, {subpath}, params);
 }
 
 std::string DeviceRegistrationInfo::GetDeviceId() {