@@ -76,6 +76,8 @@ Main.prototype = {
7676 ] ;
7777
7878 browser . webRequest . onBeforeSendHeaders . addListener ( details => {
79+ let requestHeadersNeedOverride = [ ] ;
80+
7981 if ( details . type === 'xmlhttprequest' ) {
8082 let hasOriginHeader = false ;
8183 let hasReferer = false ;
@@ -87,7 +89,10 @@ Main.prototype = {
8789 hasReferer = true ;
8890
8991 if ( details . url . indexOf ( 'i.pximg.net' ) > - 1 && ! savePattern . test ( header . value ) ) {
90- details . requestHeaders [ i ] . value = 'https://www.pixiv.net/' ;
92+ requestHeadersNeedOverride . push ( {
93+ name : 'referer' ,
94+ value : 'https://www.pixiv.net/'
95+ } ) ;
9196 }
9297 } else if ( headerName === 'origin' ) {
9398 hasOriginHeader = true ;
@@ -96,39 +101,39 @@ Main.prototype = {
96101
97102 if ( details . url . indexOf ( 'api.fanbox.cc' ) > - 1 ) {
98103 if ( ! hasOriginHeader ) {
99- details . requestHeaders . push ( {
104+ requestHeadersNeedOverride . push ( {
100105 name : 'Origin' ,
101106 value : details . initiator ? details . initiator : 'https://www.fanbox.cc'
102107 } ) ;
103108 }
104109 }
105110
106111 if ( ! hasReferer ) {
107- details . requestHeaders . push ( {
112+ requestHeadersNeedOverride . push ( {
108113 name : 'referer' ,
109114 value : 'https://www.pixiv.net/'
110115 } ) ;
111116 }
112117
118+ if ( requestHeadersNeedOverride . length > 0 ) {
119+ this . overrideHttpHeaders ( details . requestHeaders , requestHeadersNeedOverride ) ;
120+ }
121+
113122 return { requestHeaders : details . requestHeaders }
114123 }
115124 } , {
116125 urls : filter
117126 } , opt_onBeforeSendHeaders_extraInfoSpec ) ;
118127
119128 browser . webRequest . onHeadersReceived . addListener ( details => {
120- let accessControlAllowOrigin = '*' ;
129+ let accessControlAllowOrigin = '*' ,
130+ responseHeadersNeedOverride = [ ] ;
121131
122132 if ( details . type === 'xmlhttprequest' ) {
123- details . responseHeaders . forEach ( ( header , i ) => {
124- if ( header . name . toLowerCase ( ) === 'access-control-allow-origin' ) {
125- details . responseHeaders . splice ( i , 1 ) ;
126- }
127- } ) ;
128-
129133 if ( details . frameId === 0 && / ^ h t t p s : \/ \/ [ ^ . ] + \. f a n b o x \. c c / . test ( details . initiator ) ) {
130134 accessControlAllowOrigin = details . initiator ;
131- details . responseHeaders . push ( {
135+
136+ responseHeadersNeedOverride . push ( {
132137 name : 'Access-Control-Allow-Credentials' ,
133138 value : 'true'
134139 } ) ;
@@ -140,28 +145,30 @@ Main.prototype = {
140145 if ( this . items . ugoiraConvertTool === 'ffmpeg' &&
141146 / ^ h t t p s : \/ \/ ( w w w \. ) ? p i x i v \. n e t \/ ( [ a - z \d \- _ ] * \/ ) ? a r t w o r k s / i. test ( details . url )
142147 ) {
143- details . responseHeaders . push ( {
148+ responseHeadersNeedOverride . push ( {
144149 name : 'Cross-Origin-Embedder-Policy' ,
145150 value : 'require-corp'
146151 } ) ;
147152
148- details . responseHeaders . push ( {
153+ responseHeadersNeedOverride . push ( {
149154 name : 'Cross-Origin-Opener-Policy' ,
150155 value : 'same-origin'
151156 } ) ;
152157 }
153158 }
154159
155- details . responseHeaders . push ( {
160+ responseHeadersNeedOverride . push ( {
156161 name : 'Cross-Origin-Resource-Policy' ,
157162 value : 'cross-origin'
158163 } ) ;
159164
160- details . responseHeaders . push ( {
165+ responseHeadersNeedOverride . push ( {
161166 name : 'Access-Control-Allow-Origin' ,
162167 value : accessControlAllowOrigin
163168 } ) ;
164169
170+ this . overrideHttpHeaders ( details . responseHeaders , responseHeadersNeedOverride ) ;
171+
165172 return { responseHeaders : details . responseHeaders } ;
166173 } , {
167174 urls : filter
@@ -216,6 +223,32 @@ Main.prototype = {
216223 } ) ;
217224 } ,
218225
226+ /**
227+ *
228+ * @param {{name: string, value: string}[] } headers
229+ * @param {{name: string, value: string}[] } headersNeedOverride
230+ * @returns {void }
231+ */
232+ overrideHttpHeaders ( headers , headersNeedOverride ) {
233+ let headerNames = headersNeedOverride . map ( header => header . name ) ;
234+
235+ /**
236+ * Let's keep thing simple, delete headers which are need to be
237+ * override first, then set new headers to the headers.
238+ */
239+ for ( let i = 0 ; headers [ i ] ; ) {
240+ if ( headerNames . indexOf ( headers [ i ] . name . toLowerCase ( ) ) >= 0 ) {
241+ headers . splice ( i , 1 ) ;
242+ } else {
243+ i ++ ;
244+ }
245+ }
246+
247+ /**
248+ */
249+ headersNeedOverride . forEach ( header => headers . push ( header ) ) ;
250+ } ,
251+
219252 /**
220253 * Update action icon
221254 */
0 commit comments