headers.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. md.headers = ({storage: {state}, detect}) => {
  2. var callback = ({method, url, responseHeaders}) => {
  3. if (method !== 'GET') {
  4. return {responseHeaders}
  5. }
  6. var header = responseHeaders.find(({name}) => /^content-type/i.test(name)) || {}
  7. var origin = detect.match(url)
  8. if (!detect.header(header.value) && !origin) {
  9. return {responseHeaders}
  10. }
  11. if (origin.csp) {
  12. responseHeaders = responseHeaders
  13. .filter(({name}) => !/content-security-policy/i.test(name))
  14. }
  15. // ff: markdown `content-type` is not allowed
  16. if (/Firefox/.test(navigator.userAgent) && detect.header(header.value)) {
  17. header.value = 'text/plain'
  18. }
  19. if (origin.encoding && header.name) {
  20. var [media] = header.value.split(';')
  21. header.value = `${media}; charset=${origin.encoding}`
  22. }
  23. return {responseHeaders}
  24. }
  25. var filter = {
  26. urls: ['<all_urls>'],
  27. types: ['main_frame', 'sub_frame']
  28. }
  29. var options = ['blocking', 'responseHeaders']
  30. var add = () => {
  31. if (!chrome.webRequest.onHeadersReceived.hasListener(callback)) {
  32. chrome.webRequest.onHeadersReceived.addListener(callback, filter, options)
  33. }
  34. }
  35. var remove = () => {
  36. chrome.webRequest.onHeadersReceived.removeListener(callback, filter, options)
  37. }
  38. return {add, remove}
  39. }