2atWeb.psm1
#Requires -Version 4.0 -Modules 2atGeneral $PSDefaultParameterValues.Clear() Set-StrictMode -Version 2.0 $ErrorActionPreference = 'Stop' Add-Type -Assembly System.Net.Http Import-Module 2atGeneral Function HashTableToDictionary { Param( [Parameter(Mandatory=$true)] [HashTable]$HashTable ) $Dictionary = New-Object 'System.Collections.Generic.Dictionary[string,string]' $HashTable.Keys | %{ $Dictionary.Add($_, $HashTable[$_]) } $Dictionary } Function Get-WebResponseString { Param( [Parameter(Mandatory=$true)] [PSCustomObject]$WebResponse ) Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState $headers = ($WebResponse.ResponseHeaders | %{ "$($_): $($WebResponse.ResponseHeaders[$_])" }) -join [Environment]::NewLine "HTTP/$($WebResponse.ProtocolVersion) $([int]$WebResponse.HTTPStatus) $($WebResponse.HTTPStatusDescription) $headers $($WebResponse.ResponseBody)" } Function Get-WebResponse { Param( [Parameter(Mandatory=$true)] [ValidateScript({(New-Object System.Uri $_)})] [string]$Url, [hashtable]$HostIPs = @{}, [System.Net.CookieContainer]$CookieContainer, [string]$Method = 'GET', [object]$FormData, [System.Net.WebProxy]$Proxy, [System.Net.ICredentials]$Credentials, [string]$UserAgent ) Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState if ($FormData -And -Not ($FormData -is [HashTable] -or $FormData -is [System.Collections.Generic.Dictionary[string,string]])) { throw 'FormData must be either a HashTable or a Dictionary[string,string]' } $o = [ordered]@{ DateTime=Get-Date Url=$Url Method=$Method HostHeader=$null FormData=$null WebRequestStatus=[System.Net.WebExceptionStatus]::Success WebRequestStatusDescription=$null ProtocolVersion=$null HTTPStatus=$null HTTPStatusDescription=$null ResponseHeaders=$null ResponseBody=$null } if ($HostIPs.Keys | ?{ $url -match "(https?://)($_)(/.*)" }) { $req = [System.Net.WebRequest]::Create("$($Matches[1])$($HostIPs[$Matches[2]])$($Matches[3])") $o.HostHeader = $req.Host = $Matches[2] } else { $req = [System.Net.WebRequest]::Create($Url) } $req.AllowAutoRedirect = $false $req.UserAgent = $UserAgent $req.CookieContainer = $CookieContainer $req.Method = $Method $req.Proxy = $Proxy $req.Credentials = $Credentials $c = $null if ($FormData) { if ($FormData -is [HashTable]) { $FormData = HashTableToDictionary $FormData } $o.FormData = $FormData $c = New-Object System.Net.Http.FormUrlEncodedContent $FormData $req.ContentType = $c.Headers.ContentType.MediaType } $reader = $null $resp = $null try { $o.TotalTime = Measure-Command { $o.TimeToFirstByte = Measure-Command { try { if ($c) { Wait-Job $c.CopyToAsync($req.GetRequestStream()) } $resp = $req.GetResponse() } catch [System.Net.WebException] { $e = $_.Exception Write-Warning "$Method $Url : $($e.Status) - $($e.Message)" $resp = $e.Response $o.WebRequestStatus = $e.Status $o.WebRequestStatusDescription = $e.Message } } if ($resp) { $encoding = if ($resp.CharacterSet) { try { [System.Text.Encoding]::GetEncoding($resp.CharacterSet) } catch { Write-Warning "$Method $Url : Invalid encoding $($resp.CharacterSet)" } } if ($encoding) { $reader = New-Object System.IO.StreamReader $resp.GetResponseStream(), $encoding } else { $reader = New-Object System.IO.StreamReader $resp.GetResponseStream() } $o.ResponseBody = $reader.ReadToEnd() } } if ($resp) { $o.ProtocolVersion = $resp.ProtocolVersion $o.ResponseHeaders = $resp.Headers $o.HTTPStatus = $resp.StatusCode $o.HTTPStatusDescription = $resp.StatusDescription } [PSCustomObject]$o } finally { if ($reader) { $reader.Dispose() } if ($resp) { $resp.Dispose() } } } Export-ModuleMember -Function Get-* # SIG # Begin signature block # MIIWbwYJKoZIhvcNAQcCoIIWYDCCFlwCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDF4AhOzA+YXYFR # i+x6pcY1aLWdBrvg48BIUlCjR2wJgqCCCxswggUzMIIEG6ADAgECAhEAgNHe/U3D # BzyckFGAgIDcJDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJHQjEbMBkGA1UE # CBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQK # ExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNp # Z25pbmcgQ0EwHhcNMTcwMTEzMDAwMDAwWhcNMjAwMTEzMjM1OTU5WjCBgDELMAkG # A1UEBhMCTkwxEDAOBgNVBBEMBzM1NDIgRFoxEDAOBgNVBAgMB1V0cmVjaHQxEDAO # BgNVBAcMB1V0cmVjaHQxFTATBgNVBAkMDEVuZXJnaWV3ZWcgMTERMA8GA1UECgwI # MkFUIEIuVi4xETAPBgNVBAMMCDJBVCBCLlYuMIIBIjANBgkqhkiG9w0BAQEFAAOC # AQ8AMIIBCgKCAQEAzB3KZ2CBenaD2WDwOsy0cHE6mLIeIYqWP718FuWeUZ5eejvw # 8BozajbtBWgISZ2IMsTYZ1I7KFBzHgXXkNglmyboa6++x7j2Ws+T0hmHCUZ64AFb # OkXjqYsOBCPhi3yuKIRLwc4snA3F3DCH24mBpDYymrU22+0vMIlDqpzRXBNEeIhG # ss3jehu86l85fWVS54F5KGeDYQ2BT0Tc0UO6hMlcpCEVKIbthLm36q1/oSchRYjH # B4JCT1KqACRhD0hJcQmTcJZvhpgOrglUVlj1ClS5xfWgHq3ySShOOZMecl0VNMtY # xNi5TF1Ae+sie4044ioyGB6dGItGXwhObIk/9wIDAQABo4IBqDCCAaQwHwYDVR0j # BBgwFoAUKZFg/4pN+uv5pmq4z/nmS71JzhIwHQYDVR0OBBYEFDHc2o80OMg8zNfF # WMH8QB57E7rnMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQM # MAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIBAQQEAwIEEDBGBgNVHSAEPzA9MDsGDCsG # AQQBsjEBAgEDAjArMCkGCCsGAQUFBwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8u # bmV0L0NQUzBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNv # bS9DT01PRE9SU0FDb2RlU2lnbmluZ0NBLmNybDB0BggrBgEFBQcBAQRoMGYwPgYI # KwYBBQUHMAKGMmh0dHA6Ly9jcnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUNvZGVT # aWduaW5nQ0EuY3J0MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5j # b20wGQYDVR0RBBIwEIEOc3VwcG9ydEAyYXQubmwwDQYJKoZIhvcNAQELBQADggEB # AHGDJyOKLJwzdt4Y8ow7H4ZKZXs9Hopf0GhizzhcPWyWL7GI6QHhKHzFWYGsFhh2 # vesuY7p89jthK5YqSn1u2KUQuLWzQZQj3cZCK2BwSz6FpgmmjqIo49qCfKIB5IrE # DcZAQPC9wxaXPI+R3B32JmTllBpkFQNTIJVcB7jR/Ft991iV17tMMq0GssMAHnVd # /yvTWlUaE7XNtgtNYQ5v/8HxxNtdBXsIbdjiv/A8GjUmyPN8Dum9CW82hUqOE7U9 # AXHZIBWy9yrooSieo26GA1OzrBvnDc+L42JZnjvwdhBqSnbQrSS7L6VjVHU+Ct84 # Fnb5u23Jypdmj9123Hw9qJwwggXgMIIDyKADAgECAhAufIfMDpNKUv6U/Ry3zTSv # MA0GCSqGSIb3DQEBDAUAMIGFMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRl # ciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01PRE8g # Q0EgTGltaXRlZDErMCkGA1UEAxMiQ09NT0RPIFJTQSBDZXJ0aWZpY2F0aW9uIEF1 # dGhvcml0eTAeFw0xMzA1MDkwMDAwMDBaFw0yODA1MDgyMzU5NTlaMH0xCzAJBgNV # BAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1Nh # bGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMwIQYDVQQDExpDT01P # RE8gUlNBIENvZGUgU2lnbmluZyBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC # AQoCggEBAKaYkGN3kTR/itHd6WcxEevMHv0xHbO5Ylc/k7xb458eJDIRJ2u8UZGn # z56eJbNfgagYDx0eIDAO+2F7hgmz4/2iaJ0cLJ2/cuPkdaDlNSOOyYruGgxkx9hC # oXu1UgNLOrCOI0tLY+AilDd71XmQChQYUSzm/sES8Bw/YWEKjKLc9sMwqs0oGHVI # wXlaCM27jFWM99R2kDozRlBzmFz0hUprD4DdXta9/akvwCX1+XjXjV8QwkRVPJA8 # MUbLcK4HqQrjr8EBb5AaI+JfONvGCF1Hs4NB8C4ANxS5Eqp5klLNhw972GIppH4w # vRu1jHK0SPLj6CH5XkxieYsCBp9/1QsCAwEAAaOCAVEwggFNMB8GA1UdIwQYMBaA # FLuvfgI9+qbxPISOre44mOzZMjLUMB0GA1UdDgQWBBQpkWD/ik366/mmarjP+eZL # vUnOEjAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE # DDAKBggrBgEFBQcDAzARBgNVHSAECjAIMAYGBFUdIAAwTAYDVR0fBEUwQzBBoD+g # PYY7aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ2VydGlmaWNhdGlv # bkF1dGhvcml0eS5jcmwwcQYIKwYBBQUHAQEEZTBjMDsGCCsGAQUFBzAChi9odHRw # Oi8vY3J0LmNvbW9kb2NhLmNvbS9DT01PRE9SU0FBZGRUcnVzdENBLmNydDAkBggr # BgEFBQcwAYYYaHR0cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUA # A4ICAQACPwI5w+74yjuJ3gxtTbHxTpJPr8I4LATMxWMRqwljr6ui1wI/zG8Zwz3W # GgiU/yXYqYinKxAa4JuxByIaURw61OHpCb/mJHSvHnsWMW4j71RRLVIC4nUIBUzx # t1HhUQDGh/Zs7hBEdldq8d9YayGqSdR8N069/7Z1VEAYNldnEc1PAuT+89r8dRfb # 7Lf3ZQkjSR9DV4PqfiB3YchN8rtlTaj3hUUHr3ppJ2WQKUCL33s6UTmMqB9wea1t # QiCizwxsA4xMzXMHlOdajjoEuqKhfB/LYzoVp9QVG6dSRzKp9L9kR9GqH1NOMjBz # wm+3eIKdXP9Gu2siHYgL+BuqNKb8jPXdf2WMjDFXMdA27Eehz8uLqO8cGFjFBnfK # S5tRr0wISnqP4qNS4o6OzCbkstjlOMKo7caBnDVrqVhhSgqXtEtCtlWdvpnncG1Z # +G0qDH8ZYF8MmohsMKxSCZAWG/8rndvQIMqJ6ih+Mo4Z33tIMx7XZfiuyfiDFJN2 # fWTQjs6+NX3/cjFNn569HmwvqI8MBlD7jCezdsn05tfDNOKMhyGGYf6/VXThIXcD # Cmhsu+TJqebPWSXrfOxFDnlmaOgizbjvmIVNlhE8CYrQf7woKBP7aspUjZJczcJl # mAaezkhb1LU3k0ZBfAfdz/pD77pnYf99SeC7MH1cgOPmFjlLpzGCCqowggqmAgEB # MIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIx # EDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSMw # IQYDVQQDExpDT01PRE8gUlNBIENvZGUgU2lnbmluZyBDQQIRAIDR3v1Nwwc8nJBR # gICA3CQwDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG # 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB # FTAvBgkqhkiG9w0BCQQxIgQg1NAfPrwFy4NrhYqwxOPsLi74YVMWGnsEuCWrJEH0 # Ek0wDQYJKoZIhvcNAQEBBQAEggEALzFX/PIKoukHkW6L/pATLXdr4WyCDIDcF3Kq # bEdi/LRBsyEBr7Qd5swx4GxRETYyrpKCM1dAcxxkS6HwcAP1yNW2XLFBlCMPvRt2 # ZfkVdABPvoiQjYaoMep04Ig7kNS2ApB9AxBxHZxNYHv0iBp/rqP8xW38o7GDXOWV # UL//fpUl4KcJh2WeiH4iB/ilIxRs3koWBmWQWlLJOn0bnX4dGos9KsJBtrwr7zNF # h8KPZtf7k37gujEgTgqmO15At21RLVdZCGOHt3W0oATRk7ab/85mf9VKl/Lwu5MH # KEYgOBOAE4lZxVK75t/T+1yBaQcA+SKdErz7vDyRSpdgDfm7tKGCCGowgghmBgor # BgEEAYI3AwMBMYIIVjCCCFIGCSqGSIb3DQEHAqCCCEMwggg/AgEDMQ8wDQYJYIZI # AWUDBAIBBQAwggEOBgsqhkiG9w0BCRABBKCB/gSB+zCB+AIBAQYKKwYBBAGyMQIB # ATAxMA0GCWCGSAFlAwQCAQUABCD8jj9exIByqmg5YQXgZbur/drpd1y6lj/KDoTn # zk27WgIUVWk7rpZpc+lUVCKMpI2HVe6aRFIYDzIwMTgwMzIyMDgwNzAyWqCBjKSB # iTCBhjELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQ # MA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxLDAq # BgNVBAMTI0NPTU9ETyBTSEEtMjU2IFRpbWUgU3RhbXBpbmcgU2lnbmVyoIIEoDCC # BJwwggOEoAMCAQICEE6wh4/MJDU2stjJ9785VXcwDQYJKoZIhvcNAQELBQAwgZUx # CzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp # dHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0 # cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9i # amVjdDAeFw0xNTEyMzEwMDAwMDBaFw0xOTA3MDkxODQwMzZaMIGGMQswCQYDVQQG # EwJHQjEbMBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxm # b3JkMRowGAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEsMCoGA1UEAxMjQ09NT0RP # IFNIQS0yNTYgVGltZSBTdGFtcGluZyBTaWduZXIwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQDOvHS3cIBPXvM/mKouy9QSASM1aQsivOb9CWwo5BMSrLu6 # LeXV3SLuc7Ys+NKkcedJJXirJbeQEKCbi3cm3UDqQaP9iM1ypok7UFcceiUkIgJR # QDVnijFpDeU5c0k5m5UBhVLyKxSJmk4EpLxArjmm3UAC4Dp1/j19VZRb8U4kfMi4 # WBnKwNq+WBOa5hzn0cE78F2PSQghntDzvtbUZk9ccjZ7w4LTmAiUr6tETxjHFNoW # sR4yDhI4wLU8dux1UAAgBBEZ7cb/307+CIEnMU9xdG4DDHAngVVqmkOSpH/b/T/F # Fx5Bu87op3+Mlfn9f/hhiIkAPv8LAdv91bWk5JERAgMBAAGjgfQwgfEwHwYDVR0j # BBgwFoAU2u1kdBScFDyr3ZmpvVsoTYs8ydgwHQYDVR0OBBYEFH2/kdenbFpHZkR7 # kNSOkHJBjxfCMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB # /wQMMAoGCCsGAQUFBwMIMEIGA1UdHwQ7MDkwN6A1oDOGMWh0dHA6Ly9jcmwudXNl # cnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LU9iamVjdC5jcmwwNQYIKwYBBQUHAQEE # KTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqG # SIb3DQEBCwUAA4IBAQBQsPXfX60z3MNTWFi8whN1eyAdVMq6P1A/uor0awljwFtd # i9Z1GnO9i/9H8RXcURYjGTLmbpJN0cYuWh6IQhTJcuXXCFCKavVkQFauJONhlxVC # 8CxIroPmNTyLW8KPro7MNFI04Pv+yv2xJGjRpBEjEAb9ssIkJ8fX6Uocjz8+z+3r # dXlsjl/3IbZQ5iWhzWaUEmy/27Ouh9hoA3IgAsJ+2pTzcgc8V+hVJOcFoB3EgQGC # Sx8/D50zm/BPzJ3WhYHPy+f9SumSuPcNcnMt6Xf5b48oej4evQiG3I0eEV/3W7uH # dsaeTFRh0Gfbk4TaMYcDkuef4+nPWlbIaOBSSZRcMYICcTCCAm0CAQEwgaowgZUx # CzAJBgNVBAYTAlVTMQswCQYDVQQIEwJVVDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp # dHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEhMB8GA1UECxMYaHR0 # cDovL3d3dy51c2VydHJ1c3QuY29tMR0wGwYDVQQDExRVVE4tVVNFUkZpcnN0LU9i # amVjdAIQTrCHj8wkNTay2Mn3vzlVdzANBglghkgBZQMEAgEFAKCBmDAaBgkqhkiG # 9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTE4MDMyMjA4MDcw # MlowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUNlJ9T6JqaPnrRZbx2Zq7LA6nbfow # LwYJKoZIhvcNAQkEMSIEIAIVhKSiHSbBhJs+IXrWjKTsqTXBR0a2Ly/CAosin57f # MA0GCSqGSIb3DQEBAQUABIIBAKXKXHa0eXg/9sZtIjQDyqZFFqtgdh60q0Zo0+// # SAcrtJpvemGkQ3vlf8T77iPBpdN2PJQyi6fmrMna+P6KTYXLYTxCj0eBAyZ5iGZB # cXuKbt76Py8TRjcgj1BidwhFuEVPBCVXw/skrwMVWs/MYasoMKxf7y41czY9I6W9 # VNe0gYuuYZi8LXbSEY+XfjHVSTgkp6VcMyKt5lcyE3NKZGThao94on1C8ObMv7gY # 0gIqtV39UFFAiRkxQVEl+xaLzMw0CoOVMyWSWnbukkvPRH6BhCU3E4k2x4JK90b4 # i+z1mUkNO2KS3uMC2DSu/2WGzRcCpBHkf+qa+gHXnOdpw+E= # SIG # End signature block |