2012-10-23 21 views
5

Tôi đã phát hiện một hành vi CURL "lạ" php đang gửi cho tôi các loại hạt. Về cơ bản những gì tôi đang làm là thực hiện một cuộc gọi được xác thực thông báo với curl. Dưới đây là một trích mã của tôi:php curl với thông báo trả về hai câu trả lời

curl_setopt($this->c, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($this->c, CURLOPT_USERPWD, $username . ":" . $password); 

Nó hoạt động tốt và máy chủ thực sự trở lại với một "CÓ, BẠN ĐƯỢC CUNG CẤP trọng quyền" loại tin nhắn. Chỉ có rắc rối là, phản hồi http thô là một chút kỳ lạ khi nó bao gồm, như một vấn đề của thực tế, 2 câu trả lời thay vì một. Đây là những gì curl_exec ($ this-> c) spits ra:

HTTP/1.0 401 Unauthorized 
Date: Tue, 23 Oct 2012 08:41:18 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
WWW-Authenticate: Digest realm="dynamikrest-testing",qop="auth",nonce="5086582e95104",opaque="4b24e95490812b28b3bf139f9fbc9a66" 
Vary: Accept-Encoding 
Content-Length: 9 
Connection: close 
Content-Type: text/html 

HTTP/1.1 200 OK 
Date: Tue, 23 Oct 2012 08:41:18 GMT 
Server: Apache/2.2.20 (Ubuntu) 
X-Powered-By: PHP/5.3.6-13ubuntu3.9 
Vary: Accept-Encoding 
Content-Length: 9 
Connection: close 
Content-Type: text/html 

"success" 

Tôi không hiểu tại sao nó bao gồm các phản ứng đầu tiên từ máy chủ (mà trong đó nó nói nó yêu cầu xác thực).

Có ai có thể xem nhẹ vấn đề này không? Làm cách nào để tránh tích lũy phản hồi?

Cheers

+0

Tôi đã * chính xác * cùng một vấn đề. Nhận xét này không thêm bất cứ điều gì để giải quyết, nhưng tôi muốn cho mọi người biết nó không phải là một vấn đề hoàn toàn bị cô lập. – Hezad

+0

Cuối cùng tôi đã sử dụng lệnh exec của hàm exec() của lệnh PHP. Nó rất lý tưởng nhưng nó hoạt động tốt để tạo mẫu: exec ('curl --digest -u the_login: the_password the_url', $ params); Vẫn đang tìm kiếm và đang chờ câu trả lời. – Hezad

+0

Tôi vừa thử nghiệm nó với Wireshark và thiết lập tương tự, có vẻ như curl kích hoạt 2 yêu cầu khi bạn sử dụng xác thực thông báo, và yêu cầu đầu tiên là không có bất kỳ xác thực nào. Câu hỏi bây giờ là, tại sao dòng lệnh curl bỏ qua phản hồi này và php_curl đính kèm nó. – gries

Trả lời

2

Dường như curl có hành vi tương tự nếu bạn sử dụng tùy chọn -I cho tiêu đề:

curl -I --digest -u root:somepassword http://localhost/digest-test/ 

lợi nhuận:

HTTP/1.1 401 Authorization Required 
Date: Fri, 31 May 2013 13:48:35 GMT 
Server: Apache/2.2.22 (Ubuntu) 
WWW-Authenticate: Digest realm="Test Page", nonce="9RUL3wPeBAA=52ef6531dcdd1de61f239ed6dd234a3288d81701", algorithm=MD5, domain="/digest-test/ http://localhost", qop="auth" 
Vary: Accept-Encoding 
Content-Type: text/html; charset=iso-8859-1 

HTTP/1.1 200 OK 
Date: Fri, 31 May 2013 13:48:35 GMT 
Server: Apache/2.2.22 (Ubuntu) 
Authentication-Info: rspauth="4f5f8237e9760f777255f6618c21df4c", cnonce="MTQ3NDk1", nc=00000001, qop=auth 
Vary: Accept-Encoding 
Content-Type: text/html;charset=UTF-8 
X-Pad: avoid browser bug 

Để chỉ nhận các tiêu đề thứ hai bạn có thể thử giải pháp này (không phải là giải pháp tối ưu):

<?php 

$ch = curl_init(); 
     // set url 
curl_setopt($ch, CURLOPT_URL, "http://localhost/digest-test/"); 
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); 
curl_setopt($ch, CURLOPT_USERPWD, "root:test"); 


// first authentication with a head request 
curl_setopt($ch, CURLOPT_NOBODY, 1); 
curl_exec($ch);   

// the get the real output 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_HTTPGET, 1); 
$output = curl_exec($ch); 
echo $output; 
0

Tôi gặp vấn đề tương tự, và tôi nghĩ rằng nó đã được gây ra bởi PHP được biên soạn chống lại một phiên bản cũ của libcurl (7.11.0 trong trường hợp của tôi, mà bây giờ là gần 10 tuổi). Trên một máy khác với phiên bản libcurl mới hơn (7.29.0) cùng một mã là tốt, và các vấn đề của tôi đã kết thúc sau khi nhận được máy chủ của tôi để biên dịch lại PHP của họ để sử dụng phiên bản mới nhất mà họ có sẵn (7.30.0).

Sửa lỗi này được đề xuất bởi a thread on the curl-library mailing list from 2008, trong đó người dùng phát hiện ra sự cố ảnh hưởng đến phiên bản 7.10.6 nhưng không phải là 7.12.1. Tôi đã tìm kiếm libcurl changelog around 7.12.0 và không tìm thấy bất kỳ mục nhập rõ ràng nào về việc khắc phục sự cố này, mặc dù nó có thể được đề cập đến bằng "cải tiến xác thực HTTP chung". Tuy nhiên, bây giờ tôi khá tự tin rằng một libcurl cũ là vấn đề.

Bạn có thể kiểm tra phiên bản của libcurl được sử dụng bởi PHP của bạn từ lối vào các 'Thông tin cURL' trong đầu ra của phpinfo();

Các vấn đề liên quan