WPILibC++ 2027.0.0-alpha-4
Loading...
Searching...
No Matches
UrlParser.hpp
Go to the documentation of this file.
1// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
4
5#pragma once
6
7#include <string_view>
8
10#include "wpi/util/StringExtras.hpp"
11
12namespace wpi::net {
13
14/**
15 * Parses a URL into its constituent components.
16 * `schema://userinfo@host:port/the/path?query#fragment`
17 */
18class UrlParser {
19 public:
20 /**
21 * Parse a URL.
22 * @param in input
23 * @param isConnect
24 */
25 UrlParser(std::string_view in, bool isConnect) {
26 m_data = in;
28 m_error = http_parser_parse_url(in.data(), in.size(), isConnect, &m_url);
29 }
30
31 /**
32 * Determine if the URL is valid (e.g. the parse was successful).
33 */
34 bool IsValid() const { return !m_error; }
35
36 bool HasSchema() const { return (m_url.field_set & (1 << UF_SCHEMA)) != 0; }
37
38 bool HasHost() const { return (m_url.field_set & (1 << UF_HOST)) != 0; }
39
40 bool HasPort() const { return (m_url.field_set & (1 << UF_PORT)) != 0; }
41
42 bool HasPath() const { return (m_url.field_set & (1 << UF_PATH)) != 0; }
43
44 bool HasQuery() const { return (m_url.field_set & (1 << UF_QUERY)) != 0; }
45
46 bool HasFragment() const {
47 return (m_url.field_set & (1 << UF_FRAGMENT)) != 0;
48 }
49
50 bool HasUserInfo() const {
51 return (m_url.field_set & (1 << UF_USERINFO)) != 0;
52 }
53
54 std::string_view GetSchema() const {
55 return wpi::util::substr(m_data, m_url.field_data[UF_SCHEMA].off,
56 m_url.field_data[UF_SCHEMA].len);
57 }
58
59 std::string_view GetHost() const {
60 return wpi::util::substr(m_data, m_url.field_data[UF_HOST].off,
61 m_url.field_data[UF_HOST].len);
62 }
63
64 unsigned int GetPort() const { return m_url.port; }
65
66 std::string_view GetPath() const {
67 return wpi::util::substr(m_data, m_url.field_data[UF_PATH].off,
68 m_url.field_data[UF_PATH].len);
69 }
70
71 std::string_view GetQuery() const {
72 return wpi::util::substr(m_data, m_url.field_data[UF_QUERY].off,
73 m_url.field_data[UF_QUERY].len);
74 }
75
76 std::string_view GetFragment() const {
77 return wpi::util::substr(m_data, m_url.field_data[UF_FRAGMENT].off,
78 m_url.field_data[UF_FRAGMENT].len);
79 }
80
81 std::string_view GetUserInfo() const {
82 return wpi::util::substr(m_data, m_url.field_data[UF_USERINFO].off,
83 m_url.field_data[UF_USERINFO].len);
84 }
85
86 private:
87 bool m_error;
88 std::string_view m_data;
89 http_parser_url m_url;
90};
91
92} // namespace wpi::net
std::string_view GetPath() const
Definition UrlParser.hpp:66
UrlParser(std::string_view in, bool isConnect)
Parse a URL.
Definition UrlParser.hpp:25
bool HasFragment() const
Definition UrlParser.hpp:46
std::string_view GetFragment() const
Definition UrlParser.hpp:76
bool HasSchema() const
Definition UrlParser.hpp:36
bool HasPath() const
Definition UrlParser.hpp:42
std::string_view GetQuery() const
Definition UrlParser.hpp:71
bool HasPort() const
Definition UrlParser.hpp:40
std::string_view GetSchema() const
Definition UrlParser.hpp:54
std::string_view GetHost() const
Definition UrlParser.hpp:59
bool IsValid() const
Determine if the URL is valid (e.g.
Definition UrlParser.hpp:34
unsigned int GetPort() const
Definition UrlParser.hpp:64
bool HasQuery() const
Definition UrlParser.hpp:44
bool HasHost() const
Definition UrlParser.hpp:38
bool HasUserInfo() const
Definition UrlParser.hpp:50
std::string_view GetUserInfo() const
Definition UrlParser.hpp:81
Definition raw_socket_ostream.hpp:9
@ UF_QUERY
Definition http_parser.hpp:332
@ UF_USERINFO
Definition http_parser.hpp:334
@ UF_SCHEMA
Definition http_parser.hpp:328
@ UF_HOST
Definition http_parser.hpp:329
@ UF_PORT
Definition http_parser.hpp:330
@ UF_FRAGMENT
Definition http_parser.hpp:333
@ UF_PATH
Definition http_parser.hpp:331
void http_parser_url_init(struct http_parser_url *u)
int http_parser_parse_url(const char *buf, size_t buflen, int is_connect, struct http_parser_url *u)
Definition http_parser.hpp:346