2009-08-25 104 views
6

我一直在玩Poco Net庫一段時間,這是相當不錯的。非常方便,易於理解。POCO Net C++庫中的代理身份驗證

我能夠設置一個代理地址,它正在說407正確的代理授權要求。我想,

HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
req.setCredentials(scheme, authInfo); 

我試着像計劃「基本」,「純文本」,和值:在AUTHINFO「用戶密碼」。它似乎沒有工作。 Google沒有幫助。

有沒有人使用Poco Net之前做過這個?或者是這個用法很明顯,而且由於我對代理身份驗證的一般態度無知,因此我無法使用它。請指教。

編輯:經過更多的玩耍後,我認爲setCredentials功能是在遠程服務器期待登錄認證信息時使用的。我一直無法找到使用Poco Net庫進行代理身份驗證的方法。儘管我能夠設置代理服務器和端口。如果只有代理服務器沒有身份驗證,這就是我想要的:

HTTPClientSession session(uri.getHost(), uri.getPort()); 
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
session.setProxy("host", port); 
session.sendRequest(req); 

需要幫助。

編輯:基於由@StackedCrooked建議的解決方案,我想提出請求之前設置代理身份驗證信息的請求頭,並在互聯網上找到另一種方法,我只是做一個後置的代理身份驗證的詳細信息初始請求和407錯誤,然後再次提出請求。兩種方法都一直給出相同的407錯誤。我目前的代碼如下所示:

HTTPClientSession session(uri.getHost(), uri.getPort()); 
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
session.setProxy("10.7.128.1", 8080); 
req.set("Proxy-Authentication", "Basic bGVlbGE6bGVlbGExMjM="); 
session.sendRequest(req); 
+0

你可以把一個測試用例放在codepad.org上嗎?我很想嘗試一下我的代理。 – joshperry 2009-08-29 00:37:27

+1

我相信正確的標題,正如@StackedCrooked建議的,是「代理授權」而不是「代理驗證」。你的實際代碼是否使用了正確的代碼? – 2009-09-04 00:17:02

回答

2

你可能需要代理授權字段添加到HTTP標頭。 Poco的HTTPRequest類沒有專門的方法。但是,由於公開繼承NameValueCollection中的類,你可以將其設置是這樣的:

req.set("Proxy-Authorization" , "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="); 

哪裏QWxhZGRpbjpvcGVuIHNlc2FtZQ==編碼「阿拉丁:芝麻開門」的版本中的Base64。

一旦您瞭解了一些HTTP協議,很多這些問題就會變得更加容易。我現在主要是對自己說:)

+0

我一直以各種方式嘗試這種方式,它始終給出相同的407錯誤。請參閱問題中的編輯。 – Sahas 2009-08-28 06:29:05

+0

是的,我無法幫到你,因爲我在這方面的知識也有限。我希望你現在找到了一個解決方案(或者你會很快找到一個!)。 – StackedCrooked 2009-09-04 22:18:48

+0

除了基本身份驗證之外,還有其他身份驗證 - 摘要,NTLM,護照等。WinHTP爲您執行此操作(http://msdn.microsoft.com/zh-cn/library/windows/desktop/aa383144(v=vs.85) )的.aspx)。我會很好奇,看看poco C++(或其他庫)是否可以做同樣的事情。 – quixver 2012-11-12 23:02:26

1

我自己沒有用過這個,但是你看過HTTPBasicCredentials這個類嗎?它通過驗證方法將對req.setCredentials的調用包裝起來。你最終會沿着線的東西:

HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1); 
HTTPBasicCredentials cred("user", "password"); 
cred.authenticate(req); 
+0

剛剛嘗試過。沒有工作。我認爲當遠程服務器期待基本認證信息時,需要HTTPBasicCredentials。現在我想即使是我最初嘗試過的setCredentials函數也不是爲了這個目的。 – Sahas 2009-08-25 12:06:15

+1

這工作...其他答案不(手動Base64Encoding使用poco編碼器)。 – Homer6 2012-07-24 21:03:04