TCP is not as reliable as you think. A half open connection can leave both sides confused, and then you have no way of knowing if your transfer got through or not. Generally, it does a good job, but when you absolutely need to know if a file has transferred successfully or not, you need something better than TCP.
On Monday, September 22, 2014 4:36:59 PM UTC-7, Ricardo Pedroso wrote: > > On 9/22/14, Aldo Bassanini <[email protected] <javascript:>> wrote: > > Hello everyone. > > Is there any way to control the final status of the response.stream > > function? > > > > I need to serve a small file to a client application (the client app > uses > > wget, not a browser), but I wish to know if the client successfully > > downloaded the file, in order to update some server-side data. > > > > The way that I am thinking to achieve this, is programming the client > > application (a shell script) to GET a second URL (sending a session-id > or > > something like that) from the server, after downloading the file, but > this > > means, that I have to develop some file validation logic to verifiy the > > correct downloading (md5suming? or alikes) in the client, that I prefer > to > > avoid, since the client has a very small environment (OpenWrt's Busybox > > Shell) and very small CPU and RAM. > > > If I understood correctly, you only need to know if the file was > successfuly downloaded > or not on the server side. > > Don't know if there are better ways in web2py but... > ...this code, that goes into a controller, should do the trick: > > import os, sys > > def abort(status_code, message=None): > raise HTTP(404, message) > > def index(): > filename = request.args(0) or abort(404) > fullpath = os.path.join(request.folder, 'uploads', filename) > > def stream(): > try: > with open(fullpath, 'rb') as f: > while True: > data = f.read(1024) > if not data: > break > yield data > except: > # with any error, assume file not fully downloaded > print >>sys.stderr, 'failed' > else: > # if you reach this point the file was successfully > # downloaded. Do what you need on the backend side. > print >>sys.stderr, 'done' > > headers = {'Content-Type': 'application/octet-stream'} > raise HTTP(200, stream(), **headers) > > > PS: You dont need to do any checksum anywhere. TCP is reliable. > It guarantees that everything that is transmitted is error free and > ordered. > > > Ricardo > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

