Toon posts:

[Perl] HTTP::Request::Common Sending Post on multipart/form

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik probeer een testscript te schrijven voor het Zope/Plone platform. In dit script probeer ik in te loggen en iets te posten op het PloneBoard. Inloggen werkt prima, een post doen op het ploneboard niet. Ik heb de instructies gevolgd op: HTTP::Request::Common - Construct common HTTP::Request objects - search.cpan.org om een multipart/form-data POST et doen maar het script stuurt niet wat het zou moeten sturen:

Uit wireshark, de data dat mijn script stuurt:
POST /Portaalsite/forum/forum-1/786586749/769741525/add_comment_form HTTP/1.1
Connection: close
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Host: x.x.x.x:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.04 (hardy) Firefox/3.0.6
Content-Type: multipart/form-data
Content-Length: 7
The multipart dissector could not find the required boundary parameter.

Wat het zou moeten sturen:

[\POST /Portaalsite/forum/forum-1/786586749/769741525/add_comment_form HTTP/1.1
Host: x.x.x.x:8080
User-Agent: Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.04 (hardy) Firefox/3.0.6
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: nl,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://x.x.x.x:8080/Porta...s_message=Comment%20added
Cookie: __ac="em9wZTp6b3Bl"
Content-Type: multipart/form-data; boundary=---------------------------42519183279600981512979745
Content-Length: 571

-----------------------------42519183279600981512979745
Content-Disposition: form-data; name="text_text_format:default"

text/html
-----------------------------42519183279600981512979745
Content-Disposition: form-data; name="text"


<p>blaat<br /></p>

-----------------------------42519183279600981512979745
Content-Disposition: form-data; name="form.submitted"

1
-----------------------------42519183279600981512979745
Content-Disposition: form-data; name="form.button.Post"

Plaats reactie
-----------------------------42519183279600981512979745--

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/perl
use warnings;
use strict;
use diagnostics;

require LWP::UserAgent;
require HTTP::Request::Common;
require HTTP::Cookies;

my $ua = LWP::UserAgent->new;
my $headers = HTTP::Headers->new(
        'User-Agent' => 'Mozilla/5.0 (X11; U; Linux i686; nl; rv:1.9.0.6) Gecko/2009020911 Ubuntu/8.04 (hardy) Firefox/3.0.6',
        'Content_Type' => 'multipart/form-data',
        'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
);

my $req = HTTP::Request->new(
                POST => 'http://x.x.x.x:8080/Portaalsite/forum/forum-1/786586749/769741525/add_comment_form',
                $headers,
                Content => ['form.submitted' => '1',
                             'text_text_format:default' => 'text/html',
                             'text' => 'blaablaaa',
                             'form.button.Post' => 'Plaats reactie',]

        );

my $response_to_discard = $ua->request($req);


Alvast bedankt voor replies

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:35
Je stuurt een Content-Type form/multipart zonder bounderies. Zie het verschil in content type tussen wat de browser doet en wat je in je Perlscript doet.

Als je het content-type uit dat header object haalt, wat gebeurt er dan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zie het verschil. Het probleem is dat de HTTP::Request het zou moeten oplossen uit zichzelf.

Wat ik fout zie uit mijn Wireshark logs, is dat:
Content => ['form.submitted' => '1',
'text_text_format:default' => 'text/html',
'text' => 'blaablaaa',
'form.button.Post' => 'Plaats reactie',]
Niet wordt meegestuurd, alleen "Content" wordt meegestuurd en niet de variabelen.

De bounderies en de length zouden automatisch moeten worden berekend door de Http::Request

Mijn fout zou denk ik moeten zitten bij de HTTP::Request->new()

Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:35
Verwijderd schreef op maandag 02 maart 2009 @ 12:03:
Mijn fout zou denk ik moeten zitten bij de HTTP::Request->new()
Ja volgens mij werkt het coderen van die content niet helemaal. Volgens de documentatie kan het ook anders. Misschien heb je hier wat aan: http://search.cpan.org/~g...rl-5.805/lwpcook.pod#POST

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het eens geprobeerd op die manier door deze code:

Perl:
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/perl
use warnings;
use strict;

use LWP::UserAgent;
my $ua = LWP::UserAgent->new;

my $req = HTTP::Request->new(POST => 'http://x.x.x.x:8080/Portaalsite/forum/forum-1/786586749/769741525/add_comment_form');
$req->content_type('multipart/form-data');
$req->content('form.submitted=1&text_text_format:default=text/html&text=blaablaa&form.button.Post=Plaats%20reactie');

my $res = $ua->request($req);
print $res->as_string;


Wireshark uitvoer:

POST /Portaalsite/forum/forum-1/786586749/769741525/add_comment_form HTTP/1.1
Connection: close
Host: x.x.x.x:8080
User-Agent: libwww-perl/5.808
Content-Type: multipart/form-data
Content-Length: 99
The multipart dissector could not find the required boundary parameter.
Data: 666F726D2E7375626D69747465643D3126746578745F7465...


Uitvoer van server:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  <h2>Site Error</h2>

  <p>An error was encountered while publishing this resource.
  </p>
  
  <p>
      <strong>Error Type: ValueError</strong><br/>
      <strong>Error Value: Invalid boundary in multipart form: ''</strong><br/> 
  </p>
 
  <hr noshade="noshade" />
 
  <p>Troubleshooting Suggestions</p>

  <ul>
            <li>The URL may be incorrect.</li>
      <li>The parameters passed to this resource may be incorrect.</li>
      <li>A resource that this resource relies on may be encountering
          an error.</li>
  </ul>



Nog steeds iets mis met die boundaries lijkt mij :/

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Op http://search.cpan.org/di...ib/HTTP/Request/Common.pm gebruiken ze "form-data" als content type.
Dus
code:
1
$req->content_type('form-data');

en niet
code:
1
$req->content_type('multipart/form-data');

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:35
Op diezelfde pagina staat ook een andere constructie om die POST te doen:
Perl:
1
$ua->request(POST 'http://somewhere/foo', [foo => bar, bar => foo]);


waarbij de content dus als key-value pairs meegegeven kan worden.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Rutgerw: dat helpt nog niet met die boundaries ;) Die heb je alleen nodig in een multipart request. (aka: form-data, niet te verwarren met form-url-encoded). Als je als content_type 'formdata' zet dan zal het http::request object zelf de boundaries genereren en gebruiken. Als je zelf via de headers dat gaat lopen zetten zul je dat zelf moeten doen. Als je direct de post gebruikt zoals jij nu laat zien dan krijg je een standaard POT request (dus niet multipart en daardoor geen boundaries). Blijft natuurlijk de vraag of de TS daadwerkelijk een multipart request nodig heeft of niet.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:35
Ik vraag me dan ook af waarom TS niet gewoon een urlencoded POST doet... dus ik ben benieuwd of daar wel succes mee bereikt wordt zodat het multipart verhaal niet nodig is (wordt zover ik weet alleen maar gebruikt bij file uploads).

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

De sessie informatie zal bij de tweede post niet meegenomen worden gok ik zo. Na de eerste request zul je moeten afvangen wat je terugkrijgt (zeer waarschijnlijk komt er wat cookie info terug voor de sessie info.) en die zul je bij de tweede POST ook weer moeten meesturen anders ben je bij de tweede POST niet meer ingelogd.

[ Voor 10% gewijzigd door Creepy op 02-03-2009 16:20 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney

Pagina: 1