[Alg] HTTP POST met file versturen naar PHP script

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Ik ben al een tijdje aan het proberen een HTTP POST die in een C++ applicatie wordt gegenereerd naar een PHP script te posten:

De HTTP Post ziet er als volgt uit.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
POST /maintenance/test/post.php?PRINTFORM HTTP/1.1
Content-Type: multipart/form-data; boundary=-----------------------------7d32bc39a10
Host: 192.168.100.3:9494
Connection: Keep-Alive
Content-Length: 281

-----------------------------7d32bc39a10
Content-Disposition: form-data; name="POSTVAR"

html
-----------------------------7d32bc39a10
Content-Disposition: form-data; name="filename"; filename="c:\test.xml"
Content-Type: text/xml

post data
-----------------------------7d32bc39a10


Dit wordt naar een PHP script gestuurd die vervolgens de GET, POST en POST files vars naar een file schrijft.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ob_start();
echo "POST FILES:\r\n";
print_r($HTTP_POST_FILES);

echo "GET VARS:\r\n";
print_r($HTTP_GET_VARS);

echo "POST VARS:\r\n";
print_r($HTTP_POST_VARS);

$buffer = ob_get_contents();
ob_end_clean();

// Schrijf vars in file
$fp = fopen('post.log', 'w');
fwrite($fp, $buffer);
fclose($fp);


De HTTP POST komt goed aan en de logfile ziet er als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
POST FILES:
Array
(
)
GET VARS:
Array
(
    [PRINTFORM] => 
)
POST VARS:
Array
(
)


Zoals je ziet ziet het PHP script alleen de GET var en niet de post vars. Op een of andere manier is mijn POST dus niet wel-formed. Ik heb gekekeken hoe IE een POST doet en daar mijn POST grotendeels van afgeleid. Alleen de velden Accept en User-Agent heb ik niet meeverzonden.

Overigens heb ik ook geprobeerd vanuit VB deze HTTP POST te sturen dus het lijkt mij onwaarschijnlijk dat het aan de C++ code ligt.

Is HTTP POST niet correct of moet ik bepaalde headers toch meegeven?

[ Voor 4% gewijzigd door pjonk op 16-10-2003 11:00 ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Je moet de headers scheiden van de content door middel van een lege regel. Denk er trouwens aan dat voor HTTP geldt dat elke regel afgesloten wordt door een CRLF-paar ("\r\n"). Voor de content zou dit niet uit moeten maken.

edit:
Lekker handig dat de Parse developers al maandenlang te lam zijn om code tags fatsoenlijk te laten werken in de op een na grootste browser engine... :/

[ Voor 31% gewijzigd door Soultaker op 16-10-2003 11:02 ]


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Soultaker schreef op 16 October 2003 @ 11:01:
Je moet de headers scheiden van de content door middel van een lege regel. Denk er trouwens aan dat voor HTTP geldt dat elke regel afgesloten wordt door een CRLF-paar ("\r\n"). Voor de content zou dit niet uit moeten maken.
Ik gebruik alleen LF en geen CRLF, maar dat zou toch niet moeten maken (volgens de RFC tenminste). Ik ga het toch maar even proberen.

edit:
Dit maakt dus idd niks uit

[ Voor 6% gewijzigd door pjonk op 16-10-2003 11:11 ]

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Mijn HTTP Post ziet er nu als volgt uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
POST /maintenance/test/post.php?PRINTFORM=html HTTP/1.1
Accept: image/gif
Accept-Language: en-us
Accept-Encoding: deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98)
Content-Type: multipart/form-data; boundary=-----------------------------7d32bc39a10
Host: 192.168.100.3:9494
Connection: Keep-Alive
Content-Length: 291

-----------------------------7d32bc39a10
Content-Disposition: form-data; name="POSTVAR"

html
-----------------------------7d32bc39a10
Content-Disposition: form-data; name="filename"; filename="c:\test.xml"
Content-Type: text/xml

