Re: argument suggestion

Gisle Aas (gisle@activestate.com)
16 Sep 2000 20:31:22 +0200


"C.J. Collier" <cjcollier@sinclair.net> writes:

> The program in question is Persists Software's Asp Upload.  When
> I mailed the president of Persists software, he told me that the reason
> his product does not comply with the RFC's suggestion of 2 - characters
> is because all major browsers send a minimum of 10 - characters.
> 
> The way we got around the issue was to hack Common.pm and hardcode 12 -
> characters to preceed all MIME-encoded data.
> 
> This makes for difficult upgrades, of course.  :)  I was hoping that an
> argument could be added to the module to specify the number of -
> characters to preceed MIME-encoded data, but still default to 2 if the
> argument was not specified.  Does anyone see any issues that may arise
> from this?

What I think you want is to be able to specify your own suggested
boundary string.  After this patch HTTP::Request::Common allow you to
do that.  This example show how to use it:

    use HTTP::Request::Common qw(POST);
    my $r = POST("http://www.perl.com",
                 Content_Type => 'multipart/form-data; boundary="--------------------"',
                 Content => {
                                a => xYzZY,
                                c => 34,
                            }
                );
    print $r->as_string;
    ___END__

Regards,
Gisle


Index: lib/HTTP/Request/Common.pm
===================================================================
RCS file: /home/cvs/aas/perl/mods/libwww-perl/lib/HTTP/Request/Common.pm,v
retrieving revision 1.16
retrieving revision 1.18
diff -u -p -c -r1.16 -r1.18
*************** sub POST
*** 45,55 ****
      }
  
      if (ref $content) {
! 	if (lc($ct) eq 'multipart/form-data') {    #XXX: boundary="..."
  	    my $boundary;
  	    ($content, $boundary) = form_data($content, $boundary);
! 	    $boundary = qq("$boundary") if $boundary =~ /\W/;
! 	    $ct = qq(multipart/form-data; boundary=$boundary);
  	} else {
  	    # We use a temporary URI object to format
  	    # the application/x-www-form-urlencoded content.
--- 45,76 ----
      }
  
      if (ref $content) {
! 	if ($ct =~ m,^multipart/form-data\s*(;|$),i) {
! 	    require HTTP::Headers::Util;
! 	    my @v = HTTP::Headers::Util::split_header_words($ct);
! 	    Carp::carp("Multiple Content-Type headers") if @v > 1;
! 	    @v = @{$v[0]};
! 
  	    my $boundary;
+ 	    my $boundary_index;
+ 	    for (my @tmp = @v; @tmp;) {
+ 		my($k, $v) = splice(@tmp, 0, 2);
+ 		if (lc($k) eq "boundary") {
+ 		    $boundary = $v;
+ 		    $boundary_index = @v - @tmp - 1;
+ 		    last;
+ 		}
+ 	    }
+ 
  	    ($content, $boundary) = form_data($content, $boundary);
! 
! 	    if ($boundary_index) {
! 		$v[$boundary_index] = $boundary;
! 	    } else {
! 		push(@v, boundary => $boundary);
! 	    }
! 
! 	    $ct = HTTP::Headers::Util::join_header_words(@v);
  	} else {
  	    # We use a temporary URI object to format
  	    # the application/x-www-form-urlencoded content.
*************** L<HTTP::Request>, L<LWP::UserAgent>
*** 379,385 ****
  
  =head1 COPYRIGHT
  
! Copyright 1997-1998, Gisle Aas
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.
--- 400,406 ----
  
  =head1 COPYRIGHT
  
! Copyright 1997-2000, Gisle Aas
  
  This library is free software; you can redistribute it and/or
  modify it under the same terms as Perl itself.