做钢材销售客户哪里去开发网站,哈尔滨seo排名优化公司价格,触摸屏网站建设,网站设计价钱1、请求未携带 Accept-Language http header 出现图片加载失败
现象#xff1a; 访问 https://www.huawei.com/cn/?ic_mediumdirectic_sourcesurlent 时出现图片加载失败的问题 预期结果#xff1a;
原因#xff1a; 网络库删除了添加 Accept-Language header 的逻…1、请求未携带 Accept-Language http header 出现图片加载失败
现象 访问 https://www.huawei.com/cn/?ic_mediumdirectic_sourcesurlent 时出现图片加载失败的问题 预期结果
原因 网络库删除了添加 Accept-Language header 的逻辑华为商城站点的图片 server 发现请求未携带该 header 直接返回403。
解决方案 补充对该 header 的添加逻辑请求未携带该 header 时网络库自动根据手机设置的语言环境添加。 (NSString*)getAcceptLanguagesFromPreferredLanguages:(NSArrayNSString**)languages {NSMutableArray* acceptLanguages [NSMutableArray new];for (NSString* lang_region in languages) {NSString* lang [lang_region componentsSeparatedByString:-][0];if ([lang_region rangeOfString:zh-Hans-CN].location ! NSNotFound) {lang zh-CN;} else if ([lang_region rangeOfString:zh-Hant-].location ! NSNotFound) {// 台湾、香港、澳门、繁体统一用繁体lang zh-TW;}NSString* localeAcceptLangs acceptLangs[lang_region] ?: acceptLangs[lang];if (localeAcceptLangs)[acceptLanguagesaddObjectsFromArray:[localeAcceptLangscomponentsSeparatedByString:,]];}NSString* acceptLanguageString [[[NSOrderedSet orderedSetWithArray:acceptLanguages] array]componentsJoinedByString:,];return [acceptLanguageString length] ! 0 ? acceptLanguageString: en-US,en;
} (NSString*)getAcceptLanguages {return [selfgetAcceptLanguagesFromPreferredLanguages:[NSLocale preferredLanguages]];
}2、server 下发多个 content-type 时出现页面乱码
正常情况下 server 下发的 content-type 只有一个但少数不规范站点下发了多个且互斥的 value而预期的可能是最后一个而 在该情况下cronet 一般只会取第一个 value 返回因此可能出现页面乱码的问题
// 不规范content-type示例该 header 会引起下面的乱码页面
content-type: text/html; charsetutf-8, text/html; charsetgbk 解决方案 修改 ios/net/protocol_handler_util.mm 的 GetNSURLResponseForRequest 方法中处理 content-type 的部分针对域名分策略处理比如策略一cronet 将 server 下发的所有 content-type 返回给上层策略二cronet 将最后一个 content-type 返回给上册否则按默认处理即只返回第一个。 cronet 官方源码https://source.chromium.org/chromium/chromium/src//main:ios/net/protocol_handler_util.mm;l132
3、业务请求携带的 referer header 过长导致页面白屏问题
当请求携带的 referer 过长时 4KBcronet 会移除该 header如果server 端认为未携带 referer 的请求非法时会导致请求失败从而出现浏览器页面白屏现象。
解决方案 在 net/url_request/url_request.cc 的 URLRequest::StartJob 方法中处理 referer 的部分增加域名白名单机制域名白名单的域名在出现 referer 过长时将 referer 改为仅保留 host 信息而不是全部删除例如
过长 refererhttps://source.chromium.org/chromium/chromium/src//main:net/url_request/url_request.cc假设它超过 4KB
处理后 refererhttps://source.chromium.org关于 http referer 长度限制原因 主流浏览器对上述长度限制的支持情况
4、server 与客户端压缩算法协商不一致出现访问错误
现象 访问 www.berkshirehathaway.com 站点出现失败情况 原因 网络库在设置 accept-encoding 时未添加 br 压缩的支持而 server 响应的内容为 br 压缩的因此出现该错误页面。cronet 对应的内部错误码为 -330
// Content decoding of the response body failed.
NET_ERROR(CONTENT_DECODING_FAILED, -330)需要修改 net/http/http_network_transaction.cc 文件 HttpNetworkTransaction::ContentEncodingsValid 方法如果 server 响应内容为br 压缩而请求未支持 br 时按 br 解压 ...// Temporary workaround for http://crbug.com/714514if (headers-IsRedirect(nullptr)) {return true;}/* 以下为修复代码 */if (!result (content_encoding.find(br) ! std::string::npos) (accept_encoding.find(br) std::string::npos)) {result true;}