Цели проекта:
Создайте локального прокси-судьи, используя консоль или приложение Windows Form для отладки и тестирования соединений.
- Проект должен запрашивать и получать параметры прокси-сервера для отображения на стороне клиента.
- Разобрать IP-адрес и вернуть состояние анонимности.
- Реализовать базовую схему защиты.
- Проект не должен использовать скрипты для функциональности (например, PHP, Perl, Asp и т. Д.)
- Совместимость с несколькими платформами (возможно)
Вопросы:
Можно ли использовать Request.ServerVariables в локальном Windows или консольном приложении или это специфично для ASP?
Если этот метод специфичен для ASP, есть ли другой способ запросить переменные сервера из сеанса браузера?
Если описанный выше метод возможен, каков правильный подход для достижения этой функциональности?
Что является хорошим примером для проверки / настройки базовой схемы аутентификации здесь? Как установить пароль и пользователя, который будет использоваться и т. Д.
Использованные ссылки:
http://msdn.microsoft.com/en-us/library/system.web.httpapplication.aspx
http://www.java2s.com/Code/CSharpAPI/System.Net/HttpListenerContextResponseStatusCode.htm
http://en.cship.org/wiki/ProxyJudge
Пример кода:
using System.IO;
using System.Net;
using System.Web;
using System.Collections.Specialized;
namespace IPJudge
{
public class IPJudgeClass : IHttpModule
{
public static void Main()
{
using (HttpListener listener = new HttpListener())
{
listener.AuthenticationSchemes = AuthenticationSchemes.None;
listener.Prefixes.Add("http://localhost:8080/");
//listener.Prefixes.Add("https://localhost/");
listener.Start();
HttpListenerContext ctx = listener.GetContext();
ctx.Response.StatusCode = 200;
string name = ctx.Request.QueryString["name"];
StreamWriter writer = new StreamWriter(ctx.Response.OutputStream);
writer.WriteLine("<P>Hello, {0}</P>", name);
writer.WriteLine("<ul>");
foreach (string header in ctx.Request.Headers.Keys)
{
writer.WriteLine("<li><b>{0}:</b> {1}</li>", header, ctx.Request.Headers[header]);
}
writer.WriteLine("</ul>");
writer.Close();
ctx.Response.Close();
listener.Stop();
}
}
public void Init(HttpApplication app)
{
app.AcquireRequestState += new System.EventHandler(app_AcquireRequestState);
app.PostAcquireRequestState += new System.EventHandler(app_PostAcquireRequestState);
}
public void app_AcquireRequestState(object o, System.EventArgs e)
{
HttpApplication httpApp = (HttpApplication)o;
HttpContext ctx = HttpContext.Current;
ctx.Response.Write(" Executing AcquireRequestState ");
ctx.Response.Close();
}
public void Dispose()
{
// TODO:
// Add code to clean up the
// instance variables of a module.
}
public void app_PostAcquireRequestState(object o, System.EventArgs e)
{
HttpApplication httpApp = (HttpApplication)o;
HttpContext ctx = HttpContext.Current;
string remotehost = ctx.Request.ServerVariables["REMOTE_ADDR"];
string httpuseragent = ctx.Request.ServerVariables["HTTP_USER_AGENT"];
string requstmethod = ctx.Request.ServerVariables["REQUEST_METHOD"];
string httpreferer = ctx.Request.ServerVariables["HTTP_REFERER"];
string HTTPXFORWARDEDFOR = ctx.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
string HTTPFORWARDEDFOR = ctx.Request.ServerVariables["HTTP_FORWARDED_FOR"];
string HTTPXFORWARDED = ctx.Request.ServerVariables["HTTP_X_FORWARDED"];
ctx.Response.Write("<P>REMOTE_ADDR: " + remotehost + "</P>");
ctx.Response.Write("<P>HTTP_USER_AGENT: " + httpuseragent + "</P>");
ctx.Response.Write("<P>REQUEST_METHOD: " + httpuseragent + "</P>");
ctx.Response.Write("<P>HTTP_REFERER: " + httpreferer + "</P>");
ctx.Response.Write("<P>HTTP_X_FORWARDED_FOR: " + httpreferer + "</P>");
ctx.Response.Write("<P>HTTP_FORWARDED_FOR: " + httpreferer + "</P>");
ctx.Response.Write("<P>HTTP_X_FORWARDED: " + httpreferer + "</P>");
ctx.Response.Close();
}
}
}