Changeset 1889

Show
Ignore:
Timestamp:
07/20/06 04:07:03
Author:
bricas
Message:

handle POST properly... i think.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • WWW-OpenSearch/branches/WWW-OpenSearch-rewrite/Changes

    r1888 r1889  
    22 
    330.06_02 Mon Jul 10 2006 
     4        - try to handle POST urls better 
    45        - update XML::Atom calls to latest release API 
    56        - added option to override the useragent from new() 
  • WWW-OpenSearch/branches/WWW-OpenSearch-rewrite/lib/WWW/OpenSearch.pm

    r1887 r1889  
    165165    my $response; 
    166166    if( $method eq 'post' ) { 
    167         my %form = $url->query_form; 
    168         $url->query_form( { } ); 
    169         $response = $self->agent->post( $url, \%form ); 
     167        $response = $self->agent->post( @$url ); 
    170168    } 
    171169    else { 
  • WWW-OpenSearch/branches/WWW-OpenSearch-rewrite/lib/WWW/OpenSearch/Description.pm

    r1821 r1889  
    184184                $method = $method->value if $method; 
    185185 
    186                 # TODO 
    187                 # properly handle POST 
     186                my %params; 
    188187                for( $urlnode->getChildrenByTagName( 'Param' ) ) { 
    189                     my $join = '&'; 
    190                     if( $url =~ /&/ ) { 
    191                         $join = '?'; 
    192                     } 
    193188                    my $param = $_->getAttributeNode( 'name' )->value; 
    194189                    my $value = $_->getAttributeNode( 'value' )->value; 
    195                     $url .= "$join$param=$value"; 
     190                    $value    =~ s/\?}/}/g; # optional 
     191                    $params{ $param } = $value; 
    196192                } 
    197193 
    198                 push @url, WWW::OpenSearch::Url->new( template => $url, type => $type, method => $method ); 
     194                push @url, WWW::OpenSearch::Url->new( template => $url, type => $type, method => $method, params => \%params ); 
    199195            } 
    200196            $self->Url( \@url ); 
  • WWW-OpenSearch/branches/WWW-OpenSearch-rewrite/lib/WWW/OpenSearch/Response.pm

    r1888 r1889  
    77 
    88use XML::Feed; 
     9use URI; 
    910use Data::Page; 
    1011 
     
    162163} 
    163164 
    164 # TODO 
    165 # handle previous/next page on POST 
    166  
    167165sub next_page { 
    168166    my $self  = shift; 
    169     my $pager = $self->pager; 
    170     my $page  = $pager->next_page; 
    171     return unless $page; 
    172      
    173     my $link = $self->_get_link( 'next' ); 
    174     return $self->parent->do_search( $link, $self->request->method ) if $link; 
    175      
    176     my $url   = $self->request->uri->clone; 
    177     my %query = $url->query_form; 
    178     my $param; 
    179  
    180     my $template = $self->parent->description->get_best_url; 
    181  
    182     if( $param = $template->macros->{ startPage } ) { 
    183         $query{ $param } = $pager->next_page 
    184     } 
    185     elsif( $param = $template->macros->{ startIndex } ) { 
    186         $query{ $param } ? $query{ $param } += $pager->entries_per_page 
    187                          : $query{ $param }  = $pager->entries_per_page + 1; 
    188     } 
    189  
    190     $url->query_form( \%query ); 
    191     return $self->parent->do_search( $url, $self->request->method ); 
     167    return $self->_get_page( 'next' ); 
    192168} 
    193169 
    194170sub previous_page { 
    195171    my $self  = shift; 
    196     my $pager = $self->pager; 
    197     my $page  = $pager->previous_page; 
     172    return $self->_get_page( 'previous' ); 
     173
     174 
     175sub _get_page { 
     176    my( $self, $direction ) = @_;     
     177    my $pager       = $self->pager; 
     178    my $pagermethod = "${direction}_page"; 
     179    my $page        = $pager->$pagermethod; 
    198180    return unless $page; 
    199  
    200     my $link = $self->_get_link( 'previous' ); 
    201     return $self->parent->do_search( $link, $self->request->method ) if $link; 
    202      
    203     my $url   = $self->request->uri->clone; 
    204     my %query = $url->query_form; 
    205     my $param; 
     181     
     182    my $request = $self->request; 
     183    my $method  = lc $request->method; 
     184 
     185    if( $method ne 'post' ) { # force query build on POST 
     186        my $link = $self->_get_link( $direction ); 
     187        return $self->parent->do_search( $link, $method ) if $link; 
     188    } 
    206189     
    207190    my $template = $self->parent->description->get_best_url; 
    208      
     191    my( $param, $query ); 
     192    if( $method eq 'post' ) { 
     193        my $uri = URI->new( 'http://foo.com/?' . $request->content ); 
     194        $query = { $uri->query_form }; 
     195    } 
     196    else { 
     197        $query = { $self->request->uri->query_form }; 
     198    } 
     199 
    209200    if( $param = $template->macros->{ startPage } ) { 
    210         $query{ $param } = $pager->previous_page 
     201        $query->{ $param } = $pager->$pagermethod 
    211202    } 
    212203    elsif( $param = $template->macros->{ startIndex } ) { 
    213         $query{ $param } ? $query{ $param } -= $pager->entries_per_page 
    214                          : $query{ $param }  = 1; 
    215     } 
    216      
    217     $url->query_form( \%query ); 
    218     return $self->parent->do_search( $url, $self->request->method ); 
     204        if( $query->{ $param } ) { 
     205            $query->{ $param } = $direction eq 'previous' 
     206                ? $query->{ $param } -= $pager->entries_per_page 
     207                : $query->{ $param } += $pager->entries_per_page; 
     208        } 
     209        else { 
     210            $query->{ $param } = $direction eq 'previous' 
     211                ? 1 
     212                : $pager->entries_per_page + 1; 
     213        } 
     214    } 
     215 
     216    return $self->parent->do_search( $template->prepare_query( $query ), $method ); 
    219217} 
    220218 
  • WWW-OpenSearch/branches/WWW-OpenSearch-rewrite/lib/WWW/OpenSearch/Url.pm

    r1825 r1889  
    66use URI::Escape; 
    77 
    8 __PACKAGE__->mk_accessors( qw( type template method macros ) ); 
     8__PACKAGE__->mk_accessors( qw( type template method params macros ) ); 
    99 
    1010=head1 NAME 
     
    5555    my $self = $class->SUPER::new( \%options ); 
    5656    $self->parse_macros; 
     57 
    5758    return $self; 
    5859} 
     
    6162    my $self = shift; 
    6263     
    63     my %query = $self->template->query_form; 
     64    my %query = $self->method eq 'post' 
     65        ? %{ $self->params } 
     66        : $self->template->query_form; 
    6467     
    6568    my %macros; 
     
    7679    my( $self, $params ) = @_; 
    7780    my $url   = $self->template->clone; 
    78     my %query = $url->query_form; 
    7981     
    8082    $params->{ startIndex     } ||= 1; 
     
    8587     
    8688    my $macros = $self->macros; 
     89 
     90    # attempt to handle POST 
     91    if( $self->method eq 'post' ) { 
     92        my $post = $self->params; 
     93        for( keys %macros ) { 
     94            $post->{ $macros->{ $_ } } = $params->{ $_ }; 
     95        } 
     96        return [ $url, $post ]; 
     97    } 
     98 
     99    my $query = { $url->query_form }; 
    87100    for( keys %$macros ) { 
    88         $query{ $macros->{ $_ } } = $params->{ $_ }; 
     101        $query->{ $macros->{ $_ } } = $params->{ $_ }; 
    89102    } 
    90103     
    91     $url->query_form( \%query ); 
     104    $url->query_form( $query ); 
    92105    return $url; 
    93106}