post
にリクエストを送信するスクリプトがあります/usr/bin/php-cgi
。スクリプトは、プレーン テキストを処理する場合は問題なく動作しますが、データがバイナリの場合は失敗します。
$data = file_get_contents('example.jpg');
$size = filesize('example.jpg') + 5;
$post_data = 'file='.$data;
$response = shell_exec('echo "'.$post_data.'" |
REDIRECT_STATUS=CGI
REQUEST_METHOD=POST
SCRIPT_FILENAME=/example/script.php
SCRIPT_NAME=/script.php
PATH_INFO=/
SERVER_NAME=localhost
SERVER_PROTOCOL=HTTP/1.1
REQUEST_URI=/example/index.html
HTTP_HOST=example.com
CONTENT_TYPE=application/x-www-form-urlencoded
CONTENT_LENGTH='.$size.' php-cgi');
次のエラーが表示されます。
sh: -c: 1 行目: 一致する `"' を探しているときに予期しない EOF が発生しました
sh: -c: 5 行目: 構文エラー: 予期しないファイルの終わり
これは、送信しようとしているデータがバイナリであり、何らかの方法でエンコード/エスケープする必要があるためだと思います。
私が言ったように、データがプレーンテキストの場合、上記のコードは機能します:
$post_data = "data=sample data to php-cgi";
$size = strlen($post_data);
を使用してデータをエンコードしようとしましbase64_encode()
たが、別の問題に直面しました。データは、受信スクリプト内からデコードする必要があります。データをエンコードしてbase64
から、コンテンツまたは MIME タイプのヘッダーを追加して、php-cgi
バイナリに強制的に会話させることができるのではないかと考えていました。
もう 1 つの問題は、データを添付ファイルとして送信したいので、およびに設定CONTENT_TYPE
する必要があると思いますが、これらのヘッダーをコマンドラインから設定する方法がわかりません。multipart/form-data; boundary=<random_boundary>
CONTENT_DISPOSITION
form-data