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