diff --git a/scrapy/http/request/form.py b/scrapy/http/request/form.py index f7be9c088..01219de1e 100644 --- a/scrapy/http/request/form.py +++ b/scrapy/http/request/form.py @@ -56,10 +56,12 @@ class FormRequest(Request): for k, v in formdata.iteritems(): for v2 in v if hasattr(v, '__iter__') else [v]: form.new_control('text', k, {'value': v2}) - + if dont_click: url, body, headers = form._switch_click('request_data') else: url, body, headers = form.click_request_data(**(clickdata or {})) - return cls(url, method=form.method, body=body, headers=headers, **kwargs) + kwargs.setdefault('headers', {}).update(headers) + + return cls(url, method=form.method, body=body, **kwargs) diff --git a/scrapy/tests/test_http_request.py b/scrapy/tests/test_http_request.py index 6a89c5fee..6d2766a94 100644 --- a/scrapy/tests/test_http_request.py +++ b/scrapy/tests/test_http_request.py @@ -231,6 +231,21 @@ class FormRequestTest(RequestTest): self.assertEqual(fs['test2'].value, 'xxx') self.assertEqual(fs['six'].value, 'seven') + def test_from_response_extra_headers(self): + respbody = """ +
+ + + +
+ """ + headers = {"Accept-Encoding": "gzip,deflate"} + response = Response("http://www.example.com/this/list.html", body=respbody) + r1 = self.request_class.from_response(response, formdata={'one': ['two', 'three'], 'six': 'seven'}, headers=headers, callback=lambda x: x) + self.assertEqual(r1.method, 'POST') + self.assertEqual(r1.headers['Content-type'], 'application/x-www-form-urlencoded') + self.assertEqual(r1.headers['Accept-Encoding'], 'gzip,deflate') + def test_from_response_get(self): respbody = """