In article <E1AKwJf-0003Jv-NX / odie.runbox.com>, "T. Onoma" <transami / runbox.com> writes: >> * It is not called if content is empty. > > hmm...there may be noting to do about it. just have to live with it. It's user's choice. I don't want to deny progress bar for empty file. >> * It may inform users that total may change. > > but it is changing. only happens on redirect right? not much data 200 bytes? i doubt would be even notice it would go by so fast. I meant that passing total size multiple times informs programmers it will change: % ruby -rlib/open-uri -e 'open("http://www.ruby-lang.org/en/",:progress_proc => lambda {|pos, total| p [pos, total]})' [720, 15324] [1144, 15324] ... [15200, 15324] [15324, 15324] In this case, I feel "Hmm... total may change because the interface is designed as it can be changed". But it doesn't change (if redirection is ignored by open-uri). I prefer an interface which doesn't inform such invalid feel. Regardless of that, do you want to show progress bar 3 times for http://www.ruby-lang.org/ ? 1. redirection for http://www.ruby-lang.org/ to http://www.ruby-lang.org/en/index.html 2. redirection for http://www.ruby-lang.org/en/index.html to http://www.ruby-lang.org/en/ 3. content retrieving for http://www.ruby-lang.org/en/ >> When an user know total by some applilcation specific way, total is useless. >> Although calculating total is no problem in HTTP, it require another >> network traffic in FTP. > > yuk. but only need to do if total is requested perhaps? But the two-argument :progress_bar proc interface cannot request progress without total. >> > perhaps just convert nil to 0 instead and it will be a little better? >> >> It unify "total size is unknown" and "total size is 0". >> I think it should be distinguishable. > > how can total length ever be 0? Try: % cd ~/public_html % touch empty.txt > if 0 it must be unknown. having a nil means having to take exception for nil type in proc. I agree that nil may cause trouble because nil is different type than integer. But it's essential. There is a case that total size cannot be known by open-uri. For example, CGI output which has no Content-Length. In this case, progress bar cannot show percentage of transfer by information open-uri provides. So disabling progress_proc for such case may be a solution. But it disables progress bar even if a client know total size by some application specific way. > i think maybe just leave out total for now. perhaps better idea will turn up later. maybe :progress_with_total_proc, if problems can be resolved. > > have you thought of better idea? Maybe, another hook named content_length_proc or total_size_proc. % ruby -rlib/open-uri -e ' open(ARGV[0], :total_size_proc => lambda {|t| p [:total, t] }, :progress_proc => lambda {|s| p [:progress, s] } )' http://www.ruby-lang.org [:total, 15326] [:progress, 720] [:progress, 1144] ... [:progress, 14352] [:progress, 15326] Is there a better name? -- Tanaka Akira