SVN: toys/rsget.pl/RSGet: Form.pm Get.pm

sparky sparky at pld-linux.org
Fri Oct 2 17:27:28 CEST 2009


Author: sparky
Date: Fri Oct  2 17:27:28 2009
New Revision: 10651

Added:
   toys/rsget.pl/RSGet/Form.pm   (contents, props changed)
Modified:
   toys/rsget.pl/RSGet/Get.pm
Log:
- add Form.pm -- extracts forms from html page and prepares post values


Added: toys/rsget.pl/RSGet/Form.pm
==============================================================================
--- (empty file)
+++ toys/rsget.pl/RSGet/Form.pm	Fri Oct  2 17:27:28 2009
@@ -0,0 +1,157 @@
+package RSGet::Form;
+
+use strict;
+use warnings;
+use RSGet::Tools;
+use URI::Escape;
+set_rev qq$Id$;
+
+sub new
+{
+	my $class = shift;
+	my $html = shift;
+	my %opts = @_;
+
+	my @forms;
+	while ( $html =~ s{^.*?<form\s*(.*?)>(.*?)</form>}{}si ) {
+		my $attr = $1;
+		my $fbody = $2;
+		my %attr = map {
+			/^(.*?)=(["'])(.*)\2$/
+				? ( lc $1, $3 )
+				: ( $_, undef )
+			} split /\s+/, $attr;
+		push @forms, [ \%attr, $fbody ];
+	}
+	unless ( @forms ) {
+		warn "No forms found\n";
+		dump_to_file( $html, "html" );
+		return undef;
+	}
+
+	my $found;
+	if ( not $found and $opts{id} ) {
+		foreach my $form ( @forms ) {
+			if ( $form->[0]->{id} and $form->[0]->{id} eq $opts{id} ) {
+				$found = $form;
+				last;
+			}
+		}
+		warn "Can't find form with id '$opts{id}'\n" unless $found;
+	}
+	if ( not $found and $opts{name} ) {
+		foreach my $form ( @forms ) {
+			if ( $form->[0]->{name} and $form->[0]->{name} eq $opts{name} ) {
+				$found = $form;
+				last;
+			}
+		}
+		warn "Can't find form with name '$opts{name}'\n" unless $found;
+	}
+	if ( not $found and $opts{num} ) {
+		if ( $opts{num} >= 0 and $opts{num} < scalar @forms ) {
+			$found = $forms[ $opts{num} ];
+		}
+		warn "Can't find form number $opts{num}\n" unless $found;
+	}
+	if ( not $found ) {
+		$found = $forms[ 0 ];
+	}
+
+	my ( $attr, $fbody ) = @$found;
+
+	my $self = {};
+	$self->{action} = $attr->{action} || "";
+	$self->{post} = 1 if lc $attr->{method} eq "post";
+	my @order;
+	my %values;
+	my $formelements = join "|",
+		qw(input button select optgroup option textarea isindex);
+	while ( $fbody =~ s{^.*?<($formelements)(\s+.*?)?\s*/?\s*>}{}si ) {
+		my $el = lc $1;
+		my $attr = $2;
+		my %attr = map {
+			/^(.*?)=(["'])(.*)\2$/
+				? ( lc $1, $3 )
+				: ( $_, undef )
+			} split /\s+/, $attr;
+		my $name = $attr{name};
+		next unless $name;
+
+		unless ( exists $values{ $name } ) {
+			push @order, $name;
+			$values{ $name } = undef;
+		}
+		if ( $el eq "input" and lc $attr{type} eq "hidden" ) {
+			$values{ $name } = $attr{value} || "";
+		}
+	}
+	$self->{order} = \@order;
+	$self->{values} = \%values;
+
+	return bless $self, $class;
+}
+
+sub set
+{
+	my $self = shift;
+	my $key = shift;
+	my $value = shift;
+
+	unless ( exists $self->{values}->{$key} ) {
+		warn "'$key' does not exist\n" if verbose( 1 );
+		push @{$self->{order}}, $key;
+	}
+
+	$self->{values}->{$key} = $value;
+}
+
+sub get
+{
+	my $self = shift;
+	my $key = shift;
+
+	if ( $self->{values}->{$key} ) {
+		return $self->{values}->{$key};
+	} else {
+		warn "'$key' does not exist\n";
+		return undef;
+	}
+}
+
+sub dump
+{
+	my $self = shift;
+	my $p = "action: $self->{action}\n";
+	$p .= "method: " . ( $self->{post} ? "post" : "get" ) . "\n";
+	$p .= "values:\n";
+	my $vs = $self->{values};
+	foreach my $k ( @{$self->{order}} ) {
+		my $v = $vs->{$k};
+		$v = "undef" unless defined $v;
+		$p .= "  $k => $v\n";
+	}
+
+	dump_to_file( $p, "post" );
+}
+
+sub post
+{
+	my $self = shift;
+
+	my $vs = $self->{values};
+	my $post = join "&",
+		map { uri_escape( $_ ) . "=" . uri_escape( $vs->{ $_ } ) }
+		grep { defined $vs->{ $_ } }
+		@{$self->{order}};
+
+	if ( $self->{post} ) {
+		return $self->{action}, post => $post;
+	} else {
+		return $self->{action} . "?" . $post;
+	}
+}
+
+1;
+
+# vim:ts=4:sw=4

Modified: toys/rsget.pl/RSGet/Get.pm
==============================================================================
--- toys/rsget.pl/RSGet/Get.pm	(original)
+++ toys/rsget.pl/RSGet/Get.pm	Fri Oct  2 17:27:28 2009
@@ -4,6 +4,7 @@
 use warnings;
 use RSGet::Tools;
 use RSGet::Captcha;
+use RSGet::Form;
 use RSGet::Wait;
 use URI;
 set_rev qq$Id$;
@@ -51,7 +52,7 @@
 	bless $self, $pkg;
 	$self->bestinfo();
 
-	if ( setting("verbose") > 1 or $cmd eq "get" ) {
+	if ( verbose( 2 ) or $cmd eq "get" ) {
 		my $outifstr = $outif ? "[$outif]" :  "";
 
 		hadd $self,
@@ -101,6 +102,12 @@
 	return 0;
 }
 
+sub form
+{
+	my $self = shift;
+	return new RSGet::Form( $self->{body}, @_ );
+}
+
 sub print
 {
 	my $self = shift;
@@ -295,7 +302,7 @@
 
 	return 0 unless $self->{_cmd} eq "check";
 	p "info( $self->{_uri} ): $self->{bestname} ($self->{bestsize})\n"
-		if setting("verbose") > 0;
+		if verbose( 1 );
 	RSGet::Dispatch::finished( $self );
 	return 1;
 }


More information about the pld-cvs-commit mailing list