2008-10-14 15 views
24

मैं विंडोज के लिए एक कमांड लाइन उपकरण लिख रहा हूं जो इंटरनेट से फ़ाइलों को डाउनलोड करने के लिए libcurl का उपयोग करता है।मैं ब्राउजर की प्रॉक्सी सेटिंग्स कैसे ढूंढूं?

जाहिर है, जब उपयोगकर्ता प्रॉक्सी सर्वर के पीछे होता है तो डाउनलोडिंग काम नहीं करती है, क्योंकि प्रॉक्सी को कॉन्फ़िगर करने की आवश्यकता होती है। मैं अपने उपकरण को यथासंभव सरल रखना चाहता हूं, और प्रॉक्सी को कॉन्फ़िगर करने के साथ उपयोगकर्ता को बोझ नहीं करना है। मेरे टूल में कॉन्फ़िगरेशन फ़ाइल भी नहीं है, इसलिए उपयोगकर्ता को अन्य कमांड पर प्रॉक्सी सेटिंग्स में पास करना होगा, या एक पर्यावरण चर या somesuch - रास्ता बहुत अधिक परेशानी सेट करना होगा।

तो मैंने सोचा, हर किसी का ब्राउज़र आमतौर पर ठीक से स्थापित किया जाएगा, प्रॉक्सी कॉन्फ़िगर किया गया है और सब कुछ। यह सबसे बुनियादी उपयोगकर्ता के लिए भी सच होगा क्योंकि अन्यथा "उनका इंटरनेट काम नहीं करेगा"।

तो मुझे लगता है कि मैं यह पता लगा सकता हूं कि आईई की प्रॉक्सी सेटिंग्स को देखकर प्रॉक्सी का उपयोग करना है या नहीं।

मैं इसके बारे में कैसे जा सकता हूं? अधिक विशेष रूप से:

  • वहाँ "प्रॉक्सी सेटिंग" विंडोज में का एक सेट, सभी ब्राउज़रों (शायद IE के) द्वारा इस्तेमाल किया है, या मैं IE, फ़ायरफ़ॉक्स, ओपेरा, आदि के लिए अलग-अलग नित्यकर्म लिखने के लिए होता है?
  • मुझे पता है कि अगर वे मैन्युअल रूप से कॉन्फ़िगर किए गए हैं तो मैं शायद उचित रजिस्ट्री स्थानों से सीधे मानों को पढ़ सकता हूं, लेकिन क्या यह "स्वचालित रूप से प्रॉक्सी सर्वर का पता लगाने" के साथ भी काम करता है? क्या मुझे उस विकल्प से भी परेशान होना है, या यह (लगभग) कभी नहीं उपयोग किया जाता है?

लोगों को विकल्पों का सुझाव देना शुरू करने से पहले: मैं सी का उपयोग कर रहा हूं, इसलिए मैं Win32 API तक सीमित हूं, और मैं वास्तव में वास्तव में सी और libcurl का उपयोग करना चाहता हूं।

+1

है [कोड यहाँ आईई की प्रॉक्सी सेटिंग्स प्राप्त करने के लिए प्राप्त करें।] Http://stackoverflow.com/a/12601449/ 55 9 746 –

उत्तर

33

जो फ़ंक्शन आप खोज रहे हैं वह WinHttpGetIEProxyConfigForCurrentUser() है, जिसे http://msdn.microsoft.com/en-us/library/aa384096(VS.85).aspx पर प्रलेखित किया गया है। फ़ायरफ़ॉक्स और ओपेरा द्वारा डिफ़ॉल्ट रूप से अपनी प्रॉक्सी सेटिंग्स प्राप्त करने के लिए इस फ़ंक्शन का उपयोग किया जाता है, हालांकि आप उन्हें प्रति ब्राउज़र ओवरराइड कर सकते हैं। ऐसा मत करो, यद्यपि। करने के लिए सही काम (जो हर कोई करता है) सिर्फ आईई सेटिंग्स प्राप्त करना है और मान लें कि वे सही हैं, क्योंकि वे लगभग हमेशा होते हैं।

यहाँ प्रासंगिक तर्क है, जो आप अपनी आवश्यकताओं के लिए अनुकूलित करना चाहिए का एक नमूना है:

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 
    } 
} 
+2

यह एक बहुत अच्छा जवाब है, लेकिन कैश प्रॉक्सी प्रमाण-पत्र (उपयोगकर्ता नाम और पासवर्ड) भी होने की संभावना है जिसे किसी भी तरह प्रॉक्सी सर्वर पर अग्रेषित करने की आवश्यकता है, और मुझे नहीं लगता कि इस तकनीक के साथ इसे प्राप्त करने का एक तरीका है ? – Antony

1

इन मानों के लिए रजिस्ट्री कुंजी हैं जो आप सीधे तौर पर प्राप्त कर सकते हैं। आप इसे बिना किसी परेशानी के .NET में भी कर सकते हैं। मेरा मानना ​​है कि वेब क्लाइंट ऑब्जेक्ट वर्तमान सेटिंग्स के आधार पर आपके लिए प्रॉक्सी सेटिंग्स पर बातचीत करता है। यह सी #:

using System.Net; 

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

या उसके करीब कुछ ऐसा दिखाई देगा।

+0

जिस तरह से आप प्रॉक्सी का पता लगाने के लिए एक ही कक्षा का उपयोग कर सकते हैं। GetProxy() विधि के साथ एक प्रॉक्सी प्रॉपर्टी है। –

+0

धन्यवाद, लेकिन मैं सी का उपयोग कर रहा हूं इसलिए यह सवाल से बाहर है (और अगर मैं इससे बच सकता हूं तो मैं COM का सहारा नहीं लेना चाहता)। मैंने स्पष्ट करने के लिए प्रश्न संपादित किया है। – rix0rrr

0

फ़ायरफ़ॉक्स/Seamonkey के लिए, समस्या उतनी प्रोफ़ाइल के अस्तित्व की वजह से थोड़ा अधिक मुश्किल है।

यदि आप मानना ​​चाहते हैं कि केवल एक प्रोफ़ाइल है तो आपको केवल prefs.js ढूंढना होगा। आप network.proxy.type को पार्स करते हैं, और फिर इसे तय करने के लिए उपयोग करते हैं, जो संबंधित मान पढ़ने के लिए हैं।

मैं मोज़िला के लिए कुछ दस्तावेज़ों पर काम कर रहा हूं, इसलिए यहां अपने अनुवर्ती प्रश्नों को चेक करें (चेक विकी बॉक्स), और मैं आपको आवश्यक जानकारी देने की कोशिश करूंगा।

3

यहां एक संपूर्ण कोड नमूना कैसे WinHttpGetIEProxyConfigForCurrentUser सी # में winhttp.dll पुस्तकालय से विधि कॉल करने के

[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); 
    } 
} 
संबंधित मुद्दे