Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
proxy.py — 💫 Ngrok FRP विकल्प • ⚡ तेज़ • 🪶 हल्का • 0️⃣ निर्भरता • 🔌 प्लगेबल • 😈 TLS अवरोधन • 🔒 DNS-over-HTTPS • 🔥 गरीब आदमी का VPN • ⏪ रिवर्स और ⏩ फॉरवर्ड • 👮🏿 "प्रॉक्सी सर्वर" फ्रेमवर्क • 🌐 "वेब सर्वर" फ्रेमवर्क • ➵ ➶ ➷ ➠ "PubSub" फ्रेमवर्क • 👷 "कार्य" स्वीकारकर्ता और निष्पादक फ्रेमवर्क | Kitploit
उपकरण/GitHubGitHub/abhinavsingh/proxy.py
वेब प्रॉक्सी और अवरोधनपेनिट्रेशन टेस्टिंगउपयोगिताएँ और फ्रेमवर्करेड टीमिंग
GitHubabhinavsingh/proxy.py

proxy.py

रिपॉजिटरी देखेंवेबसाइट
3.5k6291 साल पहलेKitploit द्वारा समीक्षित

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →

विवरण

💫 Ngrok FRP विकल्प • ⚡ तेज़ • 🪶 हल्का • 0️⃣ निर्भरता • 🔌 प्लगेबल • 😈 TLS अवरोधन • 🔒 DNS-over-HTTPS • 🔥 गरीब आदमी का VPN • ⏪ रिवर्स और ⏩ फॉरवर्ड • 👮🏿 "प्रॉक्सी सर्वर" फ्रेमवर्क • 🌐 "वेब सर्वर" फ्रेमवर्क • ➵ ➶ ➷ ➠ "PubSub" फ्रेमवर्क • 👷 "कार्य" स्वीकारकर्ता और निष्पादक फ्रेमवर्क

साझा करें

Proxy.Py

PyPi Monthly Docker Pulls No Dependencies Gitter License

Tested With MacOS, Ubuntu, Windows, Android, Android Emulator, iOS, iOS Simulator Android, Android Emulator iOS, iOS Simulator

pypi version Python 3.x Checked with mypy

doc codecov lib

Contributions Welcome Need Help Sponsored by Jaxl Innovations Private Limited

विषय सूची

  • सुविधाएँ
  • स्थापना
    • PIP का उपयोग करके
      • स्थिर संस्करण
      • विकास संस्करण
    • Docker का उपयोग करके
      • Docker Hub से स्थिर संस्करण
      • GHCR से विकास संस्करण
      • कंटेनर को स्थानीय रूप से बनाएं
    • HomeBrew का उपयोग करके
      • स्थिर संस्करण
      • विकास संस्करण
  • proxy.py प्रारंभ करें
    • PIP का उपयोग करके स्थापित होने पर कमांड लाइन से
      • इसे चलाएँ
      • लॉग को समझना
      • DEBUG लॉगिंग सक्षम करें
    • रिपॉजिटरी स्रोत का उपयोग करके कमांड लाइन से
    • Docker इमेज
      • स्टार्टअप फ्लैग्स को अनुकूलित करें
  • प्लगइन उदाहरण
    • HTTP प्रॉक्सी प्लगइन्स
      • ShortLink प्लगइन
      • ModifyPostData प्लगइन
      • MockRestApi प्लगइन
      • RedirectToCustomServer प्लगइन
      • FilterByUpstreamHost प्लगइन
      • CacheResponses प्लगइन
      • CacheByResponseType
      • ManInTheMiddle प्लगइन
      • ProxyPool प्लगइन
      • FilterByClientIp प्लगइन
      • ModifyChunkResponse प्लगइन
      • ModifyRequestHeader प्लगइन
      • CloudflareDnsResolver प्लगइन

सुविधाएँ

  • ngrok का ड्रॉप-इन विकल्प

  • तेज़ और स्केलेबल

    • सिस्टम पर सभी उपलब्ध कोर का उपयोग करके स्केल अप करें

    • asyncio का उपयोग करके थ्रेडलेस निष्पादन

    • हजारों कनेक्शन/सेकंड को संभालने के लिए बनाया गया

      root@kitploit:~
      # On Macbook Pro M2 2022
      ❯ python --version
      Python 3.11.8
      ❯ oha --version
      oha 1.4.3
      ❯ ./benchmark/compare.sh
        CONCURRENCY: 100 workers, DURATION: 1m, TIMEOUT: 1sec
        =============================
        Benchmarking Proxy.Py
        Server (pid:75969) running
        Summary:
          Success rate: 100.00%
          Total:        60.0006 secs
          Slowest:      0.2525 secs
          Fastest:      0.0002 secs
          Average:      0.0019 secs
          Requests/sec: 51667.3774
      
          Total data:   56.17 MiB
          Size/request: 19 B
          Size/sec:     958.64 KiB
      
        Response time histogram:
          0.000 [1]       |
          0.025 [3073746] |■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
          0.051 [10559]   |
          0.076 [4980]    |
          0.101 [2029]    |
          0.126 [5896]    |
          0.152 [2466]    |
          0.177 [116]     |
          0.202 [40]      |
          0.227 [52]      |
          0.253 [87]      |
      
        Response time distribution:
          10.00% in 0.0005 secs
          25.00% in 0.0007 secs
          50.00% in 0.0009 secs
          75.00% in 0.0014 secs
          90.00% in 0.0021 secs
          95.00% in 0.0035 secs
          99.00% in 0.0198 secs
          99.90% in 0.1262 secs
          99.99% in 0.1479 secs
      
        Details (average, fastest, slowest):
          DNS+dialup:   0.0018 secs, 0.0004 secs, 0.0031 secs
          DNS-lookup:   0.0000 secs, 0.0000 secs, 0.0002 secs
      
        Status code distribution:
          [200] 3099972 responses
      
        Error distribution:
          [100] aborted due to deadline
        =============================
      

स्थापना

proxy.py का उपयोग करके उत्पादन-ग्रेड एप्लिकेशन तैनात करते समय उत्पादन में proxy.py तैनात करना देखें।

PIP का उपयोग करके

PIP के साथ स्थिर संस्करण

PyPi से स्थापित करें```console ❯ pip install --upgrade proxy.py

root@kitploit:~
या GitHub `master` शाखा से```console
❯ pip install git+https://github.com/abhinavsingh/proxy.py.git@master

पीआईपी के साथ विकास संस्करण```console

❯ pip install git+https://github.com/abhinavsingh/proxy.py.git@develop

root@kitploit:~
## Docker का उपयोग करना

मल्टी-प्लेटफॉर्म कंटेनर निम्नलिखित के माध्यम से उपलब्ध हैं:

- Docker Hub
  - `latest` टैग अंतिम `stable` रिलीज़ को इंगित करता है
  - `docker pull abhinavsingh/proxy.py:latest`
- GitHub container registry (GHCR)
  - `latest` टैग अंतिम `develop` रिलीज़ को इंगित करता है
  - `docker pull ghcr.io/abhinavsingh/proxy.py:latest`

स्थिर संस्करण कंटेनर रिलीज़ निम्नलिखित प्लेटफॉर्मों के लिए उपलब्ध हैं:

- `linux/386`
- `linux/amd64`
- `linux/arm/v6`
- `linux/arm/v7`
- `linux/arm64/v8`
- `linux/ppc64le`
- `linux/s390x`

### Docker Hub से स्थिर संस्करण

`proxy.py` नवीनतम कंटेनर चलाएँ:```console
❯ docker run -it -p 8899:8899 --rm abhinavsingh/proxy.py:latest

Docker डेमॉन स्वचालित रूप से मेल खाने वाले प्लेटफ़ॉर्म इमेज को खींच लेगा। मल्टी-प्लेटफ़ॉर्म समर्थित सर्वरों पर विशिष्ट लक्ष्य प्लेटफ़ॉर्म कंटेनर चलाने के लिए:```console ❯ docker run -it -p 8899:8899 --rm --platform linux/arm64/v8 abhinavsingh/proxy.py:latest

root@kitploit:~
### GHCR से विकास संस्करण

`proxy.py` कंटेनर को डेवलप ब्रांच में अत्याधुनिक कोड से चलाएँ:```console
❯ docker run -it -p 8899:8899 --rm ghcr.io/abhinavsingh/proxy.py:latest

स्थानीय रूप से डेवलपमेंट संस्करण बनाएं```console

❯ git clone https://github.com/abhinavsingh/proxy.py.git ❯ cd proxy.py && make container ❯ docker run -it -p 8899:8899 --rm abhinavsingh/proxy.py:latest

root@kitploit:~
[![WARNING](https://img.shields.io/static/v1?label=MacOS&message=warning&color=red)](https://github.com/moby/vpnkit/issues/469)
`docker` इमेज `macOS` पर [vpnkit](https://github.com/moby/vpnkit/issues/469) के साथ असंगति के कारण वर्तमान में टूटा हुआ है।

## HomeBrew का उपयोग करना

`HomeBrew` के लिए अपडेटेड फॉर्मूले `helper/homebrew` निर्देशिका के अंतर्गत `develop` ब्रांच में बनाए रखे जाते हैं।

- `stable` फॉर्मूले `master` ब्रांच से पैकेज इंस्टॉल करते हैं।
- `develop` फॉर्मूले `develop` ब्रांच से पैकेज इंस्टॉल करते हैं।

### HomeBrew के साथ स्थिर संस्करण```console
❯ brew install https://raw.githubusercontent.com/abhinavsingh/proxy.py/develop/helper/homebrew/stable/proxy.rb

HomeBrew के साथ विकास संस्करण```console

❯ brew install https://raw.githubusercontent.com/abhinavsingh/proxy.py/develop/helper/homebrew/develop/proxy.rb

root@kitploit:~
# Start proxy.py

## PIP का उपयोग करके स्थापित होने पर कमांड लाइन से

जब `proxy.py` को `pip` का उपयोग करके स्थापित किया जाता है,
तो एक निष्पादन योग्य फ़ाइल `proxy` आपके `$PATH` में रख दी जाती है।

### इसे चलाएँ

डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ शुरू करने के लिए बस कमांड लाइन पर `proxy` टाइप करें।```console
❯ proxy
...[redacted]... - Loaded plugin proxy.http.proxy.HttpProxyPlugin
...[redacted]... - Started 8 threadless workers
...[redacted]... - Started 8 acceptors
...[redacted]... - Listening on 127.0.0.1:8899

लॉग को समझना

उपरोक्त लॉग से ध्यान देने योग्य बातें:

  • Loaded plugin

    • proxy.py डिफ़ॉल्ट रूप से proxy.http.proxy.HttpProxyPlugin लोड करेगा
    • जैसा कि नाम से पता चलता है, यह कोर प्लगइन proxy.py इंस्टेंस में http(s) प्रॉक्सी सर्वर क्षमताएँ जोड़ता है
  • Started N threadless workers

    • डिफ़ॉल्ट रूप से, proxy.py मशीन पर जितने CPU कोर हैं उतनी ही वर्कर प्रक्रियाएँ शुरू करेगा
    • वर्कर प्रक्रियाओं की संख्या को अनुकूलित करने के लिए --num-workers फ़्लैग का उपयोग करें
    • यह समझने के लिए Threads vs Threadless देखें कि निष्पादन मोड को कैसे नियंत्रित किया जाए
  • Started N acceptors

    • डिफ़ॉल्ट रूप से, proxy.py मशीन पर जितने CPU कोर हैं उतनी ही एक्सेप्टर प्रक्रियाएँ शुरू करेगा
    • एक्सेप्टर प्रक्रियाओं की संख्या को अनुकूलित करने के लिए --num-acceptors फ़्लैग का उपयोग करें

DEBUG लॉगिंग सक्षम करें

उपरोक्त सभी लॉग proxy.py के लिए डिफ़ॉल्ट --log-level INFO स्तर के लॉग हैं।

आइए proxy.py को DEBUG स्तर की लॉगिंग के साथ शुरू करें:```console ❯ proxy --log-level d ...[redacted]... - Open file descriptor soft limit set to 1024 ...[redacted]... - Loaded plugin proxy.http_proxy.HttpProxyPlugin ...[redacted]... - Started 8 workers ...[redacted]... - Started server on ::1:8899

root@kitploit:~
आप लॉग स्तर को अनुकूलित करने के लिए एक अक्षर का उपयोग कर सकते हैं। उदाहरण:
- `d = DEBUG`
- `i = INFO`
- `w = WARNING`
- `e = ERROR`
- `c = CRITICAL`

जैसा कि हम उपरोक्त लॉग से देख सकते हैं, शुरू करने से पहले:

- `proxy.py` ने सिस्टम पर ओपन फ़ाइल सीमा `ulimit` सेट करने का प्रयास किया
- `--open-file-limit` के लिए डिफ़ॉल्ट मान `1024` उपयोग किया गया
- `--open-file-limit` फ़्लैग `Windows` ऑपरेटिंग सिस्टम पर कोई प्रभाव नहीं डालता

उपलब्ध कॉन्फ़िगरेशन विकल्पों की पूरी सूची के लिए [फ़्लैग](#flags) देखें।

## रिपो स्रोत से कमांड लाइन का उपयोग करके

यदि आप `proxy.py` को स्रोत कोड से चलाने का प्रयास कर रहे हैं,
तो स्रोत कोड में `proxy` नामक कोई बाइनरी फ़ाइल नहीं है।

स्रोत कोड से `proxy.py` शुरू करने के लिए इन निर्देशों का पालन करें:

- रिपो क्लोन करें  ```console
  ❯ git clone https://github.com/abhinavsingh/proxy.py.git
  ❯ cd proxy.py
  • Python 3 virtual env बनाएँ ```console ❯ python3 -m venv venv ❯ source venv/bin/activate

    root@kitploit:~
  • निर्भरताएँ स्थापित करें ```console ❯ make lib-dep

    root@kitploit:~
  • उत्पन्न करें proxy/common/_scm_version.py

    नोट: निम्नलिखित चरण संपादन योग्य स्थापनाओं के लिए आवश्यक नहीं है।

    यह फ़ाइल SCM द्वारा पता लगाए गए संस्करण को proxy/common/_scm_version.py फ़ाइल में लिखती है। ```console ❯ ./write-scm-version.sh

    root@kitploit:~
  • वैकल्पिक रूप से, परीक्षण चलाएँ ```console ❯ make

    root@kitploit:~
  • चलाएं proxy.py ```console ❯ python -m proxy

    root@kitploit:~

देखें प्लगइन डेवलपर और योगदानकर्ता गाइड यदि आप proxy.py स्रोत कोड के साथ काम करने की योजना बना रहे हैं।

Docker इमेज

स्टार्टअप फ्लैग्स को अनुकूलित करें

डिफ़ॉल्ट रूप से docker बाइनरी IPv4 नेटवर्किंग फ्लैग्स के साथ शुरू होती है:

root@kitploit:~
--hostname 0.0.0.0 --port 8899

जब docker कंटेनर शुरू कर रहे हों, तो आप कमांड लाइन से फ्लैग को ओवरराइड कर सकते हैं। उदाहरण के लिए, docker कंटेनर के अंदर proxy.py का संस्करण जांचने के लिए, चलाएँ:

root@kitploit:~
❯ docker run -it \
    -p 8899:8899 \
    --rm abhinavsingh/proxy.py:latest \
    -v

प्लगइन उदाहरण

  • पूर्ण कोड के लिए प्लगइन मॉड्यूल देखें।
  • सभी बंडल किए गए प्लगइन उदाहरण https ट्रैफ़िक के साथ भी काम करते हैं
    • अतिरिक्त फ्लैग्स और प्रमाणपत्र जनरेशन की आवश्यकता होती है
    • देखें TLS इंटरसेप्शन।
  • प्लगइन उदाहरण Docker इमेज के साथ भी बंडल किए गए हैं।
    • Docker इमेज के साथ प्लगइन्स आज़माने के लिए स्टार्टअप फ्लैग्स को अनुकूलित करें देखें।

HTTP प्रॉक्सी प्लगइन्स

ShortLinkPlugin

अपने पसंदीदा ब्राउज़र/एप्लिकेशन में शॉर्ट लिंक के लिए समर्थन जोड़ें।

शॉर्टलिंक प्लगइन

proxy.py को इस प्रकार शुरू करें:```console ❯ proxy
--plugins proxy.plugin.ShortLinkPlugin

root@kitploit:~
अब आप अपने दैनिक ब्राउज़िंग अनुभव को तेज़ कर सकते हैं अपनी पसंदीदा वेबसाइट पर एकल वर्ण डोमेन नामों का उपयोग करके विज़िट करके :). यह सभी ब्राउज़रों में काम करता है।

निम्नलिखित लघु लिंक डिफ़ॉल्ट रूप से सक्षम हैं:

| Short Link |  Destination URL   |
| :--------: |  :--------------:  |
|     a/     |    `amazon.com`    |
|     i/     |  `instagram.com`   |
|     l/     |   `linkedin.com`   |
|     f/     |   `facebook.com`   |
|     g/     |    `google.com`    |
|     t/     |   `twitter.com`    |
|     w/     | `web.whatsapp.com` |
|     y/     |   `youtube.com`    |
|   proxy/   |  `localhost:8899`  |

### ModifyPostDataPlugin

अपस्ट्रीम सर्वर पर अनुरोध भेजने से पहले POST अनुरोध बॉडी को संशोधित करता है।

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy \
    --plugins proxy.plugin.ModifyPostDataPlugin

डिफ़ॉल्ट रूप से प्लगइन POST बॉडी सामग्री को हार्ड-कोडेड b'{"key": "modified"}' से बदल देता है और Content-Type: application/json लागू करता है।

इसे curl -x localhost:8899 -d '{"key": "value"}' http://httpbin.org/post का उपयोग करके सत्यापित करें।```console { "args": {}, "data": "{"key": "modified"}", "files": {}, "form": {}, "headers": { "Accept": "/", "Content-Length": "19", "Content-Type": "application/json", "Host": "httpbin.org", "User-Agent": "curl/7.54.0" }, "json": { "key": "modified" }, "origin": "1.2.3.4, 5.6.7.8", "url": "https://httpbin.org/post" }

root@kitploit:~
ऊपर दिए गए प्रतिक्रिया से निम्नलिखित नोट:

1. POST डेटा को संशोधित किया गया `"data": "{\"key\": \"modified\"}"`.
   मूल `curl` कमांड डेटा था `{"key": "value"}`.
2. हमारे `curl` कमांड ने कोई `Content-Type` हेडर नहीं जोड़ा,
   लेकिन हमारे प्लगइन ने एक `"Content-Type": "application/json"` जोड़ा।
   इसे उपरोक्त आउटपुट में `json` फील्ड देखकर भी सत्यापित किया जा सकता है:   ```
   "json": {
    "key": "modified"
   },
  1. हमारे प्लगइन ने संशोधित बॉडी की लंबाई से मेल खाने के लिए एक Content-Length हेडर भी जोड़ा। of modified body.

MockRestApiPlugin

अपने सर्वर REST API के लिए मॉक प्रतिक्रियाएँ। क्लाइंट साइड एप्लिकेशन को परीक्षण और विकसित करने के लिए उपयोग करें, बिना किसी वास्तविक अपस्ट्रीम REST API सर्वर की आवश्यकता के।

Start proxy.py as:```console ❯ proxy
--plugins proxy.plugin.ProposedRestApiPlugin

root@kitploit:~
मॉक API प्रतिक्रिया सत्यापित करने के लिए `curl -x localhost:8899 http://api.example.com/v1/users/` का उपयोग करें```console
{"count": 2, "next": null, "previous": null, "results": [{"email": "[email protected]", "groups": [], "url": "api.example.com/v1/users/1/", "username": "admin"}, {"email": "[email protected]", "groups": [], "url": "api.example.com/v1/users/2/", "username": "admin"}]}

इसी को proxy.py लॉग्स की जाँच करके सत्यापित करें:```console ... [redacted] ... - access_log:1210 - ::1:64792 - GET None:None/v1/users/ - None None - 0 byte

root@kitploit:~
Access log shows `None:None` as server `ip:port`. `None` simply means that
the server connection was never made, since response was returned by our plugin.

Now modify `ProposedRestApiPlugin` to returns REST API mock
responses as expected by your clients.

### RedirectToCustomServerPlugin

Redirects all incoming `http` requests to custom web server.
By default, it redirects client requests to inbuilt web server,
also running on `8899` port.

Start `proxy.py` and enable inbuilt web server:```console
❯ proxy \
    --enable-web-server \
    --plugins proxy.plugin.RedirectToCustomServerPlugin

उपयोग करके सत्यापित करें `curl -v -x localhost:8899 http://google.com```` ... [redacted] ... < HTTP/1.1 404 NOT FOUND < Server: proxy.py v1.0.0 < Connection: Close <

  • Closing connection 0
root@kitploit:~
उपरोक्त `404` प्रतिक्रिया `proxy.py` वेब सर्वर से वापस की गई थी।

`proxy.py` के लॉग की जाँच करके इसकी पुष्टि करें।
प्रॉक्सी अनुरोध लॉग के साथ, आपको एक http वेब सर्वर अनुरोध लॉग भी देखना होगा।```
... [redacted] ... - access_log:1241 - ::1:49525 - GET /
... [redacted] ... - access_log:1157 - ::1:49524 - GET localhost:8899/ - 404 NOT FOUND - 70 bytes

FilterByUpstreamHostPlugin

अपस्ट्रीम होस्ट का निरीक्षण करके ट्रैफ़िक को गिराता है। डिफ़ॉल्ट रूप से, प्लगइन facebook.com और www.facebok.com के लिए ट्रैफ़िक गिराता है।

proxy.py को इस प्रकार प्रारंभ करें:```console ❯ proxy
--plugins proxy.plugin.FilterByUpstreamHostPlugin

root@kitploit:~
इसका प्रयोग करके सत्यापित करें `curl -v -x localhost:8899 http://facebook.com`:```console
... [redacted] ...
< HTTP/1.1 418 I'm a tea pot
< Proxy-agent: proxy.py v1.0.0
* no chunk, no close, no size. Assume close to signal end
<
* Closing connection 0

उपरोक्त 418 I'm a tea pot हमारे प्लगइन द्वारा भेजा गया है।

proxy.py के लॉग का निरीक्षण करके इसकी पुष्टि करें:```console ... [redacted] ... - handle_readables:1347 - HttpProtocolException type raised Traceback (most recent call last): ... [redacted] ... ... [redacted] ... - access_log:1157 - ::1:49911 - GET None:None/ - None None - 0 bytes

root@kitploit:~
### CacheResponsesPlugin

अपस्ट्रीम सर्वर प्रतिक्रियाओं को कैश करता है।

प्रारंभ करें `proxy.py` इस प्रकार:```console
❯ proxy \
    --plugins proxy.plugin.CacheResponsesPlugin

आप निरीक्षण के लिए अनुरोध पैकेट कैशिंग को सक्षम करने के लिए --cache-requests फ़्लैग का भी उपयोग कर सकते हैं। इसका उपयोग करके सत्यापित करें curl -v -x localhost:8899 http://httpbin.org/get:```console ... [redacted] ... < HTTP/1.1 200 OK < Access-Control-Allow-Credentials: true < Access-Control-Allow-Origin: * < Content-Type: application/json < Date: Wed, 25 Sep 2019 02:24:25 GMT < Referrer-Policy: no-referrer-when-downgrade < Server: nginx < X-Content-Type-Options: nosniff < X-Frame-Options: DENY < X-XSS-Protection: 1; mode=block < Content-Length: 202 < Connection: keep-alive < { "args": {}, "headers": { "Accept": "/", "Host": "httpbin.org", "User-Agent": "curl/7.54.0" }, "origin": "1.2.3.4, 5.6.7.8", "url": "https://httpbin.org/get" }

  • Connection #0 to host localhost left intact
root@kitploit:~
`proxy.py` लॉग से कैश फ़ाइल का पथ प्राप्त करें:```console
... [redacted] ... - GET httpbin.org:80/get - 200 OK - 556 bytes
... [redacted] ... - Cached response at /var/folders/k9/x93q0_xn1ls9zy76m2mf2k_00000gn/T/httpbin.org-1569378301.407512.txt

कैश फ़ाइल की सामग्री सत्यापित करें `cat /path/to/your/cache/httpbin.org.txt````console HTTP/1.1 200 OK Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: * Content-Type: application/json Date: Wed, 25 Sep 2019 02:24:25 GMT Referrer-Policy: no-referrer-when-downgrade Server: nginx X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block Content-Length: 202 Connection: keep-alive

{ "args": {}, "headers": { "Accept": "/", "Host": "httpbin.org", "User-Agent": "curl/7.54.0" }, "origin": "1.2.3.4, 5.6.7.8", "url": "https://httpbin.org/get" }

root@kitploit:~
### CacheByResponseType

