Search code examples
powershellhttphttp-status-codes

HTTP Status codes via Powershell


Somehow the below codes works fine for the first few test URLs within C:\testurl.txt then it hung up forever when it is processing the 4th URL from the C:\testurl.txt , no idea why it hangs up?

It is already working fine for up to 3 URLs but stuck up on 4th onward

CLS
$urllist = Get-Content "C:\testurl.txt" # URLs to test one in each line
foreach ($url in $urllist) {
    Write-Host $url

    $req = [System.Net.WebRequest]::Create($url)

    try {
        $res = $req.GetResponse()
    } catch [System.Net.WebException] {
        $res = $_.Exception.Response
    }

    $res.StatusCode
    #Print OK or whatever

    [int]$res.StatusCode
    #Print 200 or whatever
}

It is working fine for up to 3 URLs but hangs the script on 4th URL without any output or error message. Here is the example of c:\testurl.txt

http://www.google.com
http://www.google.com     
http://www.google.com
http://www.google.com
http://www.hotmail.com
http://www.gmail.com
http://www.yahoo.com
http://www.msn.com

Please note each URL will be in a new line, you will see that script will stop at (the 4th one) you may try with your own URLs, etc too


Solution

  • then it hung up forever

    No - it's hung until the underlying TCP connections of the previous requests time out.

    The .NET CLR will internally pool all WebRequest dispatches so that only a finite number of external requests will be initiated concurrently, and as long as you have a number of un-closed WebResponse objects in memory, your requests will start queuing up.

    You can avoid this by closing them (as you should):

    foreach ($url in $urllist) {
        Write-Host $url
    
        $req = [System.Net.WebRequest]::Create($url)
    
        try {
            $res = $req.GetResponse()
        } 
        catch [System.Net.WebException] {
            $res = $_.Exception.Response
        }
        finally {
            if ($res -is [System.Net.WebResponse]) {
                $res.StatusCode
                #Print OK or whatever
    
                [int]$res.StatusCode
                #Print 200 or whatever
    
                $res.Dispose()
                # close connection, dispose of response stream
            }
        }
    }