browser(firefox): properly rewrite intercepted request (#3188)
This commit is contained in:
		
							parent
							
								
									a59220b06d
								
							
						
					
					
						commit
						14c6881904
					
				|  | @ -1,2 +1,2 @@ | |||
| 1142 | ||||
| Changed: yurys@chromium.org Mon Jul 27 16:21:29 PDT 2020 | ||||
| 1143 | ||||
| Changed: dgozman@gmail.com Mon Jul 27 17:30:53 PDT 2020 | ||||
|  |  | |||
|  | @ -215,29 +215,35 @@ class NetworkRequest { | |||
|     // interception and service workers.
 | ||||
|     // An internal redirect has the same channelId, inherits notificationCallbacks and
 | ||||
|     // listener, and should be used instead of an old channel.
 | ||||
| 
 | ||||
|     this._networkObserver._channelToRequest.delete(this.httpChannel); | ||||
|     this.httpChannel = newChannel; | ||||
|     this._networkObserver._channelToRequest.set(this.httpChannel, this); | ||||
|   } | ||||
| 
 | ||||
|     if (this._expectingResumedRequest) { | ||||
|   // Instrumentation called by NetworkObserver.
 | ||||
|   _onInternalRedirectReady() { | ||||
|     // Resumed request is first internally redirected to a new request,
 | ||||
|     // and then the new request is ready to be updated.
 | ||||
|     if (!this._expectingResumedRequest) | ||||
|       return; | ||||
|     const { method, headers, postData } = this._expectingResumedRequest; | ||||
|     this._expectingResumedRequest = undefined; | ||||
| 
 | ||||
|     if (headers) { | ||||
|         // Apply new request headers from interception resume.
 | ||||
|         for (const header of requestHeaders(newChannel)) | ||||
|           newChannel.setRequestHeader(header.name, '', false /* merge */); | ||||
|       for (const header of requestHeaders(this.httpChannel)) | ||||
|         this.httpChannel.setRequestHeader(header.name, '', false /* merge */); | ||||
|       for (const header of headers) | ||||
|           newChannel.setRequestHeader(header.name, header.value, false /* merge */); | ||||
|         this.httpChannel.setRequestHeader(header.name, header.value, false /* merge */); | ||||
|     } | ||||
|     if (method) | ||||
|         newChannel.requestMethod = method; | ||||
|       if (postData && newChannel instanceof Ci.nsIUploadChannel) { | ||||
|       this.httpChannel.requestMethod = method; | ||||
|     if (postData && this.httpChannel instanceof Ci.nsIUploadChannel2) { | ||||
|       const synthesized = Cc["@mozilla.org/io/string-input-stream;1"].createInstance(Ci.nsIStringInputStream); | ||||
|         synthesized.data = atob(postData); | ||||
|         newChannel.setUploadStream(synthesized, 'application/octet-stream', -1); | ||||
|       } | ||||
|       const body = atob(postData); | ||||
|       synthesized.setData(body, body.length); | ||||
|       // Clear content-length, so that upload stream resets it.
 | ||||
|       this.httpChannel.setRequestHeader('content-length', '', false /* merge */); | ||||
|       this.httpChannel.explicitSetUploadStream(synthesized, 'application/octet-stream', -1, this.httpChannel.requestMethod, false); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  | @ -646,10 +652,10 @@ class NetworkObserver { | |||
|       this._expectedRedirect.delete(channelId); | ||||
|       new NetworkRequest(this, httpChannel, redirectedFrom); | ||||
|     } else { | ||||
|       if (this._channelToRequest.has(httpChannel)) { | ||||
|         // This happens for resumed requests.
 | ||||
|         return; | ||||
|       } | ||||
|       const redirectedRequest = this._channelToRequest.get(httpChannel); | ||||
|       if (redirectedRequest) | ||||
|         redirectedRequest._onInternalRedirectReady(); | ||||
|       else | ||||
|         new NetworkRequest(this, httpChannel); | ||||
|     } | ||||
|   } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue