Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Won't Fix
-
None
-
None
Description
Script to reproduce:
import pprint import requests body = [ b'--996713c691ec4fd5b717ef2740893b78\r\n', b'Content-Type: application/json\r\n', b'\r\n', b'{"_id": "test","_attachments": {"foo": {"follows": true, "content_type": "text/plain", "length": 12}}}\r\n', b'--996713c691ec4fd5b717ef2740893b78\r\n', b'Content-Type: text/plain\r\n' b'Content-Disposition: attachment;filename="foo"\r\n' b'Content-Length: 12\r\n' b'\r\n', b'Time to Relax!', b'--996713c691ec4fd5b717ef2740893b78--\r\n' ] url = 'http://localhost:5984/db/test' headers = { 'Content-Type': 'multipart/related; boundary="996713c691ec4fd5b717ef2740893b78"' } resp = requests.put(url, headers=headers, data=iter(body)) pprint.pprint(resp.json())
This runs a request:
PUT /db/test HTTP/1.1 Host: localhost:5984 Accept-Encoding: gzip, deflate Transfer-Encoding: chunked User-Agent: python-requests/2.3.0 CPython/3.4.1 Linux/3.15.5-gentoo Accept: */* Content-Type: multipart/related; boundary="996713c691ec4fd5b717ef2740893b78" 24 --996713c691ec4fd5b717ef2740893b78 20 Content-Type: application/json 2 68 {"_id": "test","_attachments": {"foo": {"follows": true, "content_type": "text/plain", "length": 14}}} 24 --996713c691ec4fd5b717ef2740893b78 60 Content-Type: text/plain Content-Disposition: attachment;filename="foo" Content-Length: 12 e Time to Relax! 26 --996713c691ec4fd5b717ef2740893b78-- 0
But connection hangs: CouchDB thinks that there have to more data while zero length chunk had been send and doesn't reply with anything back to client which had finished the request and awaits for the response.
The problem could be "fixed" by specifying full Content-Length of multipart body in request, which kills all the idea of chunked transfer.