post data
-----------------------------7d32bc39a10--

Ik heb de Accept headers en User-Agent dus toegevoegd en ik gebruik nu CRLF.
Dacht ook dat ik het probleem gevonden had, omdat ik de laatste 2 streepjes -- achter de laatste boundary was vergeten. Maar toch ziet het PHP script die POST vars nog steeds niet.

It’s nice to be important but it’s more important to be nice


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
JonkieXL schreef op 16 October 2003 @ 11:08:
Ik gebruik alleen LF en geen CRLF, maar dat zou toch niet moeten maken (volgens de RFC tenminste). Ik ga het toch maar even proberen.
Ik was blijkbaar in de war met Telnet ofzo... Excuses voor de misleidende informatie! :o

Maar ik denk dat ik wel de echte fout heb gevonden; als je als boundary "xyz" instelt (dus met een header: "Content-Type: multipart/form-data; boundary=xyz") dan moet je "--xyz" gebruiken om parts te scheiden en "--xyz--" om het laatste part af te sluiten. Jij gebruikt nu "xyz" respectievelijk "xyz--", als ik me niet vergis! Door het grote aantal dashes was dat verschil lastig te zien, maar als je in je HTTP header twee dashes in het begin weghaalt (of bij de boundaries twee dashes toevoegt) zou het goed moeten werken.

(Alle headers behalve Host en Content-Type zijn trouwens optioneel; Content-Length is in principe wel fijn voor de server, maar als het berekenen ervan kostbaar is, zou ik dat gewoon aan de server overlaten. Verder zou ik, als ik jou was, geen keep-alive gebruiken, tenzij je voorzieningen hebt getroffen om de open connectie snel te hergebruiken; als je meerdere posts achter elkaar wilt doen, bijvoorbeeld.)

[ Voor 37% gewijzigd door Soultaker op 16-10-2003 11:53 ]


Acties:
  • 0 Henk 'm!

  • pjonk
  • Registratie: November 2000
  • Laatst online: 22:04
Soultaker schreef op 16 October 2003 @ 11:49:
[...]
Ik was blijkbaar in de war met Telnet ofzo... Excuses voor de misleidende informatie! :o
Maakt niet uit die CRLF's kunnen op zich geen kwaad ;)
Maar ik denk dat ik wel de echte fout heb gevonden; als je als boundary "xyz" instelt (dus met een header: "Content-Type: multipart/form-data; boundary=xyz") dan moet je "--xyz" gebruiken om parts te scheiden en "--xyz--" om het laatste part af te sluiten. Jij gebruikt nu "xyz" respectievelijk "xyz--", als ik me niet vergis! Door het grote aantal dashes was dat verschil lastig te zien, maar als je in je HTTP header twee dashes in het begin weghaalt (of bij de boundaries twee dashes toevoegt) zou het goed moeten werken.
Je hebt helemaal gelijk. IE gebruikt deze vele dashes als boundary en ik heb zoveel mogelijk de POST van IE nagebootst. De 2 begin dashes heb ik dus helemaal over het hoofd gezien. Het werkt nu dus goed, bedankt voor het meedenken. :)
(Alle headers behalve Host en Content-Type zijn trouwens optioneel; Content-Length is in principe wel fijn voor de server, maar als het berekenen ervan kostbaar is, zou ik dat gewoon aan de server overlaten.
Goed om te weten. Ik dacht dezelf dat het probleem bij de headers zat dus daarom heb ik ze toch allemaal toegevoegd.
Verder zou ik, als ik jou was, geen keep-alive gebruiken, tenzij je voorzieningen hebt getroffen om de open connectie snel te hergebruiken; als je meerdere posts achter elkaar wilt doen, bijvoorbeeld.)
Ik ben idd van plan meerdere HTTP POSTS achter elkaar te versturen, maar ik denk dat ik hiervoor gewoon aparte connecties ga gebruiken.

It’s nice to be important but it’s more important to be nice

Pagina: 1