blob: 543e8b30fadbd85295c20aa72266731404c88eff [file] [log] [blame]
achristensen@apple.comf69a42a2017-09-21 01:15:23 +00001/*
2 * Copyright (C) 2017 Apple Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#include <wtf/text/WTFString.h>
29
30namespace WebCore {
31
32class WEBCORE_EXPORT HTTPHeaderField {
33public:
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000034 static Optional<HTTPHeaderField> create(String&& name, String&& value);
achristensen@apple.com03f08922017-10-06 22:07:19 +000035
36 const String& name() const { return m_name; }
37 const String& value() const { return m_value; }
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000038
39 template<class Encoder> void encode(Encoder&) const;
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000040 template<class Decoder> static Optional<HTTPHeaderField> decode(Decoder&);
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000041
42private:
achristensen@apple.com03f08922017-10-06 22:07:19 +000043 HTTPHeaderField(String&& name, String&& value)
44 : m_name(WTFMove(name))
45 , m_value(WTFMove(value))
46 { }
47 String m_name;
48 String m_value;
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000049};
50
51template<class Encoder>
52void HTTPHeaderField::encode(Encoder& encoder) const
53{
achristensen@apple.com03f08922017-10-06 22:07:19 +000054 encoder << m_name;
55 encoder << m_value;
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000056}
57
58template<class Decoder>
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000059Optional<HTTPHeaderField> HTTPHeaderField::decode(Decoder& decoder)
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000060{
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000061 Optional<String> name;
achristensen@apple.com03f08922017-10-06 22:07:19 +000062 decoder >> name;
63 if (!name)
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000064 return WTF::nullopt;
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000065
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000066 Optional<String> value;
achristensen@apple.com03f08922017-10-06 22:07:19 +000067 decoder >> value;
68 if (!value)
cdumez@apple.com8b7a0222018-12-20 04:41:11 +000069 return WTF::nullopt;
achristensen@apple.com03f08922017-10-06 22:07:19 +000070
71 return {{ WTFMove(*name), WTFMove(*value) }};
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000072}
73
commit-queue@webkit.org50751972018-05-15 19:24:30 +000074namespace RFC7230 {
75bool isTokenCharacter(UChar);
76bool isWhitespace(UChar);
aperez@igalia.com5719df92019-09-13 07:57:55 +000077bool isCommentText(UChar);
78bool isQuotedPairSecondOctet(UChar);
79bool isDelimiter(UChar);
commit-queue@webkit.org50751972018-05-15 19:24:30 +000080} // namespace RFC7230
81
achristensen@apple.comf69a42a2017-09-21 01:15:23 +000082} // namespace WebCore