문제

Libcurl을 사용하여 인터넷에서 파일을 다운로드하는 Windows의 명령 줄 도구를 작성하고 있습니다.

프록시를 구성해야하기 때문에 사용자가 프록시 서버 뒤에있을 때 다운로드가 작동하지 않습니다. 그러나 도구를 가능한 한 간단하게 유지하고 싶지만 프록시를 구성 해야하는 경우 사용자에게 부담을 줄 필요가 없습니다. 내 도구에는 구성 파일이 없으므로 사용자는 모든 명령의 프록시 설정을 전달하거나 환경 변수 또는 공연을 너무 많이 설정해야합니다.

그래서 저는 모든 사람의 브라우저가 일반적으로 이미 제대로 설정되고 프록시 구성 및 모든 것을 설정할 것이라고 생각했습니다. 그렇지 않으면 "인터넷이 작동하지 않기 때문에"가장 기본적인 사용자조차도 마찬가지입니다.

그래서 나는 IE의 프록시 설정을 보면서 프록시를 사용할 것인지 알 수 있다고 생각합니다.

이것에 대해 어떻게 가나 요? 더 구체적으로:

  • 모든 브라우저 (즉, 아마도)에서 사용하는 Windows에 "프록시 설정"세트가 하나 있습니까, 아니면 IE, Firefox, Opera 등에 대해 다른 루틴을 작성해야합니까?
  • 수동으로 구성된 경우 적절한 레지스트리 위치에서 직접 값을 읽을 수 있지만 "자동으로 프록시 서버를 자동으로 감지합니까?"에서도 작동합니까? 나는 그 옵션을 귀찮게해야합니까, 아니면 (거의) 사용되지 않았습니까?

사람들이 대안을 제안하기 시작하기 전에 : 나는 C를 사용하고 있으므로 Win32 API로 제한되어 있으며 C와 Libcurl을 계속 사용하고 싶습니다.

도움이 되었습니까?

해결책

당신이 찾고있는 기능은 winhttpgetieproxyconfigforcurrentuser ()이며 http://msdn.microsoft.com/en-us/library/aa384096(vs.85).aspx. 이 기능은 Firefox 및 Opera에서 기본적으로 프록시 설정을 얻는 데 사용되지만 브라우저 당 대체 할 수 있습니다. 그래도 그렇게하지 마십시오. 옳은 일 (다른 사람들이하는 일)은 IE 설정을 얻고 거의 항상이기 때문에 정확하다고 가정하는 것입니다.

다음은 관련 논리의 샘플입니다. 귀하의 요구에 맞게 조정해야합니다.

if( WinHttpGetIEProxyConfigForCurrentUser( &ieProxyConfig ) )
{
    if( ieProxyConfig.fAutoDetect )
    {
        fAutoProxy = TRUE;
    }

    if( ieProxyConfig.lpszAutoConfigUrl != NULL )
    {
        fAutoProxy = TRUE;
        autoProxyOptions.lpszAutoConfigUrl = ieProxyConfig.lpszAutoConfigUrl;
    }
}
else
{
    // use autoproxy
    fAutoProxy = TRUE;
}

if( fAutoProxy )
{
    if ( autoProxyOptions.lpszAutoConfigUrl != NULL )
    {
        autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_CONFIG_URL;
    }
    else
    {
        autoProxyOptions.dwFlags = WINHTTP_AUTOPROXY_AUTO_DETECT;
        autoProxyOptions.dwAutoDetectFlags = WINHTTP_AUTO_DETECT_TYPE_DHCP | WINHTTP_AUTO_DETECT_TYPE_DNS_A;
    }

    // basic flags you almost always want
    autoProxyOptions.fAutoLogonIfChallenged = TRUE;

    // here we reset fAutoProxy in case an auto-proxy isn't actually
    // configured for this url
    fAutoProxy = WinHttpGetProxyForUrl( hiOpen, pwszUrl, &autoProxyOptions, &autoProxyInfo );
}

if ( fAutoProxy )
{
    // set proxy options for libcurl based on autoProxyInfo
}
else
{
    if( ieProxyConfig.lpszProxy != NULL )
    {
        // IE has an explicit proxy. set proxy options for libcurl here
        // based on ieProxyConfig
        //
        // note that sometimes IE gives just a single or double colon
        // for proxy or bypass list, which means "no proxy"
    }
    else
    {
        // there is no auto proxy and no manually configured proxy
    }
}

다른 팁

다음은 전화하는 방법에 대한 완전한 코드 샘플입니다 WinHttpGetIEProxyConfigForCurrentUser 방법 winhttp.dll C#의 라이브러리

[TestClass]
public class UnitTest1
{
    [StructLayout(LayoutKind.Sequential)]
    public struct WinhttpCurrentUserIeProxyConfig
    {
        [MarshalAs(UnmanagedType.Bool)]
        public bool AutoDetect;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string AutoConfigUrl;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string Proxy;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string ProxyBypass;

    }

    [DllImport("winhttp.dll", SetLastError = true)]
    static extern bool WinHttpGetIEProxyConfigForCurrentUser(ref WinhttpCurrentUserIeProxyConfig pProxyConfig);

    [TestMethod]
    public void TestMethod1()
    {
        var config = new WinhttpCurrentUserIeProxyConfig();

        WinHttpGetIEProxyConfigForCurrentUser(ref config);

        Console.WriteLine(config.Proxy);
        Console.WriteLine(config.AutoConfigUrl);
        Console.WriteLine(config.AutoDetect);
        Console.WriteLine(config.ProxyBypass);
    }
}

물론 직접 얻을 수있는 이러한 값에 대한 레지스트리 키가 있습니다. 당신은 또한 많은 번거 로움없이 .NET에서 이것을 할 수 있습니다. WebClient 객체가 현재 설정에 따라 프록시 설정을 협상한다고 생각합니다. 이것은 C#에서 이렇게 보일 것입니다.

using System.Net;

string url = "http://www.example.com";
WebClient client = new WebClient();
byte[] fileBuffer = client.DownloadFile(url);

또는 그것에 가까운 것.

Firefox/Seamonkey의 경우 많은 프로파일이 존재하기 때문에 문제가 조금 더 까다로워집니다.

프로필이 하나만 있다고 가정하고 싶다면 prefs.js 만 찾아야합니다. Network.proxy.type를 구문 분석 한 다음이를 사용하여 읽을 관련 값을 결정합니다.

Mozilla에 대한 문서를 작성하고 있으므로 후속 질문을 여기에 넣으십시오 (위키 상자 확인). 필요한 정보를 제공해 보겠습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top