Content-Disposition を無視する
- カテゴリ:
- ChromeExtension
- コメント数:
- Comments: 3
◆ レスポンスヘッダーを書き換えて Content-Disposition のダウンロード指定を無視する
レスポンスヘッダーで Content-Disposition が attachment という値だと画像やテキストファイルなどのブラウザで開けるものでもダウンロードされます
ブラウザで見れるものは基本ブラウザ上で表示してほしくて 強制ダウンロードはすごく迷惑です
ダウンロードしたいことのほうが稀なので ダウンロードしたいなら現在のページを名前をつけて保存を実行すれば十分です
そういう操作はユーザが決めることで サーバ側で強制される筋合い無いと思うんですよね
せめて a タグの download 属性にしておいてくれれば 右クリックから新しいタブで開くを実行すればダウンロードを回避できます
しかし サーバからのレスポンスで指定されていたら通常のブラウザの操作ではどう開いてもダウンロードされます
結構ストレスを感じたので Chrome Extension で強制的に無効化しました
やることは単純 レスポンスヘッダーを上書きします
manifest.json
background.js
chrome.webRequest.onHeadersReceived.addListener を使ってレスポンスヘッダー受信時に関数を実行します
blocking を設定することで同期処理になり動作を変更できます
responseHeaders を設定してレスポンスヘッダーを受け取ります
urls ではとりあえず全体の <all_urls> としましたが content-disposition を使うところなんてそれほど多くないですし 全リクエストに対してヘッダーチェックすると無駄が多いのでドメイン指定などでいいと思います
onHeadersReceived では content-disposition を探してあったらそれを削除し それをレスポンスヘッダーとします
強制指定がないので 通常のブラウザの判断に任せられます
ブラウザで見れるものは基本ブラウザ上で表示してほしくて 強制ダウンロードはすごく迷惑です
ダウンロードしたいことのほうが稀なので ダウンロードしたいなら現在のページを名前をつけて保存を実行すれば十分です
そういう操作はユーザが決めることで サーバ側で強制される筋合い無いと思うんですよね
せめて a タグの download 属性にしておいてくれれば 右クリックから新しいタブで開くを実行すればダウンロードを回避できます
しかし サーバからのレスポンスで指定されていたら通常のブラウザの操作ではどう開いてもダウンロードされます
結構ストレスを感じたので Chrome Extension で強制的に無効化しました
やることは単純 レスポンスヘッダーを上書きします
manifest.json
{
"manifest_version": 2,
"name": "no-download",
"description": "",
"version": "1.0",
"background":{
"scripts": ["background.js"]
},
"permissions": [ "<all_urls>", "webRequest", "webRequestBlocking" ]
}
background.js
function onHeadersReceived(details) {
const name = "content-disposition"
const headers = details.responseHeaders
const index = headers.findIndex(e => e.name.toLowerCase() === name)
if (index < 0) return
headers.splice(index, 1)
return { responseHeaders: headers }
}
chrome.webRequest.onHeadersReceived.addListener(
onHeadersReceived,
{ urls: ["<all_urls>"] },
["blocking", "responseHeaders"]
)
chrome.webRequest.onHeadersReceived.addListener を使ってレスポンスヘッダー受信時に関数を実行します
blocking を設定することで同期処理になり動作を変更できます
responseHeaders を設定してレスポンスヘッダーを受け取ります
urls ではとりあえず全体の <all_urls> としましたが content-disposition を使うところなんてそれほど多くないですし 全リクエストに対してヘッダーチェックすると無駄が多いのでドメイン指定などでいいと思います
onHeadersReceived では content-disposition を探してあったらそれを削除し それをレスポンスヘッダーとします
強制指定がないので 通常のブラウザの判断に任せられます