Gisle Aas <[EMAIL PROTECTED]> writes:

> Thinking some more.  This is what I think I would like to see.

The just released libwww-perl-5.77 contains the HTTP::MessageParts
module that implements this.  It is still experimental and it lacks
documentation.  Loading the HTTP::MessageParts module will populate
the HTTP::Message class with the parts() and add_part() methods.
Check it out and tell me if it works for you.

> We introduce the methods 'parent', 'parts' and 'add_part' to
> HTTP::Message.
> 
>   $msg2 = $msg->parent
> 
>     This attribute point back to the parent message.  If defined
>     it makes this message a message part belonging to the parent
>     message.  This attribute is set by the other methods described
>     below.
> 
>     We might consider automatic delegation to the parent, but
>     I'm not sure how useful that would be.

I did not implement this method as there is no obvious way to avoid
the circular reference in this case.  I'll revise this decision if a
strong use case for this method can be shown.

>   @parts = $msg->parts
> 
>     This will return a list of HTTP::Message objects.  If the
>     content-type of $msg is not multipart/* or message/* then this
>     will return the empty list.  The returned message part objects
>     are read only (so that future versions can make it possible to
>     modify the parent by modifying the parts).
> 
>     If the content-type of $msg is message/* then there will only
>     be one part.
> 
>     If the content-type is message/http, then this will return either
>     an HTTP::Request or an HTTP::Response object.

All of this should work.

>   $msg->parts( @parts )
>   $msg->parts( [EMAIL PROTECTED] )

Only the first form has been implemented.

>     This will set the content of the message to be the provided list
>     of parts.  If the old content-type is not multipart/* or message/*
>     then it is set to multipart/mixed and other content-* headers are
>     cleared as well.  The part objects now belong to $msg and can not
>     be set to be parts of other messages, but clones can be made part
>     of other messages.  This method will croak if the provided parts
>     are not independent.
> 
>     This method will croak if the content type is message/* and more
>     than one part is provided.
> 
>     The array ref form is provided so that an empty list can be
>     provided without any special cases.

Not all this semantic is implemented yet.

>   $msg->add_part( $part )
> 
>     This will add a part to a message.  If the old content-type is not
>     multipart/* then the old content (together with all content-*
>     headers) will be made part #1 and the content-type made
>     multipart/mixed before the new part is added.

Not yet implemented.

>   $part->clone
> 
>     Will return an independent part object (i.e. the parent
>     attribute will always be cleared).  This ensures that
>     this works:
> 
>         $msg2->parts([map $_->clone, $msg1->parts]);

Behaviour change not needed since $msg->parent is not there.

Regards,
Gisle

Reply via email to