此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!
今天测试 android MediaPlayer,发现居然发出的 http 请求不能携带 Referer,测试代码如下:
Uri uri = Uri.parse("http://100.84.44.221:8001/12418.mp4");
HashMap<String, String> headers = new HashMap<String, String>();
headers.put("Referer", "http://100.84.44.221:8001/play13967.html");
headers.put("User-Agent", "User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-CN; GT-N7100 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/40.0.2214.89 UCBrowser/11.2.0.880 Mobile Safari/537.36");
try {
mediaPlayer.setDataSource(surfaceView.getContext(), uri, headers);
if (mPendingPlay)
mediaPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
在 http 服务器这边,发现发过来的 http request headers 有 User-Agent 没有 Referer,用 4.1,4.4 手机测试都没有,用 6.0 的手机测试有。翻 android 源码,果然是系统搞的,源码如下:
// android 4.1.2
// /external/chromium/net/http/http_network_transaction.cc
void HttpNetworkTransaction::BuildRequestHeaders(bool using_proxy) {
// ...
static const char* const kExtraHeadersToBeStripped[] = {
"Referer"
};
HttpRequestHeaders stripped_extra_headers;
stripped_extra_headers.CopyFrom(request_->extra_headers);
for (size_t i = 0; i < arraysize(kExtraHeadersToBeStripped); ++i)
stripped_extra_headers.RemoveHeader(kExtraHeadersToBeStripped[i]);
// android 4.4.x 5.x
// /external/chromium_org/net/url_request/url_request_http_job.cc
void URLRequestHttpJob::Start() {
// ...
request_info_.extra_headers.RemoveHeader(HttpRequestHeaders::kReferer);
翻 android 6.0 的源码就没有这个逻辑,坑爹啊。