// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/40284755): Remove this and spanify to fix the errors. #pragma allow_unsafe_buffers #endif #include "net/http/http_content_disposition.h" #include <string_view> #include "base/base64.h" #include "base/check_op.h" #include "base/strings/escape.h" #include "base/strings/string_tokenizer.h" #include "base/strings/string_util.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "net/base/net_string_util.h" #include "net/http/http_util.h" namespace net { namespace { enum RFC2047EncodingType { … }; // Decodes a "Q" encoded string as described in RFC 2047 section 4.2. Similar to // decoding a quoted-printable string. Returns true if the input was valid. bool DecodeQEncoding(std::string_view input, std::string* output) { … } // Decodes a "Q" or "B" encoded string as per RFC 2047 section 4. The encoding // type is specified in |enc_type|. bool DecodeBQEncoding(std::string_view part, RFC2047EncodingType enc_type, const std::string& charset, std::string* output) { … } bool DecodeWord(std::string_view encoded_word, const std::string& referrer_charset, bool* is_rfc2047, std::string* output, int* parse_result_flags) { … } // Decodes the value of a 'filename' or 'name' parameter given as |input|. The // value is supposed to be of the form: // // value = token | quoted-string // // However we currently also allow RFC 2047 encoding and non-ASCII // strings. Non-ASCII strings are interpreted based on |referrer_charset|. bool DecodeFilenameValue(const std::string& input, const std::string& referrer_charset, std::string* output, int* parse_result_flags) { … } // Parses the charset and value-chars out of an ext-value string. // // ext-value = charset "'" [ language ] "'" value-chars bool ParseExtValueComponents(const std::string& input, std::string* charset, std::string* value_chars) { … } // http://tools.ietf.org/html/rfc5987#section-3.2 // // ext-value = charset "'" [ language ] "'" value-chars // // charset = "UTF-8" / "ISO-8859-1" / mime-charset // // mime-charset = 1*mime-charsetc // mime-charsetc = ALPHA / DIGIT // / "!" / "#" / "$" / "%" / "&" // / "+" / "-" / "^" / "_" / "`" // / "{" / "}" / "~" // // language = <Language-Tag, defined in [RFC5646], Section 2.1> // // value-chars = *( pct-encoded / attr-char ) // // pct-encoded = "%" HEXDIG HEXDIG // // attr-char = ALPHA / DIGIT // / "!" / "#" / "$" / "&" / "+" / "-" / "." // / "^" / "_" / "`" / "|" / "~" bool DecodeExtValue(const std::string& param_value, std::string* decoded) { … } } // namespace HttpContentDisposition::HttpContentDisposition( const std::string& header, const std::string& referrer_charset) { … } HttpContentDisposition::~HttpContentDisposition() = default; std::string::const_iterator HttpContentDisposition::ConsumeDispositionType( std::string::const_iterator begin, std::string::const_iterator end) { … } // http://tools.ietf.org/html/rfc6266 // // content-disposition = "Content-Disposition" ":" // disposition-type *( ";" disposition-parm ) // // disposition-type = "inline" | "attachment" | disp-ext-type // ; case-insensitive // disp-ext-type = token // // disposition-parm = filename-parm | disp-ext-parm // // filename-parm = "filename" "=" value // | "filename*" "=" ext-value // // disp-ext-parm = token "=" value // | ext-token "=" ext-value // ext-token = <the characters in token, followed by "*"> // void HttpContentDisposition::Parse(const std::string& header, const std::string& referrer_charset) { … } } // namespace net