android 6.0 以下的 MediaPlayer 居然不能攜帶 http headers Referer

此文版權屬於作者所有,任何人、媒體或者網站轉載、借用都必須徵得作者本人同意!

今天測試 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 的源碼就沒有這個邏輯,坑爹啊。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章