xref: /aosp_15_r20/external/cronet/net/http/http_content_disposition.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <string>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace net {
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker class NET_EXPORT HttpContentDisposition {
15*6777b538SAndroid Build Coastguard Worker  public:
16*6777b538SAndroid Build Coastguard Worker   enum Type {
17*6777b538SAndroid Build Coastguard Worker     INLINE,
18*6777b538SAndroid Build Coastguard Worker     ATTACHMENT,
19*6777b538SAndroid Build Coastguard Worker   };
20*6777b538SAndroid Build Coastguard Worker 
21*6777b538SAndroid Build Coastguard Worker   // Properties of the Content-Disposition header. These flags are used to
22*6777b538SAndroid Build Coastguard Worker   // report download metrics in UMA. This enum isn't directly used in UMA but
23*6777b538SAndroid Build Coastguard Worker   // mapped to another one for binary compatiblity; ie. changes are OK.
24*6777b538SAndroid Build Coastguard Worker   enum ParseResultFlags {
25*6777b538SAndroid Build Coastguard Worker     INVALID = 0,
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker     // A valid disposition-type is present.
28*6777b538SAndroid Build Coastguard Worker     HAS_DISPOSITION_TYPE = 1 << 0,
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker     // The disposition-type is not 'inline' or 'attachment'.
31*6777b538SAndroid Build Coastguard Worker     HAS_UNKNOWN_DISPOSITION_TYPE = 1 << 1,
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker     // Has a valid non-empty 'filename' attribute.
34*6777b538SAndroid Build Coastguard Worker     HAS_FILENAME = 1 << 2,
35*6777b538SAndroid Build Coastguard Worker 
36*6777b538SAndroid Build Coastguard Worker     // Has a valid non-empty 'filename*' attribute.
37*6777b538SAndroid Build Coastguard Worker     HAS_EXT_FILENAME = 1 << 3,
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker     // The following fields are properties of the 'filename' attribute:
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker     // Quoted-string contains non-ASCII characters.
42*6777b538SAndroid Build Coastguard Worker     HAS_NON_ASCII_STRINGS = 1 << 4,
43*6777b538SAndroid Build Coastguard Worker 
44*6777b538SAndroid Build Coastguard Worker     // Quoted-string contains percent-encoding.
45*6777b538SAndroid Build Coastguard Worker     HAS_PERCENT_ENCODED_STRINGS = 1 << 5,
46*6777b538SAndroid Build Coastguard Worker 
47*6777b538SAndroid Build Coastguard Worker     // Quoted-string contains RFC 2047 encoded words.
48*6777b538SAndroid Build Coastguard Worker     HAS_RFC2047_ENCODED_STRINGS = 1 << 6,
49*6777b538SAndroid Build Coastguard Worker 
50*6777b538SAndroid Build Coastguard Worker     // Has a filename that starts with a single quote.
51*6777b538SAndroid Build Coastguard Worker     HAS_SINGLE_QUOTED_FILENAME = 1 << 7,
52*6777b538SAndroid Build Coastguard Worker   };
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   HttpContentDisposition(const std::string& header,
55*6777b538SAndroid Build Coastguard Worker                          const std::string& referrer_charset);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   HttpContentDisposition(const HttpContentDisposition&) = delete;
58*6777b538SAndroid Build Coastguard Worker   HttpContentDisposition& operator=(const HttpContentDisposition&) = delete;
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   ~HttpContentDisposition();
61*6777b538SAndroid Build Coastguard Worker 
is_attachment()62*6777b538SAndroid Build Coastguard Worker   bool is_attachment() const { return type() == ATTACHMENT; }
63*6777b538SAndroid Build Coastguard Worker 
type()64*6777b538SAndroid Build Coastguard Worker   Type type() const { return type_; }
filename()65*6777b538SAndroid Build Coastguard Worker   const std::string& filename() const { return filename_; }
66*6777b538SAndroid Build Coastguard Worker 
67*6777b538SAndroid Build Coastguard Worker   // A combination of ParseResultFlags values.
parse_result_flags()68*6777b538SAndroid Build Coastguard Worker   int parse_result_flags() const { return parse_result_flags_; }
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker  private:
71*6777b538SAndroid Build Coastguard Worker   void Parse(const std::string& header, const std::string& referrer_charset);
72*6777b538SAndroid Build Coastguard Worker   std::string::const_iterator ConsumeDispositionType(
73*6777b538SAndroid Build Coastguard Worker       std::string::const_iterator begin, std::string::const_iterator end);
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   Type type_ = INLINE;
76*6777b538SAndroid Build Coastguard Worker   std::string filename_;
77*6777b538SAndroid Build Coastguard Worker   int parse_result_flags_ = INVALID;
78*6777b538SAndroid Build Coastguard Worker };
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker }  // namespace net
81*6777b538SAndroid Build Coastguard Worker 
82*6777b538SAndroid Build Coastguard Worker #endif  // NET_HTTP_HTTP_CONTENT_DISPOSITION_H_
83