`CacheResponsesPlugin` प्लगइन `content-type` द्वारा प्रतिक्रियाओं को स्वचालित रूप से कैश भी कर सकता है। इसे आज़माने के लिए, आपको [TLS Interception](#tls-interception) मोड के तहत चलना होगा और फिर `--cache-by-content-type` फ़्लैग पास करना होगा।  उदाहरण:```console
❯ proxy \
    --plugins proxy.plugin.CacheResponsesPlugin \
    --cache-by-content-type \
    --ca-key-file ca-key.pem \
    --ca-cert-file ca-cert.pem \
    --ca-signing-key ca-signing-key.pem

प्रॉक्सी सर्वर पर कुछ अनुरोध करें और आप ~/.proxy/cache निर्देशिका के अंतर्गत डेटा देखेंगे।

आपको 2 फ़ोल्डर्स दिखाई देंगे:

  • content: इसमें सामग्री प्रकार के अनुसार पार्स किए गए jpg, css, js, html, pdf आदि शामिल हैं
  • responses: इसमें प्राप्त कच्चे प्रतिक्रियाएँ शामिल हैं (निश्चित रूप से इंटरसेप्शन के कारण डिक्रिप्ट की गईं)

ManInTheMiddlePlugin

ऊपरी स्ट्रीम सर्वर प्रतिक्रियाओं को संशोधित करता है।

proxy.py को इस प्रकार प्रारंभ करें:```console ❯ proxy
--plugins proxy.plugin.ManInTheMiddlePlugin

root@kitploit:~
`curl -v -x localhost:8899 http://google.com` का उपयोग करके सत्यापित करें:```console
... [redacted] ...
< HTTP/1.1 200 OK
< Content-Length: 28
<
* Connection #0 to host localhost left intact
Hello from man in the middle

Response body Hello from man in the middle हमारे प्लगइन द्वारा भेजा जाता है।

ProxyPoolPlugin

आने वाली प्रॉक्सी अनुरोधों को अपस्ट्रीम प्रॉक्सी सर्वरों के एक समूह को अग्रेषित करें।

पहले 2 अपस्ट्रीम प्रॉक्सी शुरू करते हैं। अपस्ट्रीम प्रॉक्सी का अनुकरण करने के लिए, proxy.py को पोर्ट 9000 और 9001 पर शुरू करें।```console ❯ proxy --port 9000

root@kitploit:~
Please provide the Markdown content to translate.```console
❯ proxy --port 9001

अब, proxy.py को ProxyPoolPlugin के साथ (डिफ़ॉल्ट 8899 पोर्ट पर) शुरू करें, जो हमारे अपस्ट्रीम प्रॉक्सीज़ 9000 और 9001 पोर्ट पर इंगित करता है।```console ❯ proxy
--plugins proxy.plugin.ProxyPoolPlugin
--proxy-pool localhost:9000
--proxy-pool localhost:9001

root@kitploit:~
`8899` प्रॉक्सी के माध्यम से curl अनुरोध करें:

`curl -v -x localhost:8899 http://httpbin.org/get`

सत्यापित करें कि `8899` प्रॉक्सी अनुरोधों को अपस्ट्रीम प्रॉक्सियों तक अग्रेषित करता है, संबंधित लॉग की जाँच करके।

यदि किसी अपस्ट्रीम प्रॉक्सी को क्रेडेंशियल्स की आवश्यकता है, तो उन्हें तर्क के रूप में पास करें। उदाहरण:

`--proxy-pool user:[email protected]:port`

### FilterByClientIpPlugin

विशिष्ट IP पतों से ट्रैफ़िक को अस्वीकार करें। डिफ़ॉल्ट रूप से यह प्लगइन `127.0.0.1` और `::1` से ट्रैफ़िक को ब्लॉक करता है।

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy \
    --plugins proxy.plugin.FilterByClientIpPlugin

curl -v -x localhost:8899 http://google.com का उपयोग करके अनुरोध भेजें:```console ... [redacted] ...

Proxy-Connection: Keep-Alive

< HTTP/1.1 418 I'm a tea pot < Connection: close <

  • Closing connection 0
root@kitploit:~
अपने स्वाद के अनुसार प्लगइन को संशोधित करें, उदाहरण के लिए केवल विशिष्ट IP पतों की अनुमति दें।

### ModifyChunkResponsePlugin

यह प्लगइन दर्शाता है कि चंक एन्कोडेड प्रतिक्रियाओं को कैसे संशोधित किया जाए। ऐसा करने में सक्षम होने के लिए, यह प्लगइन चंक एन्कोडेड प्रतिक्रिया को पार्स करने के लिए `proxy.py` कोर का उपयोग करता है। फिर हम कस्टम हार्ड-कोडेड चंक का उपयोग करके प्रतिक्रिया का पुनर्निर्माण करते हैं, अपस्ट्रीम सर्वर से प्राप्त मूल चंक को अनदेखा करते हुए।

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy \
    --plugins proxy.plugin.ModifyChunkResponsePlugin

का उपयोग करके सत्यापित करें: `curl -v -x localhost:8899 http://httpbin.org/stream/5````console ... [redacted] ... modify chunk response plugin

  • Connection #0 to host localhost left intact
  • Closing connection 0
root@kitploit:~
Modify `ModifyChunkResponsePlugin` को अपनी पसंद के अनुसार संशोधित करें। उदाहरण, हार्ड-कोडेड चंक्स भेजने के बजाय, अपस्ट्रीम सर्वर से प्राप्त मूल `JSON` चंक्स को पार्स और संशोधित करें।

### ModifyRequestHeaderPlugin

यह प्लगइन दर्शाता है कि TLS इंटरसेप्शन मोड के तहत आउटगोइंग HTTPS अनुरोध हेडर को कैसे संशोधित किया जाए।

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy \
    --plugins proxy.plugin.ModifyRequestHeaderPlugin \
    ... [TLS interception flags] ...

इसका उपयोग करके सत्यापित करें curl -x localhost:8899 --cacert ca-cert.pem https://httpbin.org/get:```console { "args": {}, "headers": { ... [redacted] ..., "X-Proxy-Py-Version": "2.4.4rc6.dev15+gf533c711" }, ... [redacted] ... }

root@kitploit:~
### CloudflareDnsResolverPlugin

यह प्लगइन `Cloudflare` द्वारा होस्ट किए गए `DNS-over-HTTPS` [API](https://developers.cloudflare.com/1.1.1.1/encrypted-dns/dns-over-https/make-api-requests/dns-json) (json) का उपयोग करता है।

`DoH` एक HTTP2-अनुरूप क्लाइंट की आवश्यकता है। दुर्भाग्य से `proxy.py` अभी तक वह प्रदान नहीं करता है, इसलिए हम एक निर्भरता का उपयोग करते हैं। इसे स्थापित करें:```console
❯ pip install "httpx[http2]"

अब proxy.py को इस प्रकार प्रारंभ करें:```console ❯ proxy
--plugins proxy.plugin.CloudflareDnsResolverPlugin

root@kitploit:~
डिफ़ॉल्ट रूप से, `CloudflareDnsResolverPlugin` `security` मोड में चलता है और मैलवेयर सुरक्षा प्रदान करता है।
`--cloudflare-dns-mode family` का उपयोग करके वयस्क सामग्री सुरक्षा भी सक्षम करें।

### CustomDnsResolverPlugin

यह प्लगइन `proxy.py` के साथ कस्टम DNS रिज़ॉल्यूशन कार्यान्वयन का उपयोग करने का प्रदर्शन करता है।
यह उदाहरण प्लगइन वर्तमान में पायथन के अंतर्निहित रिज़ॉल्यूशन तंत्र का उपयोग करता है। अपनी पसंद के अनुसार कोड को अनुकूलित करें।
उदाहरण के लिए, अपने कस्टम DNS सर्वर से क्वेरी करें, `DoH` या अन्य तंत्र लागू करें।

`proxy.py` को इस प्रकार शुरू करें:```console
❯ proxy \
    --plugins proxy.plugin.CustomDnsResolverPlugin

CustomNetworkInterface

HttpProxyBasePlugin.resolve_dns कॉलबैक का उपयोग network interface को कॉन्फ़िगर करने के लिए भी किया जा सकता है, जिसे अपस्ट्रीम सर्वर से कनेक्शन के लिए source_address के रूप में उपयोग किया जाना चाहिए।

अधिक जानकारी के लिए यह थ्रेड देखें।

PS: इस नाम का कोई प्लगइन नहीं है, लेकिन CustomDnsResolverPlugin को आपकी आवश्यकताओं के अनुसार आसानी से अनुकूलित किया जा सकता है।

ProgramNamePlugin

स्थानीय मशीन से उत्पन्न प्रॉक्सी अनुरोधों के लिए प्रोग्राम (application) नाम को हल करने का प्रयास करता है। यदि पहचान हो जाती है, तो एक्सेस लॉग में क्लाइंट IP को प्रोग्राम नाम से बदल दिया जाता है।

proxy.py इस प्रकार प्रारंभ करें:```console ❯ proxy
--plugins proxy.plugin.ProgramNamePlugin

root@kitploit:~
`curl` का उपयोग करके एक अनुरोध करें:```console
❯ curl -v -x localhost:8899 https://httpbin.org/get

आपको इस प्रकार की लॉग लाइनें देखनी चाहिए:```console ... [redacted] ... - [I] server.access_log:419 - curl:58096 - CONNECT httpbin.org:443 - 6010 bytes - 1824.62ms

root@kitploit:~
ध्यान दें `curl` का उपयोग `::1` या `127.0.0.1` के स्थान पर क्लाइंट IP के रूप में करें।

[![WARNING](https://img.shields.io/static/v1?label=Compatibility&message=warning&color=red)](#programnameplugin) यदि `ProgramNamePlugin` आपके ऑपरेटिंग सिस्टम पर विश्वसनीय रूप से काम नहीं करता है, तो कृपया पुल अनुरोध भेजकर और/या एक मुद्दा खोलकर योगदान करें। धन्यवाद!!!

## HTTP वेब सर्वर प्लगइन्स

### वेब सर्वर रूट

प्लगइन का उपयोग करके अंतर्निहित वेब सर्वर रूटिंग को प्रदर्शित करता है।

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy --enable-web-server \
    --plugins proxy.plugin.WebServerPlugin

का उपयोग करके सत्यापित करें curl -v localhost:8899/http-route-example, वापस लौटना चाहिए:```console HTTP route response

root@kitploit:~
## रिवर्स प्रॉक्सी प्लगइन्स

रिवर्स प्रॉक्सी क्षमताओं को जोड़ने के लिए अंतर्निहित वेब सर्वर का विस्तार करता है।

### रिवर्स प्रॉक्सी

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy --enable-reverse-proxy \
    --plugins proxy.plugin.ReverseProxyPlugin

डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ, ReverseProxyPlugin प्लगइन निम्नलिखित Nginx कॉन्फ़िग के बराबर है:```console location /get { proxy_pass http://httpbin.org/get; }

root@kitploit:~
सत्यापित करें `curl -v localhost:8899/get`:```console
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "localhost",
    "User-Agent": "curl/7.64.1"
  },
  "origin": "1.2.3.4, 5.6.7.8",
  "url": "https://localhost/get"
}

पुनर्लेखन Host Header

उपरोक्त उदाहरण के साथ, आप कभी-कभी देख सकते हैं:```console

  • Empty reply from server
  • Closing connection curl: (52) Empty reply from server
root@kitploit:~
यह इसलिए हो रहा है क्योंकि हमारा डिफ़ॉल्ट रिवर्स प्रॉक्सी प्लगइन `ReverseProxyPlugin` एक `http` और एक `https` अपस्ट्रीम सर्वर के साथ कॉन्फ़िगर किया गया है। और, डिफ़ॉल्ट रूप से `ReverseProxyPlugin` मूल होस्ट हेडर को संरक्षित करता है। जबकि यह `https` अपस्ट्रीम के साथ काम करता है, यह `http` अपस्ट्रीम के साथ विश्वसनीय रूप से काम नहीं करता है। इस समस्या को हल करने के लिए `--rewrite-host-header` फ्लैग का उपयोग करें।

उदाहरण:```console
❯ proxy --enable-reverse-proxy \
    --plugins proxy.plugin.ReverseProxyPlugin \
    --rewrite-host-header

यह सुनिश्चित करेगा कि Host हेडर फ़ील्ड httpbin.org के रूप में सेट है और http और https अपस्ट्रीम दोनों के साथ काम करता है।

नोट: --rewrite-host-header का उपयोग करना है या नहीं यह आपके उपयोग-मामले पर निर्भर करता है।

प्लगइन क्रम

जब कई प्लगइन्स का उपयोग कर रहे हों, तो प्लगइन कार्यक्षमता के आधार पर, उस क्रम पर विचार करना महत्वपूर्ण हो सकता है जिसमें प्लगइन्स कमांड लाइन पर पास किए जाते हैं।

प्लगइन्स उसी क्रम में कॉल किए जाते हैं जिस क्रम में वे पास किए जाते हैं। उदाहरण के लिए, मान लें कि हम FilterByUpstreamHostPlugin और RedirectToCustomServerPlugin दोनों का उपयोग कर रहे हैं। विचार यह है कि facebook.com और www.facebook.com के लिए आने वाले सभी http अनुरोधों को छोड़ दें और अन्य http अनुरोधों को हमारे अंतर्निहित वेब सर्वर पर रीडायरेक्ट करें।

इसलिए, इस परिदृश्य में FilterByUpstreamHostPlugin का उपयोग RedirectToCustomServerPlugin से पहले करना महत्वपूर्ण है। यदि हम RedirectToCustomServerPlugin को FilterByUpstreamHostPlugin से पहले सक्षम करते हैं, तो facebook अनुरोध भी अंतर्निहित वेब सर्वर पर रीडायरेक्ट हो जाएंगे, गिराए जाने के बजाय।

एंड-टू-एंड एन्क्रिप्शन

डिफ़ॉल्ट रूप से, proxy.py क्लाइंट्स जैसे curl, ब्राउज़र के साथ संचार के लिए http प्रोटोकॉल का उपयोग करता है। tls / https का उपयोग करके एंड-टू-एंड एन्क्रिप्शन सक्षम करने के लिए पहले प्रमाणपत्र जनरेट करें। चेकआउट करें रिपॉजिटरी और चलाएं:```console make https-certificates

root@kitploit:~
`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy \
    --cert-file https-cert.pem \
    --key-file https-key.pem

इसका उपयोग करके सत्यापित करें:curl -x https://localhost:8899 --proxy-cacert https-cert.pem https://httpbin.org/get:```console { "args": {}, "headers": { "Accept": "/", "Host": "httpbin.org", "User-Agent": "curl/7.54.0" }, "origin": "1.2.3.4, 5.6.7.8", "url": "https://httpbin.org/get" }

root@kitploit:~
यदि आप `--proxy-cacert` फ़्लैग पास करने से बचना चाहते हैं, तो जनरेट किए गए SSL प्रमाणपत्रों पर हस्ताक्षर करने पर भी विचार करें। उदाहरण:

पहले, CA प्रमाणपत्र जनरेट करें:```console
make ca-certificates

फिर, SSL प्रमाणपत्र पर हस्ताक्षर करें:```console make sign-https-certificates

root@kitploit:~
अब सर्वर को `--cert-file https-signed-cert.pem` फ़्लैग के साथ पुनः प्रारंभ करें। ध्यान दें कि आपको अपने सिस्टम कीचेन में जनरेट किए गए `ca-cert.pem` पर भरोसा करना होगा।

# TLS अवरोधन

डिफ़ॉल्ट रूप से, `proxy.py` क्लाइंट और सर्वर के बीच `https` ट्रैफ़िक को डिक्रिप्ट नहीं करेगा।
TLS अवरोधन सक्षम करने के लिए पहले रूट CA प्रमाणपत्र जनरेट करें:```console
❯ make ca-certificates

आइए CacheResponsePlugin को भी सक्षम करें ताकि हम सर्वर से डिक्रिप्टेड प्रतिक्रिया सत्यापित कर सकें। proxy.py को इस प्रकार प्रारंभ करें:```console ❯ proxy
--plugins proxy.plugin.CacheResponsesPlugin
--ca-key-file ca-key.pem
--ca-cert-file ca-cert.pem
--ca-signing-key-file ca-signing-key.pem

root@kitploit:~
[![NOTE](https://img.shields.io/static/v1?label=MacOS&message=note&color=yellow)](https://github.com/abhinavsingh/proxy.py#user-content-flags) पीयर प्रमाणपत्रों के सत्यापन के लिए आवश्यक स्पष्ट CA बंडल पथ भी प्रदान करें। `--ca-file` फ़्लैग देखें।

`curl` का उपयोग करके TLS इंटरसेप्शन सत्यापित करें।```console
❯ curl -v -x localhost:8899 --cacert ca-cert.pem https://httpbin.org/get

इनपुट:```console

  • issuer: C=US; ST=CA; L=SanFrancisco; O=proxy.py; OU=CA; CN=Proxy PY CA; emailAddress=[email protected]
  • SSL certificate verify ok.

GET /get HTTP/1.1 ... [redacted] ... < Connection: keep-alive < { "args": {}, "headers": { "Accept": "/", "Host": "httpbin.org", "User-Agent": "curl/7.54.0" }, "origin": "1.2.3.4, 5.6.7.8", "url": "https://httpbin.org/get" }

root@kitploit:~
`issuer` पंक्ति पुष्टि करती है कि प्रतिक्रिया को इंटरसेप्ट किया गया था।

कैश्ड प्रतिक्रिया फ़ाइल की सामग्री भी सत्यापित करें। `proxy.py` लॉग से कैश
फ़ाइल का पथ प्राप्त करें।

`❯ cat /path/to/your/tmp/directory/httpbin.org-1569452863.924174.txt````console
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: *
Content-Type: application/json
Date: Wed, 25 Sep 2019 23:07:05 GMT
Referrer-Policy: no-referrer-when-downgrade
Server: nginx
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Length: 202
Connection: keep-alive

{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0"
  },
  "origin": "1.2.3.4, 5.6.7.8",
  "url": "https://httpbin.org/get"
}

Viola!!! यदि आप CA फ़्लैग हटा देंगे, तो कैश की गई फ़ाइल में सादे टेक्स्ट के बजाय एन्क्रिप्टेड डेटा मिलेगा।

अब अन्य प्लगइन उदाहरणों के साथ CA फ़्लैग का उपयोग करें ताकि वे https ट्रैफ़िक के साथ काम करते देखे जा सकें।

असुरक्षित TLS इंटरसेप्शन

स्व-हस्ताक्षरित प्रमाणपत्र का उपयोग करने वाले सर्वर से TLS ट्रैफ़िक को इंटरसेप्ट करने के लिए अनिवार्य TLS प्रमाणपत्र सत्यापन को अक्षम करने हेतु --insecure-tls-interception फ़्लैग जोड़ें।

नोट: यह फ़्लैग सभी सर्वरों के लिए प्रमाणपत्र जाँच को अक्षम करता है।

Docker के साथ TLS इंटरसेप्शन

Docker कंटेनर के साथ TLS इंटरसेप्शन के बारे में महत्वपूर्ण नोट:

  • v2.2.0 से, proxy.py डॉकर कंटेनर openssl के साथ भी आता है। यह proxy.py को TLS इंटरसेप्शन के लिए तुरंत प्रमाणपत्र जनरेट करने की अनुमति देता है।

  • सुरक्षा कारणों से, proxy.py डॉकर कंटेनर CA प्रमाणपत्रों के साथ नहीं आता है।

यहाँ TLS इंटरसेप्शन के साथ proxy.py डॉकर कंटेनर शुरू करने का तरीका दिया गया है:

  1. होस्ट कंप्यूटर पर CA प्रमाणपत्र जनरेट करें ```console ❯ make ca-certificates
    root@kitploit:~
  2. सभी उत्पन्न प्रमाणपत्रों को एक अलग निर्देशिका में कॉपी करें। हम बाद में इस निर्देशिका को अपने डॉकर कंटेनर में माउंट करेंगे। ```console ❯ mkdir /tmp/ca-certificates ❯ cp ca-cert.pem ca-key.pem ca-signing-key.pem /tmp/ca-certificates
    root@kitploit:~
  3. डॉकर कंटेनर प्रारंभ करें ```console ❯ docker run -it --rm
    -v /tmp/ca-certificates:/tmp/ca-certificates
    -p 8899:8899
    abhinavsingh/proxy.py:latest
    --hostname 0.0.0.0
    --plugins proxy.plugin.CacheResponsesPlugin
    --ca-key-file /tmp/ca-certificates/ca-key.pem
    --ca-cert-file /tmp/ca-certificates/ca-cert.pem
    --ca-signing-key /tmp/ca-certificates/ca-signing-key.pem
    root@kitploit:~
  • -v /tmp/ca-certificates:/tmp/ca-certificates ध्वज हमारे CA प्रमाणपत्र निर्देशिका को कंटेनर वातावरण में माउंट करता है
    • --plugins proxy.plugin.CacheResponsesPlugin CacheResponsesPlugin को सक्षम करता है ताकि हम इंटरसेप्ट किए गए ट्रैफ़िक का निरीक्षण कर सकें
    • --ca-* ध्वज TLS इंटरसेप्शन सक्षम करते हैं।
  1. दूसरे टर्मिनल से, curl का उपयोग करके TLS इंटरसेप्शन आज़माएं। यदि CA प्रमाणपत्र पहले से सिस्टम द्वारा विश्वसनीय है तो --cacert ध्वज को हटा सकते हैं। ```console ❯ curl -v
    --cacert ca-cert.pem
    -x 127.0.0.1:8899
    https://httpbin.org/get
    root@kitploit:~
  2. प्रतिक्रिया हेडर से issuer फ़ील्ड सत्यापित करें। ```console
    • Server certificate:
    • subject: CN=httpbin.org; C=NA; ST=Unavailable; L=Unavailable; O=Unavailable; OU=Unavailable
    • start date: Jun 17 09:26:57 2020 GMT
    • expire date: Jun 17 09:26:57 2022 GMT
    • subjectAltName: host "httpbin.org" matched cert's "httpbin.org"
    • issuer: CN=example.com
    • SSL certificate verify ok.
    root@kitploit:~
  3. डॉकर टर्मिनल पर वापस आकर, प्रतिक्रिया डंप पथ लॉग कॉपी करें। ```console ...[redacted]... [I] access_log:338 - 172.17.0.1:56498 - CONNECT httpbin.org:443 - 1031 bytes - 1216.70 ms ...[redacted]... [I] close:49 - Cached response at /tmp/httpbin.org-ae1a927d064e4ab386ea319eb38fe251.txt
    root@kitploit:~
  4. किसी अन्य टर्मिनल में, cat प्रतिक्रिया डंप को चलाएँ: ```console ❯ docker exec -it $(docker ps | grep proxy.py | awk '{ print $1 }') cat /tmp/httpbin.org-ae1a927d064e4ab386ea319eb38fe251.txt HTTP/1.1 200 OK ...[redacted]... { ...[redacted]..., "url": "http://httpbin.org/get" }
    root@kitploit:~

GROUT (NGROK विकल्प)

  1. grout ngrok और frp के लिए एक ड्रॉप-इन विकल्प है।
  2. grout proxy.py के अंदर पैकेज्ड आता है।

Grout उपयोग```console

❯ grout NAME: grout - securely tunnel local files, folders and services to public URLs

USAGE: grout route [name]

DESCRIPTION: grout exposes local networked services behinds NATs and firewalls to the public internet over a secure tunnel. Share local folders, directories and websites, build/test webhook consumers and self-host personal services to public URLs.

EXAMPLES: Share Files and Folders: grout C:\path\to\folder # Share a folder on your system grout /path/to/folder # Share a folder on your system grout /path/to/folder --basic-auth user:pass # Add authentication for shared folder grout /path/to/photo.jpg # Share a specific file on your system

Expose HTTP, HTTPS and Websockets: grout http://localhost:9090 # Expose HTTP service running on port 9090 grout https://localhost:8080 # Expose HTTPS service running on port 8080 grout https://localhost:8080 --path /worker/ # Expose only certain paths of HTTPS service on port 8080 grout https://localhost:8080 --basic-auth u:p # Add authentication for exposed HTTPS service on port 8080

Expose TCP Services: grout tcp://:6379 # Expose Redis service running locally on port 6379 grout tcp://:22 # Expose SSH service running locally on port 22

Custom URLs: grout https://localhost:8080 abhinavsingh # Custom URL for HTTPS service running on port 8080 grout tcp://:22 abhinavsingh # Custom URL for SSH service running locally on port 22

Custom Domains: grout tcp://:5432 abhinavsingh.domain.tld # Custom URL for Postgres service running locally on port 5432

Self-hosted solutions: grout tcp://:5432 abhinavsingh.my.server # Custom URL for Postgres service running locally on port 5432

(*) Wildcard Domains: grout https://host:443 do.main --wildcard # Receive traffic on provided domain and all it's subdomains

(*) Host based routing for Wildcard Domains: grout ... --tunnel-route-url host=https://h:p # When using wildcards, optionally route traffic by incoming host header

SUPPORT: Write to us at [email protected]

Privacy policy and Terms & conditions https://jaxl.com/privacy/

Created by Jaxl™ https://jaxl.io

root@kitploit:~
## ग्राउट प्रमाणीकरण

ग्राउट आपकी फ़ाइलों, फ़ोल्डरों और सेवाओं को अनधिकृत पहुँच से बचाने के लिए प्रमाणीकरण का समर्थन करता है।  प्रमाणीकरण लागू करने के लिए `--basic-auth` फ़्लैग का उपयोग करें।  उदाहरण:```console
grout /path/to/folder --basic-auth user:pass
grout https://localhost:8080 --basic-auth u:p

Grout पथ

डिफ़ॉल्ट रूप से, Grout सेवाओं पर सभी पथों तक पहुंच की अनुमति देता है। अपनी वेब सेवा पर केवल निश्चित पथों तक पहुंच को प्रतिबंधित करने के लिए --path फ़्लैग का उपयोग करें। उदाहरण:```console grout https://localhost:8080 --path /worker/ grout https://localhost:8080 --path /webhook/ --path /callback/

root@kitploit:~
## ग्राउट वाइल्डकार्ड डोमेन

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

ऐसे परिदृश्यों के लिए, ग्राउट वाइल्डकार्ड डोमेन का समर्थन करता है। यहां बताया गया है कि ग्राउट क्लाइंट के साथ उपयोग के लिए अपना स्वयं का वाइल्डकार्ड डोमेन कैसे कॉन्फ़िगर करें।

1. एक डोमेन चुनें जैसे `custom.example.com`
2. आपकी सेवा `custom.example.com` और `*.custom.example.com` के लिए ट्रैफ़िक प्रदान करना चाहती है
3. यदि आप `https://` का उपयोग करने की योजना बना रहे हैं, तो आपको एक लोड बैलेंसर सेटअप करना होगा:
   - एक HTTPS लोड बैलेंसर (LB) सेटअप करें
   - LB को `custom.example.com` और `*.custom.example.com` के लिए जनरेट किए गए प्रमाणपत्र से कॉन्फ़िगर करें
   - ग्राउट सेवा के सार्वजनिक IP पतों पर ट्रैफ़िक पॉइंट करें
4. `custom.example.com` को व्हाइटलिस्ट करने के लिए [email protected] पर ग्राउट टीम से संपर्क करें। ग्राउट टीम यह सुनिश्चित करेगी कि आप वास्तव में डोमेन के मालिक हैं और आपने ऊपर बताए अनुसार एक मान्य SSL प्रमाणपत्र कॉन्फ़िगर किया है।

ग्राउट को `--wildcard` फ़्लैग के साथ प्रारंभ करें।  उदाहरण:

grout client --wildcard --domains '*.custom.example.com' --forward-url https://1.2.3.4:8080

root@kitploit:~
grout https://localhost:8080 custom.example.com --wildcard
2024-08-05 18:24:59,294 - grout - Logged in as [email protected]
2024-08-05 18:25:03,159 - setup - Grouting https://*.custom.domain.com
```
## Host हेडर पर आधारित ग्राउट वाइल्डकार्ड डोमेन रूटिंग

  > केवल `--wildcard` के साथ उपलब्ध

डिफ़ॉल्ट रूट के साथ आप अतिरिक्त रूट भी प्रदान कर सकते हैं जो होस्ट फ़ील्ड मेल खाने पर प्राथमिकता लेते हैं। उदाहरण:```console
grout https://localhost:8080 custom.example.com \
  --wildcard \
  --tunnel-route-url stream.example.com=http://localhost:7001
```
आप इस फ्लैग को दोहराकर कई कस्टम रूट प्रदान कर सकते हैं।

## Grout क्लाइंट प्लगइन

`GroutClientBasePlugin` आपको विभिन्न अपस्ट्रीम्स के लिए डायनामिक रूप से ट्रैफ़िक रूट करने की अनुमति देता है।  नीचे इसका उपयोग करने के तरीके के बारे में कुछ विवरण के साथ एक सरल कार्यान्वयन है।```python
class GroutClientPlugin(GroutClientBasePlugin):

    def resolve_route(
        self,
        route: str,
        request: HttpParser,
        origin: HostPort,
        server: HostPort,
    ) -> Tuple[Optional[str], HttpParser]:
        print(request, origin, server, '->', route)
        print(request.header(b'host'), request.path)
        #
        # Here, we send traffic to localhost:7001 irrespective
        # of the original "route" value provided to the grout
        # client OR any custom host:upstream mapping provided
        # through the --tunnel-route-url flags (when using
        # --wildcard).
        #
        # Optionally, you can also strip path before
        # sending traffic to upstrem, like:
        # request.path = b"/"
        #
        # To drop the request, simply return None for route
        # return None, request
        #
        return 'http://localhost:7001', request
```
See [grout_client.py](https://github.com/abhinavsingh/proxy.py/blob/develop/proxy/plugin/grout_client.py) अधिक जानकारी के लिए।  इसका परीक्षण करने के लिए, grout क्लाइंट शुरू करते समय `--plugin proxy.plugin.grout_client.GroutClientPlugin` पास करके शुरू करें।

## Docker का उपयोग करके Grout```console
❯ docker run --rm -it \
  --entrypoint grout \
  -v ~/.proxy:/root/.proxy \
  abhinavsingh/proxy.py:latest \
  http://host.docker.internal:29876
```
ऊपर:

- हमने `--entrypoint` को `grout` में बदल दिया
- हमने `localhost` को `host.docker.internal` से बदल दिया, ताकि `grout` होस्ट मशीन पर चल रहे पोर्ट `29876` पर ट्रैफिक रूट कर सके
- *(वैकल्पिक)* होस्ट मशीन के `~/.proxy` फ़ोल्डर को माउंट करें, ताकि `grout` क्रेडेंशियल्स कंटेनर रीस्टार्ट के दौरान बने रहें

## Grout कैसे काम करता है

- `grout` इंफ्रास्ट्रक्चर में 2 घटक हैं: क्लाइंट और सर्वर
- `grout` क्लाइंट में 2 घटक हैं: एक थिन और एक थिक क्लाइंट
- `grout` थिन क्लाइंट ओपन सोर्स `proxy.py` (BSD 3-Clause License) का हिस्सा है
- `grout` थिक क्लाइंट और सर्वर [jaxl.io](https://jaxl.io) पर होस्ट किए जाते हैं
  और [Jaxl Innovations Private Limited](https://jaxl.com) का कॉपीराइट है
- `grout` सर्वर में 3 घटक हैं: एक रजिस्ट्री सर्वर, एक रिवर्स प्रॉक्सी सर्वर और एक टनल सर्वर

## स्व-होस्टेड `grout`

- `grout` थिक क्लाइंट और सर्वर को आपके GCP, AWS, क्लाउड इंफ्रास्ट्रक्चर पर भी होस्ट किया जा सकता है
- स्व-होस्टेड संस्करण के साथ, आपका ट्रैफिक उस नेटवर्क के माध्यम से बहता है जिसे आप नियंत्रित और भरोसा करते हैं
- [jaxl.io](https://jaxl.io) पर `grout` डेवलपर्स स्व-होस्टेड समाधानों के लिए GCP, AWS, Docker इमेज प्रदान करते हैं
- शुरू करने के लिए कृपया [[email protected]](mailto:[email protected]) पर एक ईमेल भेजें।

# SSH टनल के ऊपर प्रॉक्सी

**यह एक कार्य प्रगति पर है और दस्तावेज़ के अनुसार काम नहीं कर सकता**

`paramiko` की आवश्यकता है। निर्भरताएँ स्थापित करने के लिए `pip install "proxy.py[tunnel]"` का उपयोग करें

## प्रॉक्सी रिमोट अनुरोध स्थानीय रूप से

                            |
    +------------+          |            +----------+
    |   LOCAL    |          |            |  REMOTE  |
    |   HOST     | <== SSH ==== :8900 == |  PROXY   |
    +------------+          |            +----------+
    :8899 proxy.py          |
                            |
                         FIREWALL
                      (allow tcp/22)

### क्या

एक `remote` प्रॉक्सी सर्वर पर किए गए HTTP(s) अनुरोधों को `localhost` पर चल रहे `proxy.py` सर्वर के माध्यम से प्रॉक्सी करें।

### कैसे

- अनुरोधित `remote` पोर्ट SSH कनेक्शन पर फॉरवर्ड किया जाता है।
- `localhost` पर चलने वाला `proxy.py` `remote` प्रॉक्सी अनुरोधों को
  संभालता और उत्तर देता है।

### आवश्यकताएँ

1. `localhost` के पास `remote` सर्वर तक SSH पहुंच होनी चाहिए
2. `remote` सर्वर को फॉरवर्ड किए गए पोर्ट नंबर के माध्यम से HTTP(s) अनुरोधों को प्रॉक्सी करने के लिए कॉन्फ़िगर किया जाना चाहिए, जैसे `:8900`।
   - `remote` और `localhost` पोर्ट समान हो सकते हैं, जैसे `:8899`।
   - `:8900` को आस्की आर्ट में भिन्नता के उद्देश्य के लिए चुना गया है।

### इसे आज़माएं

`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ # On localhost
❯ proxy --enable-ssh-tunnel \
    --tunnel-username username \
    --tunnel-hostname ip.address.or.domain.name \
    --tunnel-port 22 \
    --tunnel-remote-port 8899 \
    --tunnel-ssh-key /path/to/ssh/private.key \
    --tunnel-ssh-key-passphrase XXXXX
...[redacted]... [I] listener.setup:97 - Listening on 127.0.0.1:8899
...[redacted]... [I] pool.setup:106 - Started 16 acceptors in threadless (local) mode
...[redacted]... [I] transport._log:1873 - Connected (version 2.0, client OpenSSH_7.6p1)
...[redacted]... [I] transport._log:1873 - Authentication (publickey) successful!
...[redacted]... [I] listener.setup:116 - SSH connection established to ip.address.or.domain.name:22...
...[redacted]... [I] listener.start_port_forward:91 - :8899 forwarding successful...
```
`remote` सर्वर पर एक HTTP प्रॉक्सी अनुरोध करें और सत्यापित करें कि प्रतिक्रिया में `localhost` का सार्वजनिक IP पता मूल के रूप में शामिल है:```console
❯ # On remote
❯ curl -x 127.0.0.1:8899 http://httpbin.org/get
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.54.0"
  },
  "origin": "x.x.x.x, y.y.y.y",
  "url": "https://httpbin.org/get"
}
```
यह भी सुनिश्चित करें कि `proxy.py` के लॉग्स `localhost` पर `remote` IP को क्लाइंट IP के रूप में दिखाते हैं।```console
access_log:328 - remote:52067 - GET httpbin.org:80
```
## स्थानीय अनुरोधों को दूरस्थ रूप से प्रॉक्सी करें

                            |
    +------------+          |     +----------+
    |   LOCAL    |          |     |  REMOTE  |
    |   HOST     | === SSH =====> |  SERVER  |
    +------------+          |     +----------+
                            |     :8899 proxy.py
                            |
                        FIREWALL
                     (allow tcp/22)

योजना नहीं है।

यदि आपके पास कोई वैध उपयोग मामला है, तो कृपया एक इश्यू खोलें। आप इस कार्यक्षमता को जोड़ने के लिए पुल-रिक्वेस्ट के माध्यम से योगदान भेजने के लिए हमेशा स्वागत हैं :)

> स्थानीय अनुरोधों को दूरस्थ रूप से प्रॉक्सी करने के लिए, [प्रॉक्सी पूल प्लगइन](#proxypoolplugin) का उपयोग करें।

# proxy.py को एम्बेड करें

## ब्लॉकिंग मोड

डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ `proxy.py` को एम्बेडेड मोड में प्रारंभ करने के लिए `proxy.main` विधि का उपयोग करें। उदाहरण:```python
import proxy

if __name__ == '__main__':
  proxy.main()
```
kwargs के रूप में पास करके स्टार्टअप फ्लैग्स को अनुकूलित करें:```python
import ipaddress
import proxy

if __name__ == '__main__':
  proxy.main(
    hostname=ipaddress.IPv6Address('::1'),
    port=8899
  )
```
ध्यान दें:

1. `main` कमांड लाइन से `proxy.py` शुरू करने के समतुल्य है।
2. `main` कोई `args` स्वीकार नहीं करता (केवल `kwargs`)।
3. `main` स्वचालित रूप से किसी भी उपलब्ध `sys.argv` को `args` के रूप में उपभोग करेगा।
3. `main` तब तक ब्लॉक रहेगा जब तक `proxy.py` बंद न हो जाए।

## नॉन-ब्लॉकिंग मोड

डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ `Proxy` कॉन्टेक्स्ट मैनेजर का उपयोग करके `proxy.py` को नॉन-ब्लॉकिंग एम्बेडेड मोड में शुरू करें: उदाहरण:```python
import proxy

if __name__ == '__main__':
  with proxy.Proxy() as p:
    # Uncomment the line below and
    # implement your app your logic here
    proxy.sleep_loop()
```
ध्यान दें:

1. `Proxy` `main` के समान है, सिवाय इसके कि `Proxy` ब्लॉक नहीं करेगा।
2. आंतरिक रूप से, `Proxy` एक कॉन्टेक्स्ट मैनेजर है जो कॉल करने पर `proxy.py` शुरू करेगा और स्कोप समाप्त होने पर इसे बंद कर देगा।
3. `main` के विपरीत, `Proxy` के साथ स्टार्टअप फ्लैग को `args` और `kwargs` का उपयोग करके भी अनुकूलित किया जा सकता है। उदा., `Proxy(['--port', '8899'])` या फ्लैग को kwargs के रूप में पास करके, जैसे `Proxy(port=8899)`।
4. `main` के विपरीत, `Proxy` `sys.argv` का निरीक्षण नहीं करेगा।

## अस्थायी पोर्ट

`--port=0` का उपयोग करें ताकि `proxy.py` कर्नेल द्वारा आवंटित एक यादृच्छिक पोर्ट पर बाइंड हो।

एम्बेडेड मोड में, आप इस पोर्ट तक पहुँच सकते हैं।  उदाहरण:```python
import proxy

if __name__ == '__main__':
  with proxy.Proxy(port=0) as p:
    print(p.flags.port)
    proxy.sleep_loop()
```
`flags.port` आपको कर्नेल द्वारा आवंटित रैंडम पोर्ट तक पहुंच प्रदान करेगा।

## प्लगइन लोड करना

उपयोगकर्ता एकाधिक प्लगइन लोड करने के लिए `--plugins` फ्लैग का कई बार उपयोग कर सकते हैं।
यदि आप समस्याओं का सामना कर रहे हैं तो [प्लगइन लोड करने में असमर्थ](#unable-to-load-plugins) देखें।

एम्बेडेड मोड में उपयोग करते समय, आपके पास कुछ और विकल्प होते हैं।  उदाहरण:

1. प्लगइन क्लास का पूरी तरह से योग्य नाम `bytes` के रूप में `proxy.main` विधि या `proxy.Proxy` कॉन्टेक्स्ट मैनेजर को प्रदान करें।
2. प्लगइन क्लास का `type` इंस्टेंस प्रदान करें। यह विशेष रूप से उपयोगी है यदि आप रनटाइम पर प्लगइन परिभाषित करने की योजना बनाते हैं।

उदाहरण, `--plugins` फ्लैग का उपयोग करके एकल प्लगइन लोड करें:```python
import proxy

if __name__ == '__main__':
  proxy.main(plugins=['proxy.plugin.CacheResponsesPlugin'])
```
सरलता के लिए, आप प्लगइन्स की सूची को `proxy.main` या `Proxy` कंस्ट्रक्टर को एक कीवर्ड आर्गुमेंट के रूप में भी पास कर सकते हैं।

उदाहरण:```python
import proxy
from proxy.plugin import FilterByUpstreamHostPlugin

if __name__ == '__main__':
  proxy.main(plugins=[
    b'proxy.plugin.CacheResponsesPlugin',
    FilterByUpstreamHostPlugin,
  ])
```
# proxy.py के साथ यूनिट परीक्षण

## `proxy.TestCase`

अपने Python `unittest` क्लासेस के लिए `proxy.py` को सेटअप और टियर डाउन करने के लिए, बस `unittest.TestCase` के बजाय `proxy.TestCase` का उपयोग करें।
उदाहरण:```python
import proxy

class TestProxyPyEmbedded(proxy.TestCase):

    def test_my_application_with_proxy(self) -> None:
        self.assertTrue(True)
```
ध्यान दें:

1. `proxy.TestCase` `unittest.TestCase.run()` विधि को ओवरराइड करता है ताकि `proxy.py` को सेटअप और टियर डाउन किया जा सके।
2. `proxy.py` सर्वर सिस्टम पर एक यादृच्छिक उपलब्ध पोर्ट पर सुनेगा।
   यह यादृच्छिक पोर्ट आपके परीक्षण मामलों में `self.PROXY.flags.port` के रूप में उपलब्ध है।
3. डिफ़ॉल्ट रूप से केवल एक एक्सेप्टर और एक वर्कर शुरू किया जाता है (`--num-workers 1 --num-acceptors 1`) तेजी से सेटअप और टियर डाउन के लिए।
4. सबसे महत्वपूर्ण बात, `proxy.TestCase` यह भी सुनिश्चित करता है कि `proxy.py` सर्वर
   परीक्षणों के निष्पादन के साथ आगे बढ़ने से पहले चालू हो और चल रहा हो। डिफ़ॉल्ट रूप से,
   `proxy.TestCase` `proxy.py` सर्वर शुरू होने के लिए `10 सेकंड` तक प्रतीक्षा करेगा,
   विफलता पर एक `TimeoutError` अपवाद उठाया जाएगा।

## स्टार्टअप फ्लैग को ओवरराइड करें

डिफ़ॉल्ट स्टार्टअप फ्लैग को ओवरराइड करने के लिए, अपने परीक्षण वर्ग में एक `PROXY_PY_STARTUP_FLAGS` चर परिभाषित करें।
उदाहरण:```python
class TestProxyPyEmbedded(TestCase):

    PROXY_PY_STARTUP_FLAGS = [
        '--num-workers', '2',
        '--num-acceptors', '1',
        '--enable-web-server',
    ]

    def test_my_application_with_proxy(self) -> None:
        self.assertTrue(True)
```
पूर्ण कार्यशील उदाहरण के लिए [test_embed.py] देखें।

[test_embed.py]:
https://raw.githubusercontent.com/abhinavsingh/proxy.py/develop/tests/testing/test_embed.py

## `unittest.TestCase` के साथ

यदि किसी कारण से आप सीधे `proxy.TestCase` का उपयोग करने में असमर्थ हैं, तो स्वयं `unittest.TestCase.run` को ओवरराइड करके `proxy.py` को सेटअप और टियर डाउन करें। उदाहरण:```python
import unittest
import proxy


class TestProxyPyEmbedded(unittest.TestCase):

    def test_my_application_with_proxy(self) -> None:
        self.assertTrue(True)

    def run(self, result: Optional[unittest.TestResult] = None) -> Any:
        with proxy.start([
                '--num-workers', '1',
                '--num-acceptors', '1',
                '--port', '... random port ...']):
            super().run(result)
```
या बस `proxy.py` को `setUpClass` और `teardownClass` क्लास मेथड्स के भीतर सेटअप/टियर डाउन करें।

# उपयोगिताएँ

## TCP सॉकेट्स

### new_socket_connection

IPv4 कनेक्शन बनाने का प्रयास करता है, फिर IPv6 और अंत में प्रदान किए गए पते के लिए एक डुअल स्टैक कनेक्शन बनाता है।```python
>>> conn = new_socket_connection(('httpbin.org', 80))
>>> ...[ use connection ]...
>>> conn.close()
```
### socket_connection

`socket_connection` एक सुविधाजनक डेकोरेटर + संदर्भ प्रबंधक है
`new_socket_connection` के चारों ओर जो यह सुनिश्चित करता है कि `conn.close` अंतर्निहित है।

एक संदर्भ प्रबंधक के रूप में:```python
>>> with socket_connection(('httpbin.org', 80)) as conn:
>>>   ... [ use connection ] ...
```
एक डेकोरेटर के रूप में:```python
>>> @socket_connection(('httpbin.org', 80))
>>> def my_api_call(conn, *args, **kwargs):
>>>   ... [ use connection ] ...
```
## HTTP Client

### build_http_request

- HTTP GET अनुरोध उत्पन्न करें  ```python
  >>> build_http_request(b'GET', b'/')
  b'GET / HTTP/1.1\r\n\r\n'
  ```
- शीर्षलेखों के साथ HTTP GET अनुरोध उत्पन्न करें  ```python
  >>> build_http_request(b'GET', b'/', conn_close=True)
  b'GET / HTTP/1.1\r\nConnection: close\r\n\r\n'
  ```
- हेडर और बॉडी के साथ HTTP POST अनुरोध उत्पन्न करें  ```python
  >>> import json
  >>> build_http_request(b'POST', b'/form',
          headers={b'Content-type': b'application/json'},
          body=proxy.bytes_(json.dumps({'email': '[email protected]'})))
      b'POST /form HTTP/1.1\r\nContent-type: application/json\r\n\r\n{"email": "[email protected]"}'
  ```
### build_http_response```python
build_http_response(
    status_code: int,
    protocol_version: bytes = HTTP_1_1,
    reason: Optional[bytes] = None,
    headers: Optional[Dict[bytes, bytes]] = None,
    body: Optional[bytes] = None) -> bytes
```
## PKI

### API उपयोग

- `gen_private_key`  ```python
  gen_private_key(
      key_path: str,
      password: str,
      bits: int = 2048,
      timeout: int = 10) -> bool
  ```
- `gen_public_key`  ```python
  gen_public_key(
      public_key_path: str,
      private_key_path: str,
      private_key_password: str,
      subject: str,
      alt_subj_names: Optional[List[str]] = None,
      extended_key_usage: Optional[str] = None,
      validity_in_days: int = 365,
      timeout: int = 10) -> bool
  ```
- `remove_passphrase`  ```python
  remove_passphrase(
      key_in_path: str,
      password: str,
      key_out_path: str,
      timeout: int = 10) -> bool
  ```
- `gen_csr`  ```python
  gen_csr(
      csr_path: str,
      key_path: str,
      password: str,
      crt_path: str,
      timeout: int = 10) -> bool
  ```
- `sign_csr`  ```python
  sign_csr(
      csr_path: str,
      crt_path: str,
      ca_key_path: str,
      ca_key_password: str,
      ca_crt_path: str,
      serial: str,
      alt_subj_names: Optional[List[str]] = None,
      extended_key_usage: Optional[str] = None,
      validity_in_days: int = 365,
      timeout: int = 10) -> bool
  ```
उपयोग उदाहरणों के लिए [pki.py](https://github.com/abhinavsingh/proxy.py/blob/develop/proxy/common/pki.py) और [test_pki.py](https://github.com/abhinavsingh/proxy.py/blob/develop/tests/common/test_pki.py) देखें।

### CLI उपयोग

`proxy.common.pki` मॉड्यूल का उपयोग करें:

1. सार्वजनिक और निजी कुंजियों का निर्माण
2. CSR अनुरोध उत्पन्न करना
3. कस्टम CA का उपयोग करके CSR अनुरोधों पर हस्ताक्षर करना।```console
❯ python -m proxy.common.pki -h
usage: pki.py [-h] [--password PASSWORD] [--private-key-path PRIVATE_KEY_PATH] [--public-key-path PUBLIC_KEY_PATH]
              [--subject SUBJECT] [--csr-path CSR_PATH] [--crt-path CRT_PATH] [--hostname HOSTNAME] [--openssl OPENSSL]
              action

proxy.py v2.4.4rc2.dev12+gdc06ea4 : PKI Utility

positional arguments:
  action                Valid actions: remove_passphrase, gen_private_key, gen_public_key, gen_csr, sign_csr

options:
  -h, --help            show this help message and exit
  --password PASSWORD   Password to use for encryption. Default: proxy.py
  --private-key-path PRIVATE_KEY_PATH
                        Private key path
  --public-key-path PUBLIC_KEY_PATH
                        Public key path
  --subject SUBJECT     Subject to use for public key generation. Default: /CN=localhost
  --csr-path CSR_PATH   CSR file path. Use with gen_csr and sign_csr action.
  --crt-path CRT_PATH   Signed certificate path. Use with sign_csr action.
  --hostname HOSTNAME   Alternative subject names to use during CSR signing.
  --openssl OPENSSL     Path to openssl binary. By default, we assume openssl is in your PATH
```
## आंतरिक दस्तावेज़ीकरण

### दस्तावेज़ पढ़ें

- [proxypy.readthedocs.io](https://proxypy.readthedocs.io/) पर जाएँ
- स्थानीय रूप से बिल्ड करने के लिए:

`make lib-doc`

### pydoc

कोड अच्छी तरह से दस्तावेज़ित है। स्रोत कोड प्राप्त करें और चलाएँ:

`pydoc3 proxy`

### pyreverse

गहन विश्लेषण के लिए क्लास स्तर के पदानुक्रम UML आरेख बनाएँ:

`make lib-pyreverse`

# डैशबोर्ड चलाएँ

डैशबोर्ड वर्तमान में विकास के अंतर्गत है और अभी तक `pip` पैकेजों के साथ बंडल नहीं किया गया है।
डैशबोर्ड चलाने के लिए, आपको स्रोत चेकआउट करना होगा।

डैशबोर्ड Typescript और SCSS में लिखा गया है, तो पहले इसे इसका उपयोग करके बिल्ड करें:```console
❯ make dashboard
```
एम्बेडेड `Chrome DevTools` भी बनाएँ यदि आप इसका उपयोग करने की योजना बना रहे हैं:```console
❯ make devtools
```
अब `proxy.py` को डैशबोर्ड प्लगइन के साथ और स्टैटिक सर्वर के लिए रूट डायरेक्टरी को ओवरराइड करके शुरू करें:```console
❯ proxy --enable-dashboard --static-server-dir dashboard/public
...[redacted]... - Loaded plugin proxy.http.server.HttpWebServerPlugin
...[redacted]... - Loaded plugin proxy.dashboard.dashboard.ProxyDashboard
...[redacted]... - Loaded plugin proxy.dashboard.inspect_traffic.InspectTrafficPlugin
...[redacted]... - Loaded plugin proxy.http.inspector.DevtoolsProtocolPlugin
...[redacted]... - Loaded plugin proxy.http.proxy.HttpProxyPlugin
...[redacted]... - Listening on ::1:8899
...[redacted]... - Core Event enabled
```
वर्तमान में, डैशबोर्ड को सक्षम करने से सभी डैशबोर्ड प्लगइन्स भी सक्षम हो जाएंगे।

डैशबोर्ड पर जाएँ:```console
❯ open http://localhost:8899/dashboard/
```
## Inspect Traffic

***यह एक WIP है और दस्तावेज़ के अनुसार काम नहीं कर सकता***

एम्बेडेड `Chrome Dev Console` लोड होने की प्रतीक्षा करें।  वर्तमान में, `proxy.py` के माध्यम से बहने वाले सभी ट्रैफ़िक का विवरण `Inspect Traffic` टैब पर पुश किया जाता है।  हालांकि, प्राप्त पेलोड अभी तक एम्बेडेड डेवलपर कंसोल के साथ एकीकृत नहीं किए गए हैं।

वर्तमान कार्यक्षमता को डैशबोर्ड के `Dev Console` को खोलकर और `proxy.py` सर्वर के साथ डैशबोर्ड द्वारा स्थापित वेबसॉकेट कनेक्शन का निरीक्षण करके सत्यापित किया जा सकता है।

[![Proxy.Py Dashboard Inspect Traffic](https://assets.kitploit.com/production/public/readmes/157/1e6258665ca9259fc526ebb90892d4b322094bb1e8139d329ab2379fc76ab66d.png)](https://github.com/abhinavsingh/proxy.py)

# Chrome DevTools प्रोटोकॉल

उन परिदृश्यों के लिए जहां आप `Chrome DevTools` प्रोटोकॉल वेबसॉकेट एंडपॉइंट तक सीधी पहुंच चाहते हैं,
`proxy.py` को इस प्रकार प्रारंभ करें:```console
❯ proxy --enable-devtools --enable-events
```
अब अपने CDT इंस्टेंस को `ws://localhost:8899/devtools` पर इंगित करें।

## Prometheus मेट्रिक्स

1) `proxy.py` को `--enable-metrics` फ़्लैग के साथ प्रारंभ करें ताकि एक prometheus एंडपॉइंट के माध्यम से आंतरिक मेट्रिक्स प्राप्त हो सकें
2) अपने `prometheus.yaml` को `/metrics` एंडपॉइंट से स्क्रैप करने के लिए कॉन्फ़िगर करें, उदा. [http://localhost:8899/metrics](http://localhost:8899/metrics)
3) `--metrics-path` फ़्लैग का उपयोग करके मेट्रिक्स पथ को अनुकूलित करें
4) ध्यान दें कि `--enable-metrics` आंतरिक रूप से `--enable-events` और वेब सर्वर प्लगइन को भी सक्षम करता है

# अक्सर पूछे जाने वाले प्रश्न

## उत्पादन में proxy.py तैनात करना

नीचे आपकी निजी/उत्पादन/कॉर्पोरेट परियोजनाओं में `proxy.py` का उपयोग करने के लिए कुछ रणनीतियाँ सूचीबद्ध हैं।

### क्या नहीं करना चाहिए?

> आपको अपने प्लगइन कोड को `proxy/plugin` निर्देशिका में रखने के लिए रिपॉजिटरी को *"बस"* फोर्क करने से `बचना चाहिए`। फोर्किंग परियोजना योगदानकर्ताओं के लिए अनुशंसित वर्कफ़्लो है, परियोजना उपयोगकर्ताओं के लिए नहीं।

- इसके बजाय, नीचे दिए गए सुझाए गए तरीकों में से एक का उपयोग करें।
- फिर अपने प्लगइन्स को `--plugin`, `--plugins` फ़्लैग या `plugin` kwargs का उपयोग करके लोड करें।
- उदाहरण के लिए [skeleton](https://github.com/abhinavsingh/proxy.py/tree/develop/skeleton) ऐप देखें जो `proxy.py` का उपयोग करके एक स्टैंडअलोन प्रोजेक्ट है।

### आवश्यकताओं के माध्यम से

यह *अत्यधिक* अनुशंसित है कि आप `proxy.py` का उपयोग `requirements.txt` या समान निर्भरता प्रबंधन सेटअप के माध्यम से करें। यह आपको `proxy.py` पारिस्थितिकी तंत्र में नियमित प्रदर्शन अद्यतन, बग फिक्स, सुरक्षा पैच और अन्य सुधारों का लाभ उठाने की अनुमति देगा। उदाहरण:

1. अंतिम `प्री-रिलीज़` पर निर्भर रहने के लिए `--pre` विकल्प का उपयोग करें

    ```console
    ❯ pip install proxy.py --pre
    ```

    प्री-रिलीज़ `develop` शाखा कोड पर निर्भर रहने के समान हैं, बस इतना है कि प्री-रिलीज़ `HEAD` की ओर इंगित नहीं हो सकते हैं। ऐसा इसलिए हो सकता है क्योंकि प्रत्येक PR मर्ज के बाद `PyPi` पर प्री-रिलीज़ उपलब्ध नहीं कराए जाते हैं।

2. `develop` शाखा कोड पर निर्भर रहने के लिए `--pre` विकल्प के साथ `TestPyPi` का उपयोग करें

    ```console
    ❯ pip install -i https://test.pypi.org/simple/ proxy.py --pre
    ```

    प्रत्येक PR मर्ज के बाद `TestPyPi` पर एक प्री-रिलीज़ उपलब्ध कराया जाता है।

3. अंतिम `स्थिर` रिलीज़ कोड का उपयोग करें

    हमेशा की तरह, बस उपयोग करें:

    ```console
    ❯ pip install proxy.py
    ```

### डॉकर कंटेनर के माध्यम से

यदि आप कंटेनर तैनात कर रहे हैं, तो बस अपनी छवि को आधार `proxy.py` कंटेनर छवियों से बनाएँ।

1. `develop` शाखा कोड से निर्माण करने के लिए `GHCR` का उपयोग करें:

    ```console
    FROM ghcr.io/abhinavsingh/proxy.py:latest as base
    ```

    *PS: मैं कई उत्पादन स्तर की परियोजनाओं के लिए GHCR नवीनतम का उपयोग करता हूँ*

2. अंतिम `स्थिर` रिलीज़ कोड से निर्माण करने के लिए `DockerHub` का उपयोग करें:

    ```console
    FROM abhinavsingh/proxy.py:latest as base
    ```

PS: मेरी राय में, कंटेनर-आधारित रणनीति *सबसे अच्छा तरीका* है और एकमात्र रणनीति है जिसका *मैं स्वयं उपयोग करता हूँ*।

### अपने CI/CD को proxy.py के साथ एकीकृत करें

*अरे, लेकिन आप develop शाखा में ब्रेकिंग चेंजेस करते रहते हैं।*

मैं समझता हूँ। और इसलिए, आपके उत्पादन-ग्रेड अनुप्रयोगों के लिए, आपको *अवश्य* ही अपने एप्लिकेशन CI/CD को `proxy.py` के साथ एकीकृत करना चाहिए। आपको यह सुनिश्चित करना होगा कि आपका एप्लिकेशन `proxy.py` अपस्ट्रीम रिपॉजिटरी में प्रत्येक PR मर्ज के लिए अपने परीक्षणों का निर्माण और पास करे।

यदि आपका एप्लिकेशन रिपॉजिटरी सार्वजनिक है, तो कुछ परिदृश्यों में, PR लेखक पिछड़ी संगतता और हरी CI/CD बनाए रखने के लिए सभी आश्रितों के लिए पैच PR भेज सकते हैं।

CI/CD एकीकरण सुनिश्चित करता है कि आपका ऐप नवीनतम `proxy.py` कोड के साथ बनता रहे। आप अपने कोड को कहाँ होस्ट करते हैं, इसके आधार पर, नीचे सूचीबद्ध रणनीति का उपयोग करें:

- GitHub

    शीघ्र ही

- Google Cloud Build

    शीघ्र ही

- AWS

    शीघ्र ही

- Azure

    शीघ्र ही

- अन्य

    शीघ्र ही

> किसी स्तर पर, हम `master` शाखा पृथक्करण को हटा देंगे और केवल एक `develop` शाखा बनाए रखेंगे। क्योंकि आश्रित CI/CD एकीकरण के माध्यम से स्थिरता बनाए रख सकते हैं। वर्तमान में, किसी उत्पादन-ग्रेड प्रोजेक्ट के लिए आँख मूंदकर `develop` शाखा पर निर्भर रहना कठिन है।

## स्थिर बनाम विकास

- `master` शाखा में नवीनतम `स्थिर` कोड होता है और यह `PyPi` रिपॉजिटरी और `docker.io` और `ghcr.io` रजिस्ट्रियों के माध्यम से `Docker` कंटेनरों में उपलब्ध है।

  `स्थिर` रिलीज़ के लिए रिपोर्ट की गई समस्याओं को सर्वोच्च प्राथमिकता दी जाती है। हालाँकि, वर्तमान में हम पुराने रिलीज़ में फिक्स बैकपोर्ट नहीं करते हैं। उदाहरण के लिए, यदि आपने `v2.3.1` में कोई समस्या रिपोर्ट की, लेकिन वर्तमान `master` शाखा में अब `v2.4.0rc1` है। तो, फिक्स `v2.4.0rc2` में आएगा।

- `develop` शाखा में अत्याधुनिक परिवर्तन होते हैं

  विकास शाखा को (अधिकांश समय) स्थिर रखा जाता है। **लेकिन**, यदि आप *100% विश्वसनीयता* चाहते हैं और *उत्पादन वातावरण* में उपयोगकर्ताओं की सेवा कर रहे हैं, तो हमेशा स्थिर संस्करण का उपयोग करें।

### रिलीज़ अनुसूची

एक `vX.Y.ZrcN` पुल अनुरोध महीने में एक बार बनाया जाता है जो `develop` → `master` को मर्ज करता है। नीचे देखें कि कोड एक पुल अनुरोध से अगले स्थिर रिलीज़ तक कैसे प्रवाहित होता है।

1. प्रत्येक पुल अनुरोध मर्ज के बाद `develop` → `test.pypi.org` से डेवलपमेंट रिलीज़ तैनात की जाती है

2. अल्फा रिलीज़ `develop` → `pypi.org` से `develop` → `master` शाखा में `vX.Y.Z.rcN` पुल अनुरोध को मर्ज करने **से पहले** तैनात की जाती है। `rc` पुल अनुरोध को मर्ज करने से पहले कई अल्फा रिलीज़ किए जा सकते हैं

3. बीटा रिलीज़ `master` → `pypi.org` से तैनात की जाती है। बीटा रिलीज़ `rc` रिलीज़ की तैयारी में की जाती है और यदि आवश्यक न हो तो इसे छोड़ा जा सकता है

4. रिलीज़ कैंडिडेट `master` → `pypi.org` से तैनात किया जाता है। रिलीज़ कैंडिडेट हमेशा अंतिम स्थिर रिलीज़ से पहले उपलब्ध कराए जाते हैं

5. स्थिर रिलीज़ `master` → `pypi.org` से तैनात की जाती है

## थ्रेड्स बनाम थ्रेडलेस

### `v1.x`

`proxy.py` क्लाइंट अनुरोधों को संभालने के लिए नए थ्रेड्स बनाता था।

### `v2.0+`

`proxy.py` ने `asyncio` का उपयोग करके क्लाइंट अनुरोधों के थ्रेडलेस निष्पादन के लिए समर्थन जोड़ा।

### `v2.4.0+`

`mac` और `linux` वातावरणों पर `Python 3.8+` के लिए थ्रेडलेस निष्पादन को डिफ़ॉल्ट रूप से चालू किया गया था।

हमारे उपयोगकर्ताओं द्वारा इन वातावरणों पर `proxy.py` थ्रेडलेस निष्पादन को सुरक्षित बताया गया है। यदि आप समस्या में भाग रहे हैं, तो `--threaded` फ़्लैग का उपयोग करके थ्रेडेड मोड पर वापस आएँ।

`windows` और `Python < 3.8` के लिए, आप अभी भी `proxy.py` को `--threadless` फ़्लैग के साथ प्रारंभ करके थ्रेडलेस मोड आज़मा सकते हैं।

यदि थ्रेडलेस आपके लिए काम करता है, तो `proxy/common/constants.py` फ़ाइल में `_env_threadless_compliant` विधि को संपादित करके PR भेजने पर विचार करें।

## थ्रेडलेस रिमोट बनाम स्थानीय निष्पादन मोड

मूल थ्रेडलेस कार्यान्वयन में `रिमोट` निष्पादन मोड का उपयोग किया गया था। इसे [उच्च स्तरीय आर्किटेक्चर](#high-level-architecture) के अंतर्गत ASCII कला के रूप में भी दर्शाया गया है।

`रिमोट` निष्पादन मोड में, स्वीकर्ता आने वाले क्लाइंट कनेक्शन प्रसंस्करण को एक रिमोट वर्कर प्रक्रिया को सौंपते हैं। डिफ़ॉल्ट रूप से, स्वीकर्ता कनेक्शन को राउंड-रॉबिन फैशन में सौंपते हैं। अनुरोध को संसाधित करने वाला वर्कर उसी CPU कोर पर चल रहा हो सकता है या नहीं भी हो सकता है जिस पर स्वीकर्ता चल रहा है। यह आर्किटेक्चर उच्च थ्रूपुट के लिए अच्छी तरह से स्केल करता है, लेकिन इसके परिणामस्वरूप प्रति CPU कोर दो प्रक्रियाएँ उत्पन्न होती हैं।

उदाहरण के लिए, यदि मशीन पर N-CPU हैं, तो डिफ़ॉल्ट रूप से, N स्वीकर्ता और N वर्कर प्रक्रियाएँ शुरू की जाती हैं। आप `--num-acceptors` और `--num-workers` फ़्लैग का उपयोग करके प्रक्रियाओं की संख्या को ट्यून कर सकते हैं। आप अपने उपयोग के मामले के आधार पर स्वीकर्ता से अधिक वर्कर या इसके विपरीत चाह सकते हैं।

v2.4.x में, `स्थानीय` निष्पादन मोड जोड़ा गया था, मुख्य रूप से डिफ़ॉल्ट रूप से उत्पन्न प्रक्रियाओं की संख्या को कम करने के लिए। यह मॉडल दिन-प्रतिदिन के एकल उपयोगकर्ता उपयोग के मामलों और डेवलपर परीक्षण परिदृश्यों के लिए अच्छा काम करता है। `स्थानीय` निष्पादन मोड में, स्वीकर्ता क्लाइंट कनेक्शन को एक रिमोट प्रक्रिया के बजाय एक साथी थ्रेड को सौंपते हैं। `स्थानीय` निष्पादन मोड CPU आत्मीयता सुनिश्चित करता है, `रिमोट` मोड के विपरीत जहाँ स्वीकर्ता और वर्कर विभिन्न CPU कोर पर चल रहे हो सकते हैं।

`--local-executor 1` को v2.4.x श्रृंखला में डिफ़ॉल्ट बनाया गया था। `स्थानीय` निष्पादन मोड में, `--num-workers` फ़्लैग का कोई प्रभाव नहीं होता, क्योंकि कोई रिमोट वर्कर शुरू नहीं किए जाते हैं।

`रिमोट` निष्पादन मोड का उपयोग करने के लिए, `--local-executor 0` फ़्लैग का उपयोग करें। फिर वर्कर प्रक्रियाओं की संख्या को ट्यून करने के लिए `--num-workers` का उपयोग करें।

## SyntaxError: अमान्य सिंटैक्स

`proxy.py` सख्ती से टाइप किया गया है और Python `typing` एनोटेशन का उपयोग करता है। उदाहरण:```python
>>> my_strings : List[str] = []
>>> #############^^^^^^^^^#####
```
इसलिए, एक Python संस्करण जो typing annotations को समझता है, आवश्यक है।
सुनिश्चित करें कि आप `Python 3.6+` का उपयोग कर रहे हैं।

`proxy.py` चलाने से पहले संस्करण की जाँच करें:

`❯ python --version`

सभी `typing` annotations को `comment-only` annotations से बदला जा सकता है। उदाहरण:```python
>>> my_strings = [] # List[str]
>>> ################^^^^^^^^^^^
```
यह `proxy.py` को Python `pre-3.6`, यहाँ तक कि `2.7` पर चलाने में सक्षम बनाएगा।
हालाँकि, Python के सभी भविष्य के संस्करण `typing` एनोटेशन का समर्थन करेंगे,
इस पर विचार नहीं किया गया है।

## प्लगइन लोड करने में असमर्थ

सुनिश्चित करें कि प्लगइन मॉड्यूल `PYTHONPATH` में जोड़कर खोजे जा सकें। उदाहरण:

`PYTHONPATH=/path/to/my/app proxy --plugins my_app.proxyPlugin````console
...[redacted]... - Loaded plugin proxy.HttpProxyPlugin

Read more

टूल डाउनलोड करें
  • CustomDnsResolver प्लगइन
  • कस्टम नेटवर्क इंटरफ़ेस
  • ProgramName प्लगइन
  • HTTP वेब सर्वर प्लगइन्स
    • वेब सर्वर रूट
  • रिवर्स प्रॉक्सी प्लगइन्स
    • रिवर्स प्रॉक्सी
  • प्लगइन ऑर्डरिंग
  • एंड-टू-एंड एन्क्रिप्शन
  • TLS इंटरसेप्शन
    • असुरक्षित TLS इंटरसेप्शन
    • Docker के साथ TLS इंटरसेप्शन
  • GROUT (NGROK विकल्प)
    • Grout उपयोग
    • Grout प्रमाणीकरण
    • Grout पथ
    • Grout वाइल्डकार्ड डोमेन
    • "Host" हैडर आधारित वाइल्डकार्ड रूटिंग
    • "गतिशील" रूटिंग
    • Docker का उपयोग करके Grout
    • Grout कैसे काम करता है
    • स्व-होस्टेड Grout
  • SSH टनल के ऊपर प्रॉक्सी
    • स्थानीय रूप से रिमोट अनुरोधों को प्रॉक्सी करें
    • दूरस्थ रूप से स्थानीय अनुरोधों को प्रॉक्सी करें
  • proxy.py एम्बेड करें
    • अवरोधन मोड
    • गैर-अवरोधन मोड
    • अस्थायी पोर्ट
    • प्लगइन लोड करना
  • proxy.py के साथ इकाई परीक्षण
    • proxy.TestCase
    • स्टार्टअप फ्लैग्स को ओवरराइड करें
    • unittest.TestCase के साथ
  • उपयोगिताएँ
    • TCP सॉकेट्स
      • new_socket_connection
      • socket_connection
    • HTTP क्लाइंट
      • build_http_request
      • build_http_response
    • पब्लिक की इंफ्रास्ट्रक्चर
      • API उपयोग
      • CLI उपयोग
  • डैशबोर्ड चलाएँ
    • ट्रैफ़िक का निरीक्षण करें
  • Chrome DevTools प्रोटोकॉल
  • Prometheus मेट्रिक्स
  • अक्सर पूछे जाने वाले प्रश्न
    • उत्पादन में proxy.py तैनात करना
      • क्या न करें?
      • आवश्यकताओं के माध्यम से
      • Docker कंटेनर के माध्यम से
      • अपने CI/CD को proxy.py के साथ एकीकृत करें
    • स्थिर बनाम विकास
      • रिलीज़ शेड्यूल
    • थ्रेड्स बनाम थ्रेडलेस
    • थ्रेडलेस रिमोट बनाम स्थानीय निष्पादन मोड
    • SyntaxError: invalid syntax
    • प्लगइन लोड करने में असमर्थ
    • रिमोट होस्ट से proxy.py से कनेक्ट करने में असमर्थ
    • ब्राउज़र के साथ बेसिक ऑथ काम नहीं कर रहा है
    • MacOS पर Docker इमेज काम नहीं कर रही है
    • ValueError: filedescriptor out of range in select
    • एक्सेस लॉग में None:None
    • TLS इंटरसेप्शन के लिए क्लाइंट को लपेटते समय OSError
  • प्लगइन डेवलपर और योगदानकर्ता गाइड
    • उच्च स्तरीय वास्तुकला
    • सब कुछ एक प्लगइन है
    • अपने स्टेटलेस प्लगइन्स के लिए स्थितियाँ प्रबंधित करना
    • प्लगइन्स के बीच प्रोसेसिंग संदर्भ पास करना
    • आंतरिक दस्तावेज़ीकरण
      • दस्तावेज़ पढ़ें
      • pydoc
      • pyreverse
    • विकास गाइड
      • स्थानीय वातावरण सेटअप करें
      • Git हुक्स सेटअप करें
      • पुल रिक्वेस्ट भेजना
  • Proxy.Py का उपयोग करने वाले प्रोजेक्ट्स
  • बेंचमार्क
  • फ्लैग्स
  • परिवर्तन लॉग
    • v2.x
    • v1.x
    • v0.x
  • थ्रेड्स बनाम थ्रेडलेस और थ्रेडलेस रिमोट बनाम स्थानीय निष्पादन मोड देखें ताकि उपयोग किए गए CPU कोर की संख्या को नियंत्रित किया जा सके।

    अधिक जानकारी और बेंचमार्क स्थानीय रूप से चलाने के तरीके के लिए बेंचमार्क देखें।

  • हल्का

    • केवल ~5-20 MB RAM का उपयोग करता है
      • कोई मेमोरी लीक नहीं
      • एक बार शुरू करें और भूल जाएँ, पुनरारंभ की आवश्यकता नहीं
    • संपीड़ित कंटेनरों का आकार केवल ~25 MB है
    • मानक Python लाइब्रेरी के अलावा कोई बाहरी निर्भरता नहीं
  • प्रोग्राम करने योग्य

    • प्रॉक्सी सर्वर प्लगइन्स का उपयोग करके प्रॉक्सी व्यवहार को अनुकूलित करें। उदाहरण:
      • --plugins proxy.plugin.ProxyPoolPlugin
    • बिल्ट-इन वेब सर्वर सक्षम करें। उदाहरण:
      • --enable-web-server --plugins proxy.plugin.WebServerPlugin
    • बिल्ट-इन रिवर्स प्रॉक्सी सर्वर सक्षम करें। उदाहरण:
      • --enable-reverse-proxy --plugins proxy.plugin.ReverseProxyPlugin
    • प्लगइन API वर्तमान में विकास चरण में है। ब्रेकिंग बदलावों की अपेक्षा करें। कोड परिवर्तनों में विश्वसनीयता सुनिश्चित करने के लिए उत्पादन में proxy.py तैनात करना देखें।
  • एकाधिक पतों और पोर्ट पर सुन सकते हैं

    • अतिरिक्त पते प्रदान करने के लिए --hostnames फ्लैग का उपयोग करें
    • अतिरिक्त पोर्ट प्रदान करने के लिए --ports फ्लैग का उपयोग करें
    • वैकल्पिक रूप से, डिफ़ॉल्ट पोर्ट 8899 को ओवरराइड करने के लिए --port फ्लैग का उपयोग करें
    • एक ही पोर्ट पर एकाधिक प्रोटोकॉल की सेवा करने में सक्षम
  • रीयल-टाइम डैशबोर्ड

    • वैकल्पिक रूप से, proxy.py डैशबोर्ड सक्षम करें।
      • --enable-dashboard का उपयोग करें
      • फिर, http://localhost:8899/dashboard पर जाएँ
    • रनटाइम पर proxy.py का निरीक्षण, निगरानी, नियंत्रण और कॉन्फ़िगर करें
    • Chrome DevTools प्रोटोकॉल समर्थन
    • typescript आधारित प्लगइन्स का उपयोग करके डैशबोर्ड फ्रंटएंड का विस्तार करें
    • डैशबोर्ड वर्तमान में विकास चरण में है। ब्रेकिंग बदलावों की अपेक्षा करें।
  • सुरक्षित

    • क्लाइंट और proxy.py के बीच एंड-टू-एंड एन्क्रिप्शन सक्षम करें
    • एंड-टू-एंड एन्क्रिप्शन देखें
  • निजी

    • DNS आधारित ट्रैफ़िक ब्लॉकर्स से सुरक्षा
    • मैलवेयर और वयस्क सामग्री सुरक्षा सक्षम के साथ ब्राउज़ करें
    • DNS-over-HTTPS देखें
  • मैन-इन-द-मिडल

    • क्लाइंट और अपस्ट्रीम सर्वर के बीच TLS ट्रैफ़िक को डिक्रिप्ट कर सकता है
    • TLS इंटरसेप्शन देखें
  • प्रॉक्सी अनुरोधों के लिए समर्थित http प्रोटोकॉल

    • http(s)
    • http1
    • पाइपलाइन के साथ http1.1
    • http2
    • websockets
  • HAProxy प्रोटोकॉल के लिए समर्थन

    • --enable-proxy-protocol फ्लैग देखें
  • स्टैटिक फ़ाइल सर्वर समर्थन

    • --enable-static-server और --static-server-dir फ्लैग देखें
  • बड़ी फ़ाइल अपलोड और डाउनलोड के लिए अनुकूलित

    • --client-recvbuf-size, --server-recvbuf-size, --max-sendbuf-size फ्लैग देखें
  • IPv4 और IPv6 समर्थन

    • --hostname फ्लैग देखें
  • Unix डोमेन सॉकेट समर्थन

    • --unix-socket-path फ्लैग देखें
  • बेसिक ऑथेंटिकेशन समर्थन

    • --basic-auth फ्लैग देखें
  • PAC (प्रॉक्सी ऑटो-कॉन्फ़िगरेशन) समर्थन

    • --pac-file और --pac-file-url-path फ्लैग देखें
  • एक्सेप्टर और वर्कर के बीच संबंध को समझने के लिए High Level Architecture देखें
  • Started server on ::1:8899

    • डिफ़ॉल्ट रूप से, proxy.py IPv6 ::1 पर सुनता है, जो IPv4 127.0.0.1 के समतुल्य है
    • यदि आप किसी बाहरी होस्ट से proxy.py तक पहुँचना चाहते हैं, तो --hostname :: या --hostname 0.0.0.0 का उपयोग करें या अपनी मशीन पर उपलब्ध किसी अन्य इंटरफ़ेस से बाइंड करें।
    • proxy.py के अपस्ट्रीम सर्वरों को दिखने वाले सार्वजनिक IP को अनुकूलित करने के तरीके के लिए CustomNetworkInterface देखें।
  • Port 8899

    • डिफ़ॉल्ट TCP पोर्ट को अनुकूलित करने के लिए --port फ़्लैग का उपयोग करें।