0

TCP経由でプロキシ接続がどのように機能するかを理解しようとしています。stacksoft ライブラリをダウンロードし、リモート サーバーに Squid プロキシをインストールすることから始めました。

現在、c# TcpClient 経由で接続しようとしています。

接続は、次の要求によって開かれます。

CONNECT proxyjudge.iathao.com:80 HTTP/1.1 
HOST proxyjudge.iathao.com

エラーコード400で失敗します(これのいくつかのバリエーションを試しましたが、常に失敗します):

HTTP/1.0 400 Bad Request
Server: squid/3.1.10
Mime-Version: 1.0
Date: Mon, 27 Aug 2012 13:25:54 GMT
Content-Type: text/html
Content-Length: 3295
X-Squid-Error: ERR_INVALID_REQ 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from ****
X-Cache-Lookup: NONE ****:***
Connection: close

....

<h1>ERROR</h1>
<h2>The requested URL could not be retrieved</h2>
....

<div id="content">
<p><b>Invalid Request</b> error was encountered while trying to process the request:</p>

<blockquote id="data">
<pre>CONNECT proxyjudge.iathao.com:80 HTTP/1.1 
HOST proxyjudge.iathao.com

</pre>
</blockquote>

<p>Some possible problems are:</p>
<ul>
<li><p>Missing or unknown request method.</p></li>
<li><p>Missing URL.</p></li>
<li><p>Missing HTTP Identifier (HTTP/1.0).</p></li>
<li><p>Request is too large.</p></li>
<li><p>Content-Length missing for POST or PUT requests.</p></li>
<li><p>Illegal character in hostname; underscores are not allowed.</p></li>
<li><p>HTTP/1.1 <q>Expect:</q> feature is being asked from an HTTP/1.0 software.</p></li>
</ul>

そのため、Firefox から Wireshark を使用して同じサーバーに送信されたリクエストをたどりましたが、通常の get リクエストのように見え、接続コマンドは見えません。

GET http://proxyjudge.iathao.com/ HTTP/1.1
Host: proxyjudge.iathao.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Proxy-Connection: keep-alive

======================================================

HTTP/1.0 200 OK
Date: Mon, 27 Aug 2012 13:34:39 GMT
Server: Apache
X-Powered-By: PHP/5.3.15
Content-Type: text/html
X-Cache: MISS from ****
X-Cache-Lookup: MISS from ****:****
Connection: close

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>AZ Environment variables 1.04</title>
</head>
<body>
<pre>
HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1
HTTP_HOST = proxyjudge.iathao.com
REQUEST_URI = /
HTTP_CONNECTION = keep-alive
REMOTE_PORT = 46153
HTTP_ACCEPT_LANGUAGE = en-us,en;q=0.5
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
REMOTE_ADDR = ****
HTTP_CACHE_CONTROL = max-age=259200
HTTP_ACCEPT_ENCODING = gzip, deflate
REQUEST_METHOD = GET
REQUEST_TIME = 1346074479
</pre>
</body>
</html>

どこでも CONNECT が必要であると読んでいますが、ここではエラーが発生します。また、接続が必要ない場合、パスワードで保護されたプロキシで接続を承認するにはどうすればよいですか?

このトピックに関する良い記事を推薦できる人はいますか?

4

1 に答える 1

1

私の知る限り、プロキシに CONNECT コマンドを発行するだけで、応答を取得できます。HOST コマンドではありません。OK の場合、他のすべてはアップストリーム サーバー向けの正当な HTTP である必要があります。

于 2012-08-27T21:35:05.623 に答える