Webサービスの 'getToken'エンドポイントへのcurlリクエストをデバッグしようとしています。
URLと認証情報がcurlハンドルに正しく書き込まれていることを100%確信しているわけではありません。
curl_getinfo($ch, CURLINFO_HEADER_OUT);
を使用して、送信されたリクエストをキャプチャしようとしていますが、あまり情報がありません。実際のcurlリクエストがどのように見えるかについて、より詳細な診断を取得する方法はありますか?
コードは次のとおりです。
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_HEADER, 1); // just getting header to see if we got an auth token
curl_setopt($ch, CURLOPT_FILE, $fh);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1); // capture the header info
curl_setopt($ch, CURLOPT_VERBOSE, 1); // turn verbose on
// execute the curl request
$rh = fopen("request.txt", "w"); // open request file handle
$verbose = fopen('php://temp', 'rw+');
curl_setopt($ch, CURLOPT_STDERR, $verbose);
curl_exec($ch); // execute request
$sent_request = curl_getinfo($ch, CURLINFO_HEADER_OUT);
fwrite($rh, $sent_request); // save the request info
fclose($rh);
!rewind($verbose);
$verboseLog = stream_get_contents($verbose);
echo "Verbose information:\n<pre>", htmlspecialchars($verboseLog), "</pre>\n";
これはすべて機能しますが、毎回401を返します。API管理者は、ユーザー名/パスが正しいことを確認します。
URLの値がどういうわけか間違っているのか、正しいユーザー名/パスを送信していないのか疑問に思っていましたが、この情報は保存されたリクエストデータに印刷されません。
HEAD /export/auth HTTP/1.1
Authorization: Basic Y2FpcmRzdW5mYTpENWlAaVM4cw==
Host: webservices.mycompany.com
Accept: */*
ユーザー名/パスが記録されていないことがわかります(セキュリティのためだと思います)。私が思うエンドポイントURLはHost
値にHEAD
値の先頭を加えたものなので、webservices.mycompany.com/export/auth
?
「詳細情報」ステートメントは何も出力しません。これもなぜかわからない!
手伝ってくれてありがとう。
編集: Phpから詳細モードを追加-コメンターimmulatinのおかげでCurl をデバッグ
_CURLINFO_HEADER_OUT
_をtrue
に設定すると、発信ヘッダーは_request_header
_キーの下のcurl_getinfo()
によって返される配列で使用できます。
_$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info['request_header']);
_
これは印刷されます:
_GET /bar HTTP/1.1
Authorization: Basic c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk
Host: foo.com
Accept: */*
_
認証の詳細はbase64でエンコードされていることに注意してください。
_echo base64_decode('c29tZXVzZXJuYW1lOnNlY3JldHBhc3N3b3Jk');
// prints: someusername:secretpassword
_
また、ユーザー名とパスワードは、URLの予約文字(_/
_、_?
_、_&
_、_:
_など)をエスケープするためにパーセントエンコードする必要があることに注意してください。
_curl_setopt($ch, CURLOPT_USERPWD, urlencode($username).':'.urlencode($password));
_
Charles などのプロキシツールを使用して、CURLOPT_PROXY
あなたのcurl_setopt_array
方法。
例えば:
$proxy = '127.0.0.1:8888';
$opt = array (
CURLOPT_URL => "http://www.example.com",
CURLOPT_PROXY => $proxy,
CURLOPT_POST => true,
CURLOPT_VERBOSE => true,
);
$ch = curl_init();
curl_setopt_array($ch, $opt);
curl_exec($ch);
curl_close($ch);
curl_getinfo()
はcurlハンドラーを閉じる前に追加する必要があります
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://foo.com/bar");
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "someusername:secretpassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
$info = curl_getinfo($ch);
curl_exec($ch);
print_r($info['request_header']);
リクエストはrequest.txtに詳細とともに出力されます
$ch = curl_init();
$f = fopen('request.txt', 'w');
curl_setopt_array($ch, array(
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_VERBOSE => 1,
CURLOPT_STDERR => $f,
));
$response = curl_exec($ch);
fclose($f);
curl_close($ch);
Curl_getinfo()関数を使用することもできます。