aboutsummaryrefslogtreecommitdiffstats
path: root/icnet/utils/icnet_utils_uri.cc
diff options
context:
space:
mode:
Diffstat (limited to 'icnet/utils/icnet_utils_uri.cc')
-rw-r--r--icnet/utils/icnet_utils_uri.cc137
1 files changed, 137 insertions, 0 deletions
diff --git a/icnet/utils/icnet_utils_uri.cc b/icnet/utils/icnet_utils_uri.cc
new file mode 100644
index 00000000..8268bdf9
--- /dev/null
+++ b/icnet/utils/icnet_utils_uri.cc
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "icnet_utils_uri.h"
+#include "icnet_errors_runtime_exception.h"
+
+namespace icnet {
+
+namespace utils {
+
+Uri::Uri() {
+
+}
+
+Uri &Uri::parse(const std::string &uri) {
+ if (uri.length() == 0) {
+ throw errors::RuntimeException("Malformed URI.");
+ }
+
+ iterator_t uriEnd = uri.end();
+
+ // get query start
+ iterator_t queryStart = std::find(uri.begin(), uriEnd, '?');
+
+ // protocol
+ iterator_t protocolStart = uri.begin();
+ iterator_t protocolEnd = std::find(protocolStart, uriEnd, ':'); //"://");
+
+ if (protocolEnd != uriEnd) {
+ std::string prot = &*(protocolEnd);
+ if ((prot.length() > 3) && (prot.substr(0, 3) == "://")) {
+ protocol_ = std::string(protocolStart, protocolEnd);
+ protocolEnd += 3; // ://
+ } else {
+ protocolEnd = uri.begin(); // no protocol
+ }
+ } else {
+ protocolEnd = uri.begin(); // no protocol
+ }
+ // host
+ iterator_t hostStart = protocolEnd;
+ iterator_t pathStart = std::find(hostStart, uriEnd, '/'); // get pathStart
+
+ iterator_t hostEnd = std::find(protocolEnd,
+ (pathStart != uriEnd) ? pathStart : queryStart,
+ ':'); // check for port
+
+ locator_ = std::string(hostStart, hostEnd);
+
+ // port
+ if ((hostEnd != uriEnd) && ((&*(hostEnd))[0] == ':')) {
+ hostEnd++;
+ iterator_t portEnd = (pathStart != uriEnd) ? pathStart : queryStart;
+ port_ = std::string(hostEnd, portEnd);
+ }
+
+ // path
+ if (pathStart != uriEnd) {
+ path_ = std::string(pathStart, queryStart);
+ }
+ // query
+ if (queryStart != uriEnd) {
+ query_string_ = std::string(queryStart, uri.end());
+ }
+
+ return *this;
+
+}
+
+Uri &Uri::parseProtocolAndLocator(const std::string &locator) {
+
+ iterator_t total_end = locator.end();
+
+ // protocol
+ iterator_t protocol_start = locator.begin();
+ iterator_t protocol_end = std::find(protocol_start, total_end, ':'); //"://");
+
+ if (protocol_end != total_end) {
+ std::string prot = &*(protocol_end);
+ if ((prot.length() > 3) && (prot.substr(0, 3) == "://")) {
+ protocol_ = std::string(protocol_start, protocol_end);
+ protocol_end += 3; // ://
+ } else {
+ throw errors::RuntimeException("Malformed locator. (Missing \"://\")");
+ }
+ } else {
+ throw errors::RuntimeException("Malformed locator. No protocol specified.");
+ }
+
+ // locator
+ iterator_t host_start = protocol_end;
+ iterator_t host_end = std::find(protocol_end, total_end, '/');
+
+ if (host_start == host_end) {
+ throw errors::RuntimeException("Malformed locator. Locator name is missing");
+ }
+
+ locator_ = std::string(host_start, host_end);
+
+ return *this;
+}
+
+std::string Uri::getLocator() {
+ return locator_;
+}
+
+std::string Uri::getPath() {
+ return path_;
+}
+
+std::string Uri::getPort() {
+ return port_;
+}
+
+std::string Uri::getProtocol() {
+ return protocol_;
+}
+
+std::string Uri::getQueryString() {
+ return query_string_;
+}
+
+} // end namespace utils
+
+} // end namespace icnet \ No newline at end of file