python - Newlines removed in POST request body? (Google App Engine) -


i building rest api on google app engine (not using endpoints) allow users upload csv or tab-delimited file , search potential duplicates. since it's api, cannot use <form>s or blobstore's upload_url. cannot rely on having single web client call api. instead, ideally, users send file in body of request.

my problem is, when try read content of tab-delimited file, find newline characters have been removed, there no way of splitting content rows.

if check content of file directly on python interpreter, see tabs , newlines there (output truncated in example)

>>> open('./data/occ_sample.txt') o: ...     o.read() ...  'id\ttype\tmodified\tlanguage\trights\n123456\tphysicalobject\t2015-11-11 11:50:59.0\ten\thttp://creativecommons.org/licenses/by-nc/3.0\n...' 

the requesthandler logs content of request body:

import logging class reportapi(webapp2.requesthandler):     def post(self):         logging.info(self.request.body)         ... 

so when call api running in dev_appserver via curl

curl -x post -d @data/occ_sample.txt http://localhost:8080/api/v0/report 

this shows in logs:

id  type    modified    language    rights123456    physicalobject  2015-11-11 11:50:59.0   en  http://creativecommons.org/licenses/by-nc/3.0 

as can see, there nothing between last value of headers , first record (rights , 123456 respectively) , same happens last value of each record , first 1 of next.

am missing obvious here? have tried loading data self.request.body, self.request.body_file , self.request.post, , none seem work. tried applying content-type values text/csv, text/plain, application/csv in request headers, no success. should add different content-type?

you using wrong curl command-line option send file data, , this option stripping newlines.

the -d option parses out data , sends application/x-www-form-urlencoded request, , strips newlines. curl manpage:

-d, --data <data>

[...]

if start data letter @, rest should file name read data from, or - if want curl read data stdin. multiple files can specified. posting data file named 'foobar' done --data @foobar. when --data told read file that, carriage returns , newlines stripped out.

bold emphasis mine.

use --data-binary option instead:

--data-binary <data>

(http) posts data specified no processing whatsoever.

if start data letter @, rest should filename. data posted in similar manner --data-ascii does, except newlines , carriage returns preserved , conversions never done.

you may want include content-type header in case; of course depends on handler if care header.


Comments

Popular posts from this blog

Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test) on project.Error occurred in starting fork -

windows - Debug iNetMgr.exe unhandle exception System.Management.Automation.CmdletInvocationException -

configurationsection - activeMq-5.13.3 setup configurations for wildfly 10.0.0 -