> No.  I already implemented.  (not committed yet.)
>
> In my version, progress_proc takes two arguments instead of one.
> It takes expected total size by Content-Length as second argument if available.

could you show example? hmm...wouldn't the expected length be in the proc already if it were needed? that's what i did with my progressbar.
 
> > i had it that way before and i can just put it back. the thing about the proc arguements though, each proc in the hash could take different arguments. hmmm....is is possible for the hash key itself to determine which args to pass in to the proc rather then making up names for them? for instance:
> >
> > open( url, { pos: proc { |b| ...} } )  # would pass #pos
> >
> > or something like that. just a thought.
> 
> m(x => y) is same as m({x => y}).

ugh, my typo. what i meant was:

  open(url, {:pos => proc {|b| ...}})

so that if, method_key = :pos and progress_prco = proc {|b| ...}

would end up something like

  ...
      http.get(uri.to_s, header) { |str|
          buf << str
          progress_proc.call(buf.io.method(method_key).call) if progress_proc
        }
      }
  ...


but maybe that's too odd?

> > funny you ask, because i keep reading and reading about them, but for some reason i never quite understand them. most tech writers just assume you know, i guess. i sort of know how to use them on command line to pipe output from one command into another. can you more easily explain?
> 
> pipe can be used to asynchronous process.
> 
> Try:
> 
> pipe = IO.popen("while :; do echo a; sleep 1; done")
> pipe.each_line {|line| p line }
> 
> pipe = IO.popen("wget -q -O- http://raa.ruby-lang.org/all.html")
> pipe.each_line {|line| p line }
> 
> IO.popen doesn't wait finishing a command.
> 
> So, if URI::HTTP#open works like that, you can use it for progress
> bar.  But it has subtle differences.

i see, thank you! that makes more sense. i think i was just confusing myself by making it more complicated.

-t0