On Aug 26, 7:28 pm, gert <gert.cuyk...@gmail.com> wrote: > On Aug 26, 12:46 am, Graham Dumpleton <graham.dumple...@gmail.com> > wrote: > > > > > On Aug 25, 5:37 am, Tim Chase <python.l...@tim.thechases.com> wrote: > > > > > I want the file pointer set to 100 and overwrite everything from there > > > [snip] > > > > def application(environ, response): > > > > query=os.path.join(os.path.dirname(__file__),'teeeeeeeeeemp') > > > > range=environ.get('HTTP_RANGE','bytes=0-').replace > > > > ('bytes=','').split(',') > > > > offset=[] > > > > for r in range: offset.append(r.split('-')) > > > > with open(query,'w+') as f: > > > > f.seek(int(offset[0][0])) > > > > while True: > > > > chunk=environ['wsgi.input'].read(8192).decode('latin1') > > > > if not chunk: break > > > > f.write(chunk) > > > > f=open(query) > > > > l=str(os.fstat(f.fileno()).st_size) > > > > response('200 OK', [('Content-Type', 'text/plain'), ('Content- > > > > Length', str(len(l)))]) > > > > return [l] > > > > A couple items of note: > > > > - you don't open the file in binary mode -- seek is more reliable > > > in binary mode :) > > > If my memory is right, if file is opened in binary mode, also wouldn't > > need to be decoding the WSGI input stream as latin-1 to get a string. > > Instead can just deal with bytes and write bytes to file. > > > Graham > > > > - if you want to lop off the rest of the file, use f.truncate() > > > > An example: > > > > # create the initial file > > > >>> f = file('zzz.zzz', 'wb+') > > > >>> f.write('abcdefghijklmnop') > > > >>> f.close() > > > > >>> f = file('zzz.zzz', 'ab+') > > > >>> f.read() # show the existing content > > > 'abcdefghijklmnop' > > > >>> f.seek(5) # seek to the desired offset > > > >>> f.truncate() # throw away everything after here > > > >>> f.write('zyx') # write the new data at pos=5 > > > >>> f.close() > > > > # demonstrate that it worked > > > >>> f = file('zzz.zzz', 'rb') > > > >>> f.read() > > > 'abcdezyx' > > > >>> f.close() > > > > > also why must I open the file a second time to know how big it is ? > > > > Likely the output has been buffered. You can try using > > > > f.flush() # write all the data to the disk first > > > size = os.fstat(f.fileno()).st_size > > > > which seems to do the trick for me. > > > -tkc > > Works thanks > > curl -C 10 -T upload2.wsgihttp://192.168.2.17/appwsgi/wsgi/upload2.wsgi > --header "Transfer-Encoding: chunked" -v > > import os > > def application(environ, response): > #query=environ.get['QUERY_STRING'] > #print (query, file=environ['wsgi.errors']) > query=os.path.join(os.path.dirname(__file__),'teeeeeeeeeemp') > range=environ.get('HTTP_CONTENT_RANGE','bytes 0-').replace('bytes > ','').split('/')[0].split(',') > offset=[] > for r in range: offset.append(r.split('-')) > with open(query,'rb+') as f: > f.seek(int(offset[0][0])) > if environ['REQUEST_METHOD']=='PUT': > f.truncate() > while True: > chunk=environ['wsgi.input'].read(8192) > if not chunk: break > f.write(chunk) > f.flush() > l=str(os.fstat(f.fileno()).st_size) > response('200 OK', [('Content-Type', 'text/plain'), ('Content- > Length', str(len(l)))]) > return [l]
Update it works on mod_wsgi but not on wsgiref.simple_server C:\Users\gert\Desktop\hg\appwsgi\wsgi>curl -T upload2.wsgi http://localhost/appwsgi/wsgi/upload2.wsg i -v * About to connect() to localhost port 80 (#0) * Trying 127.0.0.1... connected * Connected to localhost (127.0.0.1) port 80 (#0) > PUT /appwsgi/wsgi/upload2.wsgi HTTP/1.1 > User-Agent: curl/7.19.4 (amd64-pc-win32) libcurl/7.19.4 OpenSSL/0.9.8j > zlib/1.2.3 > Host: localhost > Accept: */* > Content-Length: 869 > Expect: 100-continue > * Done waiting for 100-continue I not getting 100-continues ? -- http://mail.python.org/mailman/listinfo/python-list