• 締切済み

PEAR HTTP_Requestでのヘッダ送信

PEARのHTTP_Requestを使用し、 下記処理にてTEST_URL向けにPOSTとヘッダを同時に送信する処理を行いたいのですが 411 Length Requiredで返ってきてしまします。 サーバのログには Invalid URI in request Connection: Keep-Alive というログがerrorログに出ています。 そこでRFCを読んで見ると、 転送コーディングが施されていない場合は Content-Length ヘッダは送られなければならないが、 メッセージボディ中のオクテット数と 正確に一致しなければならないとの記載がありました。 ここに引っかかっているのかもと思い対策しようと思いましたが メッセージボディのlength(下記の☆部分)をどのように拾うかがわかりません。 require_once "HTTP/Request.php"; $req = &new HTTP_Request(TEST_URL,array()); $req->setURL(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addHeader('Host',"test.hogehoge.jp\r\n"); $req->addHeader('Content-Length',"-☆-\r\n"); $req->addHeader('Connection', "Keep-Alive\r\n"); $req->addHeader('User-Agent',"TEST ABCDEFG\r\n"); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); if(PEAR::isError($result)) { echo $result->getMessage(); echo "<br />"; } else { echo $req->getResponseCode(); echo "<br />"; echo $req->getResponseBody(); echo "<br />"; } もしかして違う原因でしょうか? よろしくおねがいします。

みんなの回答

  • Lchan0211
  • ベストアンサー率64% (239/371)
回答No.1

このケースですと、おそらく addPostData('TEST_POST', 'testnano') により、リクエストボディに「TEST_POST=testnano」という 文字列が生成されるので、-☆-の部分には「18」を設定すると リクエストが成功するかもしれません。 ただ、API仕様書に書かれていないaddPostData内部の動きを推測して コーディングすべきではないですし、そもそもPEARのHTTP_Requestは、 keep-aliveの利用をサポートしていないように思います。 (次のリクエスト送信時、keep-aliveで維持しているコネクションを 再利用するか不明です。) 基本的には、 http://d.hatena.ne.jp/doroyamada/20050517/1116330464 にもあるように、 ------------------------------------------------- $req =& new HTTP_Request(TEST_URL); $req->setMethod(HTTP_REQUEST_METHOD_POST); $req->addPostData('TEST_POST', 'testnano'); $result = $req->sendRequest(); ~ ------------------------------------------------- とするだけでリクエストは成功するはずで、httpヘッダの設定は HTTP_Requestの内部動作に任せた方がよいと思います。 (この場合、keep-alive機能は使用されないので、Content-Lengthヘッダも 不要ということになります。)

関連するQ&A