Fork of mbed-http
Fork of mbed-http by
Diff: source/http_parsed_url.h
- Revision:
- 0:910f5949759f
- Child:
- 9:1289162d9530
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/source/http_parsed_url.h Thu Feb 16 11:35:56 2017 +0100 @@ -0,0 +1,88 @@ +/* + * PackageLicenseDeclared: Apache-2.0 + * Copyright (c) 2017 ARM Limited + * + * 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. + */ + +#ifndef _MBED_HTTP_PARSED_URL_H_ +#define _MBED_HTTP_PARSED_URL_H_ + +#include "http_parser.h" + +class ParsedUrl { +public: + ParsedUrl(const char* url) { + struct http_parser_url parsed_url; + http_parser_parse_url(url, strlen(url), false, &parsed_url); + + for (size_t ix = 0; ix < UF_MAX; ix++) { + const char* value; + if (parsed_url.field_set & (1 << ix)) { + value = (const char*)calloc(parsed_url.field_data[ix].len + 1, 1); + memcpy((void*)value, url + parsed_url.field_data[ix].off, + parsed_url.field_data[ix].len); + } + else { + value = (const char*)calloc(1, 1); + } + + switch ((http_parser_url_fields)ix) { + case UF_SCHEMA: _schema = value; break; + case UF_HOST: _host = value; break; + case UF_PATH: _path = value; break; + case UF_QUERY: _query = value; break; + case UF_USERINFO: _userinfo = value; break; + default: + // PORT is already parsed, FRAGMENT is not relevant for HTTP requests + free((void*)value); + break; + } + } + + _port = parsed_url.port; + if (!_port) { + if (strcmp(_schema, "https") == 0) { + _port = 443; + } + else { + _port = 80; + } + } + } + + ~ParsedUrl() { + if (_schema) free((void*)_schema); + if (_host) free((void*)_host); + if (_path) free((void*)_path); + if (_query) free((void*)_query); + if (_userinfo) free((void*)_userinfo); + } + + uint16_t port() const { return _port; } + const char* schema() const { return _schema; } + const char* host() const { return _host; } + const char* path() const { return _path; } + const char* query() const { return _query; } + const char* userinfo() const { return _userinfo; } + +private: + uint16_t _port; + const char* _schema; + const char* _host; + const char* _path; + const char* _query; + const char* _userinfo; +}; + +#endif // _MBED_HTTP_PARSED_URL_H_