Fork of mbed-http

Fork of mbed-http by sandbox

Committer:
Jan Jongboom
Date:
Thu Mar 02 13:14:36 2017 +0100
Revision:
9:1289162d9530
Parent:
0:910f5949759f
If path is empty, default path to '/'. Otherwise HTTP requests become malformed on URLs without a path

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jan Jongboom 0:910f5949759f 1 /*
Jan Jongboom 0:910f5949759f 2 * PackageLicenseDeclared: Apache-2.0
Jan Jongboom 0:910f5949759f 3 * Copyright (c) 2017 ARM Limited
Jan Jongboom 0:910f5949759f 4 *
Jan Jongboom 0:910f5949759f 5 * Licensed under the Apache License, Version 2.0 (the "License");
Jan Jongboom 0:910f5949759f 6 * you may not use this file except in compliance with the License.
Jan Jongboom 0:910f5949759f 7 * You may obtain a copy of the License at
Jan Jongboom 0:910f5949759f 8 *
Jan Jongboom 0:910f5949759f 9 * http://www.apache.org/licenses/LICENSE-2.0
Jan Jongboom 0:910f5949759f 10 *
Jan Jongboom 0:910f5949759f 11 * Unless required by applicable law or agreed to in writing, software
Jan Jongboom 0:910f5949759f 12 * distributed under the License is distributed on an "AS IS" BASIS,
Jan Jongboom 0:910f5949759f 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Jan Jongboom 0:910f5949759f 14 * See the License for the specific language governing permissions and
Jan Jongboom 0:910f5949759f 15 * limitations under the License.
Jan Jongboom 0:910f5949759f 16 */
Jan Jongboom 0:910f5949759f 17
Jan Jongboom 0:910f5949759f 18 #ifndef _MBED_HTTP_PARSED_URL_H_
Jan Jongboom 0:910f5949759f 19 #define _MBED_HTTP_PARSED_URL_H_
Jan Jongboom 0:910f5949759f 20
Jan Jongboom 0:910f5949759f 21 #include "http_parser.h"
Jan Jongboom 0:910f5949759f 22
Jan Jongboom 0:910f5949759f 23 class ParsedUrl {
Jan Jongboom 0:910f5949759f 24 public:
Jan Jongboom 0:910f5949759f 25 ParsedUrl(const char* url) {
Jan Jongboom 0:910f5949759f 26 struct http_parser_url parsed_url;
Jan Jongboom 0:910f5949759f 27 http_parser_parse_url(url, strlen(url), false, &parsed_url);
Jan Jongboom 0:910f5949759f 28
Jan Jongboom 0:910f5949759f 29 for (size_t ix = 0; ix < UF_MAX; ix++) {
Jan Jongboom 9:1289162d9530 30 char* value;
Jan Jongboom 0:910f5949759f 31 if (parsed_url.field_set & (1 << ix)) {
Jan Jongboom 9:1289162d9530 32 value = (char*)calloc(parsed_url.field_data[ix].len + 1, 1);
Jan Jongboom 0:910f5949759f 33 memcpy((void*)value, url + parsed_url.field_data[ix].off,
Jan Jongboom 0:910f5949759f 34 parsed_url.field_data[ix].len);
Jan Jongboom 0:910f5949759f 35 }
Jan Jongboom 0:910f5949759f 36 else {
Jan Jongboom 9:1289162d9530 37 value = (char*)calloc(1, 1);
Jan Jongboom 0:910f5949759f 38 }
Jan Jongboom 0:910f5949759f 39
Jan Jongboom 0:910f5949759f 40 switch ((http_parser_url_fields)ix) {
Jan Jongboom 0:910f5949759f 41 case UF_SCHEMA: _schema = value; break;
Jan Jongboom 0:910f5949759f 42 case UF_HOST: _host = value; break;
Jan Jongboom 0:910f5949759f 43 case UF_PATH: _path = value; break;
Jan Jongboom 0:910f5949759f 44 case UF_QUERY: _query = value; break;
Jan Jongboom 0:910f5949759f 45 case UF_USERINFO: _userinfo = value; break;
Jan Jongboom 0:910f5949759f 46 default:
Jan Jongboom 0:910f5949759f 47 // PORT is already parsed, FRAGMENT is not relevant for HTTP requests
Jan Jongboom 0:910f5949759f 48 free((void*)value);
Jan Jongboom 0:910f5949759f 49 break;
Jan Jongboom 0:910f5949759f 50 }
Jan Jongboom 0:910f5949759f 51 }
Jan Jongboom 0:910f5949759f 52
Jan Jongboom 0:910f5949759f 53 _port = parsed_url.port;
Jan Jongboom 0:910f5949759f 54 if (!_port) {
Jan Jongboom 0:910f5949759f 55 if (strcmp(_schema, "https") == 0) {
Jan Jongboom 0:910f5949759f 56 _port = 443;
Jan Jongboom 0:910f5949759f 57 }
Jan Jongboom 0:910f5949759f 58 else {
Jan Jongboom 0:910f5949759f 59 _port = 80;
Jan Jongboom 0:910f5949759f 60 }
Jan Jongboom 0:910f5949759f 61 }
Jan Jongboom 9:1289162d9530 62
Jan Jongboom 9:1289162d9530 63 if (strcmp(_path, "") == 0) {
Jan Jongboom 9:1289162d9530 64 _path = (char*)calloc(2, 1);
Jan Jongboom 9:1289162d9530 65 _path[0] = '/';
Jan Jongboom 9:1289162d9530 66 }
Jan Jongboom 0:910f5949759f 67 }
Jan Jongboom 0:910f5949759f 68
Jan Jongboom 0:910f5949759f 69 ~ParsedUrl() {
Jan Jongboom 0:910f5949759f 70 if (_schema) free((void*)_schema);
Jan Jongboom 0:910f5949759f 71 if (_host) free((void*)_host);
Jan Jongboom 0:910f5949759f 72 if (_path) free((void*)_path);
Jan Jongboom 0:910f5949759f 73 if (_query) free((void*)_query);
Jan Jongboom 0:910f5949759f 74 if (_userinfo) free((void*)_userinfo);
Jan Jongboom 0:910f5949759f 75 }
Jan Jongboom 0:910f5949759f 76
Jan Jongboom 0:910f5949759f 77 uint16_t port() const { return _port; }
Jan Jongboom 9:1289162d9530 78 char* schema() const { return _schema; }
Jan Jongboom 9:1289162d9530 79 char* host() const { return _host; }
Jan Jongboom 9:1289162d9530 80 char* path() const { return _path; }
Jan Jongboom 9:1289162d9530 81 char* query() const { return _query; }
Jan Jongboom 9:1289162d9530 82 char* userinfo() const { return _userinfo; }
Jan Jongboom 0:910f5949759f 83
Jan Jongboom 0:910f5949759f 84 private:
Jan Jongboom 0:910f5949759f 85 uint16_t _port;
Jan Jongboom 9:1289162d9530 86 char* _schema;
Jan Jongboom 9:1289162d9530 87 char* _host;
Jan Jongboom 9:1289162d9530 88 char* _path;
Jan Jongboom 9:1289162d9530 89 char* _query;
Jan Jongboom 9:1289162d9530 90 char* _userinfo;
Jan Jongboom 0:910f5949759f 91 };
Jan Jongboom 0:910f5949759f 92
Jan Jongboom 0:910f5949759f 93 #endif // _MBED_HTTP_PARSED_URL_H_