Go HTTP ক্লায়েন্টের transport প্রক্সি বেছে নেয়। মানক transport বদলানোর আগে ক্লোন করুন, যাতে ডিফল্ট ক্লায়েন্টের অন্য ব্যবহারকারীরা আগের রুটিং রাখতে পারেন।

package main

import (
    "fmt"
    "io"
    "log"
    "net/http"
    "net/url"
    "time"
)

func main() {
    proxyURL, err := url.Parse("http://203.0.113.10:8080")
    if err != nil {
        log.Fatal(err)
    }

    transport := http.DefaultTransport.(*http.Transport).Clone()
    transport.Proxy = http.ProxyURL(proxyURL)
    defer transport.CloseIdleConnections()

    client := &http.Client{
        Transport: transport,
        Timeout:   15 * time.Second,
    }

    response, err := client.Get("https://example.com/")
    if err != nil {
        log.Fatal(err)
    }
    defer response.Body.Close()

    fmt.Println(response.StatusCode)
    if _, err := io.Copy(io.Discard, response.Body); err != nil {
        log.Fatal(err)
    }
}

ঠিকানাটি নথির উদাহরণ। এর বদলে সত্যিকারের HTTP প্রক্সির IP ও পোর্ট বসান, যেমন HTTP প্রক্সির তালিকা থেকে বাছা কোনো সম্ভাব্য প্রক্সি। উদাহরণ শুধু Go-এর মানক লাইব্রেরি ব্যবহার করে; এই HTTP প্রক্সি অনুরোধে SOCKS প্যাকেজ বা পুরো প্রসেসের এনভায়রনমেন্ট ভেরিয়েবল লাগে না।

DefaultTransport সরাসরি না বদলানোর কারণ

ডিফল্ট transport ভাগাভাগি করে ব্যবহৃত হয়। সেটি বদলালে এমন কোডের আচরণও বদলাতে পারে, যা আপনার প্রক্সি চায়নি। অনুরোধ চলাকালে বদলালে এড়ানো সম্ভব এমন সমসাময়িকতার সমস্যাও হয়। আলাদা transport পথটিকে এই ক্লায়েন্টের কনফিগারেশনের অংশ করে।

http.ProxyURL এমন নির্বাচক ফেরায়, যা সব সময় দেওয়া URL বেছে নেয়। এটি ডিফল্ট পরিবেশ নির্বাচক থেকে আলাদা; সেটি প্রক্সি ভেরিয়েবল ও বাইপাস নিয়ম বিবেচনা করে। HTTP তালিকার একটি নির্দিষ্ট এন্ট্রি পরীক্ষা করতে চাইলে স্পষ্ট নির্বাচকটি এই অনিশ্চয়তা সরায়।

রেসপন্স বন্ধ করুন এবং ক্লায়েন্ট আবার ব্যবহার করুন

উদাহরণ রেসপন্স বডি পুরো পড়ে বন্ধ করে। শেষ পর্যন্ত পড়লে transport সুযোগমতো সংযোগ পুনর্ব্যবহার করতে পারে। একই প্রক্সিতে একাধিক অনুরোধ করা প্রোগ্রামে প্রতি বার নতুন জোড়া না বানিয়ে ক্লায়েন্ট ও transport ধরে রাখুন।

ক্লায়েন্টের সময়সীমা শুধু সকেট খোলা নয়, রেসপন্স বডি পড়াসহ অনুরোধের জীবনচক্রও সীমিত করে। Get ফেরার পরেও পড়ার ত্রুটি সামলাতে হয়। 403-এর মতো স্ট্যাটাস Go transport-এর ত্রুটি নয়, তাই StatusCode ও err আলাদা করে দেখুন।

সম্পর্কিত নিবন্ধ