前提
諸事情でFirefoxのWebExtensionsを作成しております。
内容は、任意のURLに対するリクエストをブロックして、リクエストヘッダを改変して送信を再開するといったようなものです。イメージとしてはBurpSuiteやOwaspZAPなどのInterceptorの簡易版です。以下にソースコードを提示いたします。
該当のソースコード
manifest.json
JSON
1{ 2 "description": "test request", 3 "manifest_version": 2, 4 "name": "requests", 5 "version": "1.0", 6 "permissions": [ 7 "webRequest", 8 "webRequestBlocking", 9 "<all_urls>" 10 ], 11 "background": { 12 "scripts": ["background.js"] 13 }, 14 "content_scripts": [ 15 { 16 "matches": ["<all_urls>"], 17 "js": ["content_script.js"] 18 } 19 ] 20} 21
content_script.js
javascript
1function doSomething(headers) { 2 return headers; 3} 4 5var p = browser.runtime.connect({name:"test-requets"}); 6p.onMessage.addListener((m) => { 7 console.log("From background:"); 8 console.dir(m.headers); 9 edited_headers = doSomething(m.headers); 10 p.postMessage({edited_headers:edited_headers}); 11});
background.js
javascript
1var p = undefined; 2 3function modifyRequest(e) { 4 let edited_headers = undefined; 5 p.postMessage({headers:e.requestHeaders}); 6 p.onMessage.addListener((m) => { 7 console.log("From content_script:"); 8 console.dir(m.edited_headers); 9 edited_headers = m.edited_headers; 10 }); 11 // ここでcontent_scriptからのメッセージが届くまで待ちたい 12 if (edited_headers===undefined) { 13 console.log("Can't wait!"); 14 } 15 return {requestHeaders: edited_headers}; 16} 17 18browser.webRequest.onBeforeSendHeaders.addListener( 19 modifyRequest, 20 {urls: ["<all_urls>"]}, 21 ["blocking", "requestHeaders"] 22); 23 24browser.runtime.onConnect.addListener((csPort) => { 25 p = csPort; 26});
フロー
- backgroundとcontent_scriptを接続
- backgroundでキャプチャしたリクエストヘッダをcontent_scriptへ送信
- content_scriptでヘッダを改変(doSomething)し、backgroundへ送り返す
- 編集済のヘッダを返して、リクエストを再開
質問
- backgroundから送信した後、非同期処理のためにcontent_scriptからのメッセージを受信する前にヘッダを返してしまいます。ここでなんとかcontent_scriptからのメッセージが届くまで待てないでしょうか。
- そもそもfirefoxの拡張機能でやれる範疇を越えているのでしょうか。
他なにかご指摘等ございましたら、お伝えいただけると幸いです。
あなたの回答
tips
プレビュー