I am trying to upload an image attachment through an API, the something can be achieved through a web interface. Both make requests to the same url, same headers, everything. But the issue is that the mimetype of the png image is not detected by the server when I make the python request. When retrieving the image again, the content-Type is 'application/octet-stream' rather than 'image/png' (which is what I get when I retrieve the interface-uploaded one). this causes further problems down the road in my pipeline.
Here's a detailed view of the correct (webinterface) request: (via Wireshark)
The main difference I see here is that in the correct one, the file is detected as 'Portable Network Image' rather than 'Media Type'. I can't find anything related to how it decides that, so to know that would be great.
I have tried using the exact same header set with the correct tokens, still the same problem.
Here's my code for making the request:
headers2 = { \
'IUCLID6-USER' : headers['USER'] ,
'IUCLID6-PASS' : headers['PASS'] ,
'Accept' : 'application/json, text/plain, */*' ,
'Accept-Encoding': 'gzip, deflate',
'Connection' : 'keep-alive',
'Content-Disposition' : "attachment;name="+fname+";filename*=utf-8''" + fname,
'Content-Length' : str(os.path.getsize(os.path.join(sys.path[0], fname))),
'Content-Type': 'image/png'
}
files = {'attachment': (fname, open(os.path.join(sys.path[0], fname), 'rb'), 'image/png'),}
data= {'filetype' : 'image/png'}
# files = {'attachment': open(os.path.join(sys.path[0], fname), 'rb')}
response = requests.post(base_url + "raw/attachment", headers=headers2, files=files)
Note: when using the data arg rather than files, I noticed that the retrieved 'Content-Type' became 'text/plain'. This is the only case where it changed.
Another Note: I'm not sure if the key in 'files' has to do anything with it but I have tried 'files', 'file', 'media', 'image', and 'data' to no avail. Would be also good to know based on what should the files object be structured.
I don't know why the python request doesn't match the interface request, and its driving me crazy. So any help would be appreciated.
EDIT: the proper request's curl command:
curl 'http://url.com:8080/iuclid6-ext/api/ext/v1/raw/attachment' \
-X 'POST' \
-H 'Accept: application/json, text/plain, */*' \
-H 'Accept-Language: en' \
-H 'Authorization: Token eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJhNDIzOWI3My1kZDQ0LTRmZGEtOTRkOS1lM2NlZGMyZDZiZjMiLCJpc3MiOiJpdWNsaWQ2LXRva2VuLXNlcnZlciIsInN1YiI6IlN1cGVyVXNlciIsImlhdCI6MTY5MTQwNDQ3MSwiZXhwIjoxNjkxNDA1MDcxLCJzY29wZXMiOlsiYWNjZXNzIl19.VWkb6XYEOKulICaXgLN9gkq4qvdKFDFwwx5b_zeVSlU' \
-H 'Connection: keep-alive' \
-H $'Content-Disposition: attachment;filename*=utf-8\'\'Logo-for-a-brand-named-Petrol--style-is-a-mix-of-vintage--retro--sci-fi-space--diesel--motorsport--and-mad-max-styles--The-logo-consists-of-the-name-Petrol-and-a-gas-canister-in-a-stylish-and-pretty-l%20%281%29%20%281%29.png' \
-H 'Content-Length: 1058156' \
-H 'Content-Type: image/png' \
-H 'Origin: http://url.com:8080' \
-H 'Referer: http://url.com:8080/iuclid6-web/raw/REFERENCE_SUBSTANCE/261bbd71-d826-43ef-9227-93403e892422/(main-content:content/iuclid6:%2F0%2FREFERENCE_SUBSTANCE%2F261bbd71-d826-43ef-9227-93403e892422/)?node=261bbd71-d826-43ef-9227-93403e892422' \
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44' \
--compressed \
--insecure