fix: restore Chromium default Content-Disposition header parsing (#43611)
		
	* fix: restore Chromium default Content-Disposition header parsing * Update api-web-request-spec.ts
This commit is contained in:
		
					parent
					
						
							
								f1019c2c4a
							
						
					
				
			
			
				commit
				
					
						0cc60500ed
					
				
			
		
					 2 changed files with 1 additions and 18 deletions
				
			
		| 
						 | 
					@ -21,7 +21,6 @@
 | 
				
			||||||
#include "gin/dictionary.h"
 | 
					#include "gin/dictionary.h"
 | 
				
			||||||
#include "gin/handle.h"
 | 
					#include "gin/handle.h"
 | 
				
			||||||
#include "gin/object_template_builder.h"
 | 
					#include "gin/object_template_builder.h"
 | 
				
			||||||
#include "net/http/http_content_disposition.h"
 | 
					 | 
				
			||||||
#include "shell/browser/api/electron_api_session.h"
 | 
					#include "shell/browser/api/electron_api_session.h"
 | 
				
			||||||
#include "shell/browser/api/electron_api_web_contents.h"
 | 
					#include "shell/browser/api/electron_api_web_contents.h"
 | 
				
			||||||
#include "shell/browser/api/electron_api_web_frame_main.h"
 | 
					#include "shell/browser/api/electron_api_web_frame_main.h"
 | 
				
			||||||
| 
						 | 
					@ -100,22 +99,6 @@ v8::Local<v8::Value> HttpResponseHeadersToV8(
 | 
				
			||||||
    std::string key;
 | 
					    std::string key;
 | 
				
			||||||
    std::string value;
 | 
					    std::string value;
 | 
				
			||||||
    while (headers->EnumerateHeaderLines(&iter, &key, &value)) {
 | 
					    while (headers->EnumerateHeaderLines(&iter, &key, &value)) {
 | 
				
			||||||
      // Note that Web servers not developed with nodejs allow non-utf8
 | 
					 | 
				
			||||||
      // characters in content-disposition's filename field. Use Chromium's
 | 
					 | 
				
			||||||
      // HttpContentDisposition class to decode the correct encoding instead of
 | 
					 | 
				
			||||||
      // arbitrarily converting it to UTF8. It should also be noted that if the
 | 
					 | 
				
			||||||
      // encoding is not specified, HttpContentDisposition will transcode
 | 
					 | 
				
			||||||
      // according to the system's encoding.
 | 
					 | 
				
			||||||
      if (base::EqualsCaseInsensitiveASCII("Content-Disposition", key) &&
 | 
					 | 
				
			||||||
          !value.empty()) {
 | 
					 | 
				
			||||||
        net::HttpContentDisposition header(value, std::string());
 | 
					 | 
				
			||||||
        std::string decodedFilename =
 | 
					 | 
				
			||||||
            header.is_attachment() ? " attachment" : " inline";
 | 
					 | 
				
			||||||
        // The filename must be encased in double quotes for serialization
 | 
					 | 
				
			||||||
        // to happen correctly.
 | 
					 | 
				
			||||||
        std::string filename = "\"" + header.filename() + "\"";
 | 
					 | 
				
			||||||
        value = decodedFilename + "; filename=" + filename;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      response_headers.EnsureList(key)->Append(value);
 | 
					      response_headers.EnsureList(key)->Append(value);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -474,7 +474,7 @@ describe('webRequest module', () => {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    it('does not change content-disposition header by default', async () => {
 | 
					    it('does not change content-disposition header by default', async () => {
 | 
				
			||||||
      ses.webRequest.onHeadersReceived((details, callback) => {
 | 
					      ses.webRequest.onHeadersReceived((details, callback) => {
 | 
				
			||||||
        expect(details.responseHeaders!['content-disposition']).to.deep.equal([' attachment; filename="aa中aa.txt"']);
 | 
					        expect(details.responseHeaders!['content-disposition']).to.deep.equal(['attachment; filename=aa中aa.txt']);
 | 
				
			||||||
        callback({});
 | 
					        callback({});
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      const { data, headers } = await ajax(defaultURL + 'contentDisposition');
 | 
					      const { data, headers } = await ajax(defaultURL + 'contentDisposition');
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue