1/*
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:
34 static Optional<HTTPHeaderField> create(String&& name, String&& value);
35
36 const String& name() const { return m_name; }
37 const String& value() const { return m_value; }
38
39 template<class Encoder> void encode(Encoder&) const;
40 template<class Decoder> static Optional<HTTPHeaderField> decode(Decoder&);
41
42private:
43 HTTPHeaderField(String&& name, String&& value)
44 : m_name(WTFMove(name))
45 , m_value(WTFMove(value))
46 { }
47 String m_name;
48 String m_value;
49};
50
51template<class Encoder>
52void HTTPHeaderField::encode(Encoder& encoder) const
53{
54 encoder << m_name;
55 encoder << m_value;
56}
57
58template<class Decoder>
59Optional<HTTPHeaderField> HTTPHeaderField::decode(Decoder& decoder)
60{
61 Optional<String> name;
62 decoder >> name;
63 if (!name)
64 return WTF::nullopt;
65
66 Optional<String> value;
67 decoder >> value;
68 if (!value)
69 return WTF::nullopt;
70
71 return {{ WTFMove(*name), WTFMove(*value) }};
72}
73
74namespace RFC7230 {
75bool isTokenCharacter(UChar);
76bool isWhitespace(UChar);
77} // namespace RFC7230
78
79} // namespace WebCore
80