// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_BASE_APPLE_HTTP_RESPONSE_HEADERS_UTIL_H_ #define NET_BASE_APPLE_HTTP_RESPONSE_HEADERS_UTIL_H_ #include "net/base/net_export.h" #include "net/http/http_response_headers.h" @class NSHTTPURLResponse; namespace net { // Placeholder status description since the actual text from the headers is not // available. extern const char kDummyHttpStatusDescription[]; // Tries to decode `string` as if it was a "utf-8" encoded string incorrectly // decoded as "latin1" encoded string. Returns the original string if it does // not appear to be a mis-decoded string. // // HTTP headers have no encoding, but NSHTTPURLResponse decode them as if they // were using "latin1" encoding as the rfc recommends (see [1]). Servers do // sometime sends data in "utf-8" encoding. Interpreting "utf-8" encoded string // as "latin1" results in garbled characters as soon as the string contains non // US-ASCII characters (aka mojibake). Hopefully, this incorrect decoding is // reversible as "latin1" maps each bytes to the same unicode character (i.e. // byte '\xab' maps to '\u00ab'). See [2] for example of a web server serving // "utf-8" encoded string incorrectly decoded. // // [1]: https://www.rfc-editor.org/rfc/rfc7230#section-3.2.4. // [2]: https://crbug.com/1333351 NET_EXPORT NSString* FixNSStringIncorrectlyDecodedAsLatin1(NSString* string); // Constructs a net::HttpResponseHeaders from |response|. // Note: The HTTP version and the status code description are not accessible // from NSHTTPURLResponse, so HTTP/1.0 and kDummyHttpStatusDescription will // be used in the status line instead. NET_EXPORT scoped_refptr CreateHeadersFromNSHTTPURLResponse(NSHTTPURLResponse* response); } // namespace net #endif // NET_BASE_APPLE_HTTP_RESPONSE_HEADERS_UTIL_H_