diff --git a/.travis.yml b/.travis.yml index a7603cad..10b3f169 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,7 +10,7 @@ go_import_path: github.com/kataras/iris # global: # - GOCACHE=off install: - - go get ./... # for iris-contrib/httpexpect, kataras/golog + - go get ./... script: - go test -v -cover ./... after_script: diff --git a/README.md b/README.md index 51b26dbd..6e168475 100644 --- a/README.md +++ b/README.md @@ -912,7 +912,7 @@ func main() { ### Testing -Iris offers an incredible support for the [httpexpect](https://github.com/iris-contrib/httpexpect), a Testing Framework for web applications. However, you are able to use the standard Go's `net/http/httptest` package as well but in this example we will use the `kataras/iris/httptest`. +Iris offers an incredible support for the [httpexpect](https://github.com/gavv/httpexpect), a Testing Framework for web applications. However, you are able to use the standard Go's `net/http/httptest` package as well but in this example we will use the `kataras/iris/httptest`. ```go package main diff --git a/_benchmarks/benchmarker/benchmarker.go b/_benchmarks/benchmarker/benchmarker.go deleted file mode 100644 index f43a9087..00000000 --- a/_benchmarks/benchmarker/benchmarker.go +++ /dev/null @@ -1,253 +0,0 @@ -package main - -import ( - "bufio" - "os" - "os/exec" - "path/filepath" - "runtime" - - "github.com/kataras/golog" -) - -var debug = false - -var logger = golog.Default - -func init() { - if len(os.Args) > 1 && os.Args[1] == "debug" { - debug = true - } - - if debug { - logger.SetLevel("debug") - } -} - -var bundles = []bundle{ - { - names: []string{"dotnet"}, - installDir: "./platforms/dotnet", - installArguments: []string{"-NoPath", "-InstallDir", "$installDir", "-Channel", "Current", "-Version", "3.0.100-preview6-012264"}, - }, - { - names: []string{"node", "npm"}, - installDir: "./platforms/node", // do no change that. - installArguments: []string{"$installDir", "12.4.0"}, - }, - { - names: []string{"git"}, - installDir: "./platforms/git", - installArguments: []string{"-InstallDir", "$installDir"}, - }, - { - names: []string{"go"}, // get-only, at least for now. - installDir: "./platforms/go", - installArguments: []string{"-InstallDir", "$installDir"}, - }, - { - names: []string{"bombardier"}, - installDir: "./platforms/bombardier", - }, -} - -func install(b bundle) error { - for _, name := range b.names { - switch name { - case "dotnet": - return installDotnet(b) - case "node", "nodejs", "npm": - return installNode(b) - case "git": - return installGit(b) - case "bombardier": - return installBombardier(b) - } - } - - return nil -} - -type bundle struct { - names []string - installDir string - - installArguments []string -} - -func (b bundle) parseArguments() []string { - for i, arg := range b.installArguments { - if arg[0] == '$' { - // let's not use reflection here. - switch arg[1:] { - case "name": - b.installArguments[i] = b.names[0] - case "installDir": - if runtime.GOOS == "windows" { - b.installDir = filepath.FromSlash(b.installDir) - } - b.installArguments[i] = b.installDir - default: - panic(arg + " not a bundle struct field") - } - } - } - - return b.installArguments -} - -type platform struct { - executable string -} - -func (p *platform) text(args ...string) string { - cmd := exec.Command(p.executable, args...) - b, err := cmd.CombinedOutput() - if err != nil { - logger.Error(err) - return "" - } - - return string(b) -} - -func (p *platform) exec(args ...string) error { - cmd := exec.Command(p.executable, args...) - return cmd.Run() -} - -func (p *platform) attach(logLevel string, args ...string) error { - cmd := exec.Command(p.executable, args...) - attachCmd(logLevel, cmd) - return cmd.Run() -} - -func attachCmd(logLevel string, cmd *exec.Cmd) *exec.Cmd { - level := golog.ParseLevel(logLevel) - outputReader, err := cmd.StdoutPipe() - if err == nil { - outputScanner := bufio.NewScanner(outputReader) - - go func() { - defer outputReader.Close() - for outputScanner.Scan() { - logger.Log(level, outputScanner.Text()) - } - }() - - errReader, err := cmd.StderrPipe() - if err == nil { - errScanner := bufio.NewScanner(errReader) - go func() { - defer errReader.Close() - for errScanner.Scan() { - logger.Log(level, errScanner.Text()) // don't print at error. - } - }() - } - } - - return cmd -} - -func resolveFilename(name string) string { - if runtime.GOOS == "windows" { - name += ".exe" - } - - return name -} - -func getPlatform(name string) (p *platform) { - for _, b := range bundles { - for _, bName := range b.names { - if bName == name { - - // temporarily set the path env to the installation directories - // in order the exec.LookPath to check for programs there too. - pathEnv := os.Getenv("PATH") - if len(pathEnv) > 1 { - if pathEnv[len(pathEnv)-1] != ';' { - pathEnv += ";" - } - } - - pathEnv += b.installDir + "/bin;" - pathEnv += b.installDir - - os.Setenv("PATH", pathEnv) - executable, err := exec.LookPath(name) - if err != nil { - logger.Infof("%s executable couldn't be retrieved by PATH or PATHTEXT. Installation started...", name) - - err = install(b) - if err != nil { - logger.Fatalf("unable to auto-install %s, please do it yourself: %v", name, err) - } - - name = resolveFilename(name) - // first check for installDir/bin/+name before the installDir/+name to - // find the installed executable (we could return it from our scripts but we don't). - binExecutable := b.installDir + "/bin/" + name - if _, err = os.Stat(binExecutable); err == nil { - executable = binExecutable - } else { - executable = b.installDir + "/" + name - } - } - - return &platform{ - executable: executable, - } - } - } - } - - logger.Fatalf("%s not found", name) - return nil -} - -func main() { - dotnet := getPlatform("dotnet") - dotnetVersion := dotnet.text("--version") - logger.Info("Dotnet version: ", dotnetVersion) - - node := getPlatform("node") - nodeVersion := node.text("--version") - logger.Info("Nodejs version: ", nodeVersion) - - npm := getPlatform("npm") - npmVersion := npm.text("--version") - logger.Info("NPM version: ", npmVersion) - - git := getPlatform("git") - gitVersion := git.text("--version") - logger.Info("Git version: ", gitVersion) - - golang := getPlatform("go") - goVersion := golang.text("version") - logger.Info("Go version: ", goVersion) - - bombardier := getPlatform("bombardier") - bombardierVersion := bombardier.text("--version") - logger.Info("Bombardier version: ", bombardierVersion) -} - -func installBombardier(b bundle) error { - const ( - repo = "github.com/codesenberg/bombardier" - latestVersion = "1.2.4" - ) - - dst := filepath.Join(os.Getenv("GOPATH"), "/src", repo) - os.RemoveAll(dst) // remove any copy that $GOPATH may have. - - if err := getPlatform("git").exec("clone", "https://"+repo, dst); err != nil { - return err - } - - executable := resolveFilename(b.names[0]) - executableOutput := filepath.Join(b.installDir, executable) - - return getPlatform("go").attach("info", "build", "-ldflags", "-X main.version="+latestVersion, "-o", executableOutput, dst) -} diff --git a/_benchmarks/benchmarker/installer_unix.go b/_benchmarks/benchmarker/installer_unix.go deleted file mode 100644 index 7b952b2a..00000000 --- a/_benchmarks/benchmarker/installer_unix.go +++ /dev/null @@ -1,15 +0,0 @@ -// +build !windows - -package main - -import ( - "os/exec" -) - -func sh(script string, args ...string) error { - return (&platform{"bin/sh"}).attach("debug", append([]string{script}, args...)...) -} - -func installDotnet(b bundle) error { - return sh("./scripts/dotnet-install.sh", b.parseArguments()...) -} diff --git a/_benchmarks/benchmarker/installer_windows.go b/_benchmarks/benchmarker/installer_windows.go deleted file mode 100644 index 96e843e0..00000000 --- a/_benchmarks/benchmarker/installer_windows.go +++ /dev/null @@ -1,38 +0,0 @@ -// +build windows - -package main - -import "errors" - -var errUnableToInstall = errors.New("unable to install") - -func powershell(script string, args ...string) error { - return (&platform{"powershell"}).attach("debug", append([]string{script}, args...)...) -} - -func installDotnet(b bundle) error { - // Note: -Channel Preview is not available with the "latest" version, so we target a specific version; - // it's also required to do that because a lot of times the project .csproj settings are changing from version to version. - // - // Issue: - // cannot be loaded because running scripts is disabled on this system - // Solution with administrator privileges: - // Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted - // - // Issue: ./scripts/dotnet-install.ps1 : AuthorizationManager check failed. - // Solution (not work): - // Unblock-File + script - // Solution (requires manual action): - // Right click on the ./scripts/dotnet-install.ps1 and check the "unblock" property, save and exit the dialog. - // - // -ExecutionPolicy Bypass? (not tested) - return powershell("./scripts/dotnet-install.ps1", b.parseArguments()...) -} - -func installNode(b bundle) error { - return powershell("./scripts/node-install.ps1", b.parseArguments()...) -} - -func installGit(b bundle) error { - return powershell("./scripts/git-install.ps1", b.parseArguments()...) -} diff --git a/_benchmarks/benchmarker/scripts/dotnet-install.ps1 b/_benchmarks/benchmarker/scripts/dotnet-install.ps1 deleted file mode 100644 index f17bd851..00000000 --- a/_benchmarks/benchmarker/scripts/dotnet-install.ps1 +++ /dev/null @@ -1,638 +0,0 @@ -# -# Copyright (c) .NET Foundation and contributors. All rights reserved. -# Licensed under the MIT license. See LICENSE file in the project root for full license information. -# - -<# -.SYNOPSIS - Installs dotnet cli -.DESCRIPTION - Installs dotnet cli. If dotnet installation already exists in the given directory - it will update it only if the requested version differs from the one already installed. -.PARAMETER Channel - Default: LTS - Download from the Channel specified. Possible values: - - Current - most current release - - LTS - most current supported release - - 2-part version in a format A.B - represents a specific release - examples: 2.0, 1.0 - - Branch name - examples: release/2.0.0, Master - Note: The version parameter overrides the channel parameter. -.PARAMETER Version - Default: latest - Represents a build version on specific channel. Possible values: - - latest - most latest build on specific channel - - coherent - most latest coherent build on specific channel - coherent applies only to SDK downloads - - 3-part version in a format A.B.C - represents specific version of build - examples: 2.0.0-preview2-006120, 1.1.0 -.PARAMETER InstallDir - Default: %LocalAppData%\Microsoft\dotnet - Path to where to install dotnet. Note that binaries will be placed directly in a given directory. -.PARAMETER Architecture - Default: - this value represents currently running OS architecture - Architecture of dotnet binaries to be installed. - Possible values are: , amd64, x64, x86, arm64, arm -.PARAMETER SharedRuntime - This parameter is obsolete and may be removed in a future version of this script. - The recommended alternative is '-Runtime dotnet'. - - Default: false - Installs just the shared runtime bits, not the entire SDK. - This is equivalent to specifying `-Runtime dotnet`. -.PARAMETER Runtime - Installs just a shared runtime, not the entire SDK. - Possible values: - - dotnet - the Microsoft.NETCore.App shared runtime - - aspnetcore - the Microsoft.AspNetCore.App shared runtime -.PARAMETER DryRun - If set it will not perform installation but instead display what command line to use to consistently install - currently requested version of dotnet cli. In example if you specify version 'latest' it will display a link - with specific version so that this command can be used deterministicly in a build script. - It also displays binaries location if you prefer to install or download it yourself. -.PARAMETER NoPath - By default this script will set environment variable PATH for the current process to the binaries folder inside installation folder. - If set it will display binaries location but not set any environment variable. -.PARAMETER Verbose - Displays diagnostics information. -.PARAMETER AzureFeed - Default: https://dotnetcli.azureedge.net/dotnet - This parameter typically is not changed by the user. - It allows changing the URL for the Azure feed used by this installer. -.PARAMETER UncachedFeed - This parameter typically is not changed by the user. - It allows changing the URL for the Uncached feed used by this installer. -.PARAMETER FeedCredential - Used as a query string to append to the Azure feed. - It allows changing the URL to use non-public blob storage accounts. -.PARAMETER ProxyAddress - If set, the installer will use the proxy when making web requests -.PARAMETER ProxyUseDefaultCredentials - Default: false - Use default credentials, when using proxy address. -.PARAMETER SkipNonVersionedFiles - Default: false - Skips installing non-versioned files if they already exist, such as dotnet.exe. -.PARAMETER NoCdn - Disable downloading from the Azure CDN, and use the uncached feed directly. -#> -[cmdletbinding()] -param( - [string]$Channel="LTS", - [string]$Version="Latest", - [string]$InstallDir="", - [string]$Architecture="", - [ValidateSet("dotnet", "aspnetcore", IgnoreCase = $false)] - [string]$Runtime, - [Obsolete("This parameter may be removed in a future version of this script. The recommended alternative is '-Runtime dotnet'.")] - [switch]$SharedRuntime, - [switch]$DryRun, - [switch]$NoPath, - [string]$AzureFeed="https://dotnetcli.azureedge.net/dotnet", - [string]$UncachedFeed="https://dotnetcli.blob.core.windows.net/dotnet", - [string]$FeedCredential, - [string]$ProxyAddress, - [switch]$ProxyUseDefaultCredentials, - [switch]$SkipNonVersionedFiles, - [switch]$NoCdn -) - -Set-StrictMode -Version Latest -$ErrorActionPreference="Stop" -$ProgressPreference="SilentlyContinue" - -if ($NoCdn) { - $AzureFeed = $UncachedFeed -} - -$BinFolderRelativePath="" - -if ($SharedRuntime -and (-not $Runtime)) { - $Runtime = "dotnet" -} - -# example path with regex: shared/1.0.0-beta-12345/somepath -$VersionRegEx="/\d+\.\d+[^/]+/" -$OverrideNonVersionedFiles = !$SkipNonVersionedFiles - -function Say($str) { - Write-Host "dotnet-install: $str" -} - -function Say-Verbose($str) { - Write-Verbose "dotnet-install: $str" -} - -function Say-Invocation($Invocation) { - $command = $Invocation.MyCommand; - $args = (($Invocation.BoundParameters.Keys | foreach { "-$_ `"$($Invocation.BoundParameters[$_])`"" }) -join " ") - Say-Verbose "$command $args" -} - -function Invoke-With-Retry([ScriptBlock]$ScriptBlock, [int]$MaxAttempts = 3, [int]$SecondsBetweenAttempts = 1) { - $Attempts = 0 - - while ($true) { - try { - return $ScriptBlock.Invoke() - } - catch { - $Attempts++ - if ($Attempts -lt $MaxAttempts) { - Start-Sleep $SecondsBetweenAttempts - } - else { - throw - } - } - } -} - -function Get-Machine-Architecture() { - Say-Invocation $MyInvocation - - # possible values: amd64, x64, x86, arm64, arm - return $ENV:PROCESSOR_ARCHITECTURE -} - -function Get-CLIArchitecture-From-Architecture([string]$Architecture) { - Say-Invocation $MyInvocation - - switch ($Architecture.ToLower()) { - { $_ -eq "" } { return Get-CLIArchitecture-From-Architecture $(Get-Machine-Architecture) } - { ($_ -eq "amd64") -or ($_ -eq "x64") } { return "x64" } - { $_ -eq "x86" } { return "x86" } - { $_ -eq "arm" } { return "arm" } - { $_ -eq "arm64" } { return "arm64" } - default { throw "Architecture not supported. If you think this is a bug, report it at https://github.com/dotnet/cli/issues" } - } -} - -# The version text returned from the feeds is a 1-line or 2-line string: -# For the SDK and the dotnet runtime (2 lines): -# Line 1: # commit_hash -# Line 2: # 4-part version -# For the aspnetcore runtime (1 line): -# Line 1: # 4-part version -function Get-Version-Info-From-Version-Text([string]$VersionText) { - Say-Invocation $MyInvocation - - $Data = -split $VersionText - - $VersionInfo = @{ - CommitHash = $(if ($Data.Count -gt 1) { $Data[0] }) - Version = $Data[-1] # last line is always the version number. - } - return $VersionInfo -} - -function Load-Assembly([string] $Assembly) { - try { - Add-Type -Assembly $Assembly | Out-Null - } - catch { - # On Nano Server, Powershell Core Edition is used. Add-Type is unable to resolve base class assemblies because they are not GAC'd. - # Loading the base class assemblies is not unnecessary as the types will automatically get resolved. - } -} - -function GetHTTPResponse([Uri] $Uri) -{ - Invoke-With-Retry( - { - - $HttpClient = $null - - try { - # HttpClient is used vs Invoke-WebRequest in order to support Nano Server which doesn't support the Invoke-WebRequest cmdlet. - Load-Assembly -Assembly System.Net.Http - - if(-not $ProxyAddress) { - try { - # Despite no proxy being explicitly specified, we may still be behind a default proxy - $DefaultProxy = [System.Net.WebRequest]::DefaultWebProxy; - if($DefaultProxy -and (-not $DefaultProxy.IsBypassed($Uri))) { - $ProxyAddress = $DefaultProxy.GetProxy($Uri).OriginalString - $ProxyUseDefaultCredentials = $true - } - } catch { - # Eat the exception and move forward as the above code is an attempt - # at resolving the DefaultProxy that may not have been a problem. - $ProxyAddress = $null - Say-Verbose("Exception ignored: $_.Exception.Message - moving forward...") - } - } - - if($ProxyAddress) { - $HttpClientHandler = New-Object System.Net.Http.HttpClientHandler - $HttpClientHandler.Proxy = New-Object System.Net.WebProxy -Property @{Address=$ProxyAddress;UseDefaultCredentials=$ProxyUseDefaultCredentials} - $HttpClient = New-Object System.Net.Http.HttpClient -ArgumentList $HttpClientHandler - } - else { - - $HttpClient = New-Object System.Net.Http.HttpClient - } - # Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out - # 20 minutes allows it to work over much slower connections. - $HttpClient.Timeout = New-TimeSpan -Minutes 20 - $Response = $HttpClient.GetAsync("${Uri}${FeedCredential}").Result - if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode))) { - # The feed credential is potentially sensitive info. Do not log FeedCredential to console output. - $ErrorMsg = "Failed to download $Uri." - if ($Response -ne $null) { - $ErrorMsg += " $Response" - } - - throw $ErrorMsg - } - - return $Response - } - finally { - if ($HttpClient -ne $null) { - $HttpClient.Dispose() - } - } - }) -} - - -function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel, [bool]$Coherent) { - Say-Invocation $MyInvocation - - $VersionFileUrl = $null - if ($Runtime -eq "dotnet") { - $VersionFileUrl = "$UncachedFeed/Runtime/$Channel/latest.version" - } - elseif ($Runtime -eq "aspnetcore") { - $VersionFileUrl = "$UncachedFeed/aspnetcore/Runtime/$Channel/latest.version" - } - elseif (-not $Runtime) { - if ($Coherent) { - $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.coherent.version" - } - else { - $VersionFileUrl = "$UncachedFeed/Sdk/$Channel/latest.version" - } - } - else { - throw "Invalid value for `$Runtime" - } - try { - $Response = GetHTTPResponse -Uri $VersionFileUrl - } - catch { - throw "Could not resolve version information." - } - $StringContent = $Response.Content.ReadAsStringAsync().Result - - switch ($Response.Content.Headers.ContentType) { - { ($_ -eq "application/octet-stream") } { $VersionText = $StringContent } - { ($_ -eq "text/plain") } { $VersionText = $StringContent } - { ($_ -eq "text/plain; charset=UTF-8") } { $VersionText = $StringContent } - default { throw "``$Response.Content.Headers.ContentType`` is an unknown .version file content type." } - } - - $VersionInfo = Get-Version-Info-From-Version-Text $VersionText - - return $VersionInfo -} - - -function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$Channel, [string]$Version) { - Say-Invocation $MyInvocation - - switch ($Version.ToLower()) { - { $_ -eq "latest" } { - $LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -Channel $Channel -Coherent $False - return $LatestVersionInfo.Version - } - { $_ -eq "coherent" } { - $LatestVersionInfo = Get-Latest-Version-Info -AzureFeed $AzureFeed -Channel $Channel -Coherent $True - return $LatestVersionInfo.Version - } - default { return $Version } - } -} - -function Get-Download-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) { - Say-Invocation $MyInvocation - - if ($Runtime -eq "dotnet") { - $PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-runtime-$SpecificVersion-win-$CLIArchitecture.zip" - } - elseif ($Runtime -eq "aspnetcore") { - $PayloadURL = "$AzureFeed/aspnetcore/Runtime/$SpecificVersion/aspnetcore-runtime-$SpecificVersion-win-$CLIArchitecture.zip" - } - elseif (-not $Runtime) { - $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-sdk-$SpecificVersion-win-$CLIArchitecture.zip" - } - else { - throw "Invalid value for `$Runtime" - } - - Say-Verbose "Constructed primary named payload URL: $PayloadURL" - - return $PayloadURL -} - -function Get-LegacyDownload-Link([string]$AzureFeed, [string]$SpecificVersion, [string]$CLIArchitecture) { - Say-Invocation $MyInvocation - - if (-not $Runtime) { - $PayloadURL = "$AzureFeed/Sdk/$SpecificVersion/dotnet-dev-win-$CLIArchitecture.$SpecificVersion.zip" - } - elseif ($Runtime -eq "dotnet") { - $PayloadURL = "$AzureFeed/Runtime/$SpecificVersion/dotnet-win-$CLIArchitecture.$SpecificVersion.zip" - } - else { - return $null - } - - Say-Verbose "Constructed legacy named payload URL: $PayloadURL" - - return $PayloadURL -} - -function Get-User-Share-Path() { - Say-Invocation $MyInvocation - - $InstallRoot = $env:DOTNET_INSTALL_DIR - if (!$InstallRoot) { - $InstallRoot = "$env:LocalAppData\Microsoft\dotnet" - } - return $InstallRoot -} - -function Resolve-Installation-Path([string]$InstallDir) { - Say-Invocation $MyInvocation - - if ($InstallDir -eq "") { - return Get-User-Share-Path - } - return $InstallDir -} - -function Get-Version-Info-From-Version-File([string]$InstallRoot, [string]$RelativePathToVersionFile) { - Say-Invocation $MyInvocation - - $VersionFile = Join-Path -Path $InstallRoot -ChildPath $RelativePathToVersionFile - Say-Verbose "Local version file: $VersionFile" - - if (Test-Path $VersionFile) { - $VersionText = cat $VersionFile - Say-Verbose "Local version file text: $VersionText" - return Get-Version-Info-From-Version-Text $VersionText - } - - Say-Verbose "Local version file not found." - - return $null -} - -function Is-Dotnet-Package-Installed([string]$InstallRoot, [string]$RelativePathToPackage, [string]$SpecificVersion) { - Say-Invocation $MyInvocation - - $DotnetPackagePath = Join-Path -Path $InstallRoot -ChildPath $RelativePathToPackage | Join-Path -ChildPath $SpecificVersion - Say-Verbose "Is-Dotnet-Package-Installed: Path to a package: $DotnetPackagePath" - return Test-Path $DotnetPackagePath -PathType Container -} - -function Get-Absolute-Path([string]$RelativeOrAbsolutePath) { - # Too much spam - # Say-Invocation $MyInvocation - - return $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($RelativeOrAbsolutePath) -} - -function Get-Path-Prefix-With-Version($path) { - $match = [regex]::match($path, $VersionRegEx) - if ($match.Success) { - return $entry.FullName.Substring(0, $match.Index + $match.Length) - } - - return $null -} - -function Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package([System.IO.Compression.ZipArchive]$Zip, [string]$OutPath) { - Say-Invocation $MyInvocation - - $ret = @() - foreach ($entry in $Zip.Entries) { - $dir = Get-Path-Prefix-With-Version $entry.FullName - if ($dir -ne $null) { - $path = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $dir) - if (-Not (Test-Path $path -PathType Container)) { - $ret += $dir - } - } - } - - $ret = $ret | Sort-Object | Get-Unique - - $values = ($ret | foreach { "$_" }) -join ";" - Say-Verbose "Directories to unpack: $values" - - return $ret -} - -# Example zip content and extraction algorithm: -# Rule: files if extracted are always being extracted to the same relative path locally -# .\ -# a.exe # file does not exist locally, extract -# b.dll # file exists locally, override only if $OverrideFiles set -# aaa\ # same rules as for files -# ... -# abc\1.0.0\ # directory contains version and exists locally -# ... # do not extract content under versioned part -# abc\asd\ # same rules as for files -# ... -# def\ghi\1.0.1\ # directory contains version and does not exist locally -# ... # extract content -function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) { - Say-Invocation $MyInvocation - - Load-Assembly -Assembly System.IO.Compression.FileSystem - Set-Variable -Name Zip - try { - $Zip = [System.IO.Compression.ZipFile]::OpenRead($ZipPath) - - $DirectoriesToUnpack = Get-List-Of-Directories-And-Versions-To-Unpack-From-Dotnet-Package -Zip $Zip -OutPath $OutPath - - foreach ($entry in $Zip.Entries) { - $PathWithVersion = Get-Path-Prefix-With-Version $entry.FullName - if (($PathWithVersion -eq $null) -Or ($DirectoriesToUnpack -contains $PathWithVersion)) { - $DestinationPath = Get-Absolute-Path $(Join-Path -Path $OutPath -ChildPath $entry.FullName) - $DestinationDir = Split-Path -Parent $DestinationPath - $OverrideFiles=$OverrideNonVersionedFiles -Or (-Not (Test-Path $DestinationPath)) - if ((-Not $DestinationPath.EndsWith("\")) -And $OverrideFiles) { - New-Item -ItemType Directory -Force -Path $DestinationDir | Out-Null - [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, $DestinationPath, $OverrideNonVersionedFiles) - } - } - } - } - finally { - if ($Zip -ne $null) { - $Zip.Dispose() - } - } -} - -function DownloadFile($Source, [string]$OutPath) { - if ($Source -notlike "http*") { - # Using System.IO.Path.GetFullPath to get the current directory - # does not work in this context - $pwd gives the current directory - if (![System.IO.Path]::IsPathRooted($Source)) { - $Source = $(Join-Path -Path $pwd -ChildPath $Source) - } - $Source = Get-Absolute-Path $Source - Say "Copying file from $Source to $OutPath" - Copy-Item $Source $OutPath - return - } - - $Stream = $null - - try { - $Response = GetHTTPResponse -Uri $Source - $Stream = $Response.Content.ReadAsStreamAsync().Result - $File = [System.IO.File]::Create($OutPath) - $Stream.CopyTo($File) - $File.Close() - } - finally { - if ($Stream -ne $null) { - $Stream.Dispose() - } - } -} - -function Prepend-Sdk-InstallRoot-To-Path([string]$InstallRoot, [string]$BinFolderRelativePath) { - $BinPath = Get-Absolute-Path $(Join-Path -Path $InstallRoot -ChildPath $BinFolderRelativePath) - if (-Not $NoPath) { - $SuffixedBinPath = "$BinPath;" - if (-Not $env:path.Contains($SuffixedBinPath)) { - Say "Adding to current process PATH: `"$BinPath`". Note: This change will not be visible if PowerShell was run as a child process." - $env:path = $SuffixedBinPath + $env:path - } else { - Say-Verbose "Current process PATH already contains `"$BinPath`"" - } - } - else { - Say "Binaries of dotnet can be found in $BinPath" - } -} - -$CLIArchitecture = Get-CLIArchitecture-From-Architecture $Architecture -$SpecificVersion = Get-Specific-Version-From-Version -AzureFeed $AzureFeed -Channel $Channel -Version $Version -$DownloadLink = Get-Download-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture -$LegacyDownloadLink = Get-LegacyDownload-Link -AzureFeed $AzureFeed -SpecificVersion $SpecificVersion -CLIArchitecture $CLIArchitecture - -$InstallRoot = Resolve-Installation-Path $InstallDir -Say-Verbose "InstallRoot: $InstallRoot" -$ScriptName = $MyInvocation.MyCommand.Name - -if ($DryRun) { - Say "Payload URLs:" - Say "Primary named payload URL: $DownloadLink" - if ($LegacyDownloadLink) { - Say "Legacy named payload URL: $LegacyDownloadLink" - } - $RepeatableCommand = ".\$ScriptName -Version `"$SpecificVersion`" -InstallDir `"$InstallRoot`" -Architecture `"$CLIArchitecture`"" - if ($Runtime -eq "dotnet") { - $RepeatableCommand+=" -Runtime `"dotnet`"" - } - elseif ($Runtime -eq "aspnetcore") { - $RepeatableCommand+=" -Runtime `"aspnetcore`"" - } - foreach ($key in $MyInvocation.BoundParameters.Keys) { - if (-not (@("Architecture","Channel","DryRun","InstallDir","Runtime","SharedRuntime","Version") -contains $key)) { - $RepeatableCommand+=" -$key `"$($MyInvocation.BoundParameters[$key])`"" - } - } - Say "Repeatable invocation: $RepeatableCommand" - exit 0 -} - -if ($Runtime -eq "dotnet") { - $assetName = ".NET Core Runtime" - $dotnetPackageRelativePath = "shared\Microsoft.NETCore.App" -} -elseif ($Runtime -eq "aspnetcore") { - $assetName = "ASP.NET Core Runtime" - $dotnetPackageRelativePath = "shared\Microsoft.AspNetCore.App" -} -elseif (-not $Runtime) { - $assetName = ".NET Core SDK" - $dotnetPackageRelativePath = "sdk" -} -else { - throw "Invalid value for `$Runtime" -} - -# Check if the SDK version is already installed. -$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion -if ($isAssetInstalled) { - Say "$assetName version $SpecificVersion is already installed." - Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath - exit 0 -} - -New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null - -$installDrive = $((Get-Item $InstallRoot).PSDrive.Name); -$diskInfo = Get-PSDrive -Name $installDrive -if ($diskInfo.Free / 1MB -le 100) { - Say "There is not enough disk space on drive ${installDrive}:" - exit 0 -} - -$ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) -Say-Verbose "Zip path: $ZipPath" - -$DownloadFailed = $false -Say "Downloading link: $DownloadLink" -try { - DownloadFile -Source $DownloadLink -OutPath $ZipPath -} -catch { - Say "Cannot download: $DownloadLink" - if ($LegacyDownloadLink) { - $DownloadLink = $LegacyDownloadLink - $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) - Say-Verbose "Legacy zip path: $ZipPath" - Say "Downloading legacy link: $DownloadLink" - try { - DownloadFile -Source $DownloadLink -OutPath $ZipPath - } - catch { - Say "Cannot download: $DownloadLink" - $DownloadFailed = $true - } - } - else { - $DownloadFailed = $true - } -} - -if ($DownloadFailed) { - throw "Could not find/download: `"$assetName`" with version = $SpecificVersion`nRefer to: https://aka.ms/dotnet-os-lifecycle for information on .NET Core support" -} - -Say "Extracting zip from $DownloadLink" -Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot - -# Check if the SDK version is now installed; if not, fail the installation. -$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion -if (!$isAssetInstalled) { - throw "`"$assetName`" with version = $SpecificVersion failed to install with an unknown error." -} - -Remove-Item $ZipPath - -Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath - -Say "Installation finished" -exit 0 diff --git a/_benchmarks/benchmarker/scripts/dotnet-install.sh b/_benchmarks/benchmarker/scripts/dotnet-install.sh deleted file mode 100644 index 2217d47d..00000000 --- a/_benchmarks/benchmarker/scripts/dotnet-install.sh +++ /dev/null @@ -1,1019 +0,0 @@ -#!/usr/bin/env bash -# Copyright (c) .NET Foundation and contributors. All rights reserved. -# Licensed under the MIT license. See LICENSE file in the project root for full license information. -# - -# Stop script on NZEC -set -e -# Stop script if unbound variable found (use ${var:-} if intentional) -set -u -# By default cmd1 | cmd2 returns exit code of cmd2 regardless of cmd1 success -# This is causing it to fail -set -o pipefail - -# Use in the the functions: eval $invocation -invocation='say_verbose "Calling: ${yellow:-}${FUNCNAME[0]} ${green:-}$*${normal:-}"' - -# standard output may be used as a return value in the functions -# we need a way to write text on the screen in the functions so that -# it won't interfere with the return value. -# Exposing stream 3 as a pipe to standard output of the script itself -exec 3>&1 - -# Setup some colors to use. These need to work in fairly limited shells, like the Ubuntu Docker container where there are only 8 colors. -# See if stdout is a terminal -if [ -t 1 ] && command -v tput > /dev/null; then - # see if it supports colors - ncolors=$(tput colors) - if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then - bold="$(tput bold || echo)" - normal="$(tput sgr0 || echo)" - black="$(tput setaf 0 || echo)" - red="$(tput setaf 1 || echo)" - green="$(tput setaf 2 || echo)" - yellow="$(tput setaf 3 || echo)" - blue="$(tput setaf 4 || echo)" - magenta="$(tput setaf 5 || echo)" - cyan="$(tput setaf 6 || echo)" - white="$(tput setaf 7 || echo)" - fi -fi - -say_warning() { - printf "%b\n" "${yellow:-}dotnet_install: Warning: $1${normal:-}" -} - -say_err() { - printf "%b\n" "${red:-}dotnet_install: Error: $1${normal:-}" >&2 -} - -say() { - # using stream 3 (defined in the beginning) to not interfere with stdout of functions - # which may be used as return value - printf "%b\n" "${cyan:-}dotnet-install:${normal:-} $1" >&3 -} - -say_verbose() { - if [ "$verbose" = true ]; then - say "$1" - fi -} - -# This platform list is finite - if the SDK/Runtime has supported Linux distribution-specific assets, -# then and only then should the Linux distribution appear in this list. -# Adding a Linux distribution to this list does not imply distribution-specific support. -get_legacy_os_name_from_platform() { - eval $invocation - - platform="$1" - case "$platform" in - "centos.7") - echo "centos" - return 0 - ;; - "debian.8") - echo "debian" - return 0 - ;; - "debian.9") - echo "debian.9" - return 0 - ;; - "fedora.23") - echo "fedora.23" - return 0 - ;; - "fedora.24") - echo "fedora.24" - return 0 - ;; - "fedora.27") - echo "fedora.27" - return 0 - ;; - "fedora.28") - echo "fedora.28" - return 0 - ;; - "opensuse.13.2") - echo "opensuse.13.2" - return 0 - ;; - "opensuse.42.1") - echo "opensuse.42.1" - return 0 - ;; - "opensuse.42.3") - echo "opensuse.42.3" - return 0 - ;; - "rhel.7"*) - echo "rhel" - return 0 - ;; - "ubuntu.14.04") - echo "ubuntu" - return 0 - ;; - "ubuntu.16.04") - echo "ubuntu.16.04" - return 0 - ;; - "ubuntu.16.10") - echo "ubuntu.16.10" - return 0 - ;; - "ubuntu.18.04") - echo "ubuntu.18.04" - return 0 - ;; - "alpine.3.4.3") - echo "alpine" - return 0 - ;; - esac - return 1 -} - -get_linux_platform_name() { - eval $invocation - - if [ -n "$runtime_id" ]; then - echo "${runtime_id%-*}" - return 0 - else - if [ -e /etc/os-release ]; then - . /etc/os-release - echo "$ID.$VERSION_ID" - return 0 - elif [ -e /etc/redhat-release ]; then - local redhatRelease=$( /dev/null 2>&1 - return $? -} - - -check_min_reqs() { - local hasMinimum=false - if machine_has "curl"; then - hasMinimum=true - elif machine_has "wget"; then - hasMinimum=true - fi - - if [ "$hasMinimum" = "false" ]; then - say_err "curl (recommended) or wget are required to download dotnet. Install missing prerequisite to proceed." - return 1 - fi - return 0 -} - -check_pre_reqs() { - eval $invocation - - if [ "${DOTNET_INSTALL_SKIP_PREREQS:-}" = "1" ]; then - return 0 - fi - - if [ "$(uname)" = "Linux" ]; then - if [ ! -x "$(command -v ldconfig)" ]; then - echo "ldconfig is not in PATH, trying /sbin/ldconfig." - LDCONFIG_COMMAND="/sbin/ldconfig" - else - LDCONFIG_COMMAND="ldconfig" - fi - - local librarypath=${LD_LIBRARY_PATH:-} - LDCONFIG_COMMAND="$LDCONFIG_COMMAND -NXv ${librarypath//:/ }" - - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libunwind)" ] && say_warning "Unable to locate libunwind. Probable prerequisite missing; install libunwind." - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libssl)" ] && say_warning "Unable to locate libssl. Probable prerequisite missing; install libssl." - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libicu)" ] && say_warning "Unable to locate libicu. Probable prerequisite missing; install libicu." - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep -F libcurl.so)" ] && say_warning "Unable to locate libcurl. Probable prerequisite missing; install libcurl." - fi - - return 0 -} - -# args: -# input - $1 -to_lowercase() { - #eval $invocation - - echo "$1" | tr '[:upper:]' '[:lower:]' - return 0 -} - -# args: -# input - $1 -remove_trailing_slash() { - #eval $invocation - - local input="${1:-}" - echo "${input%/}" - return 0 -} - -# args: -# input - $1 -remove_beginning_slash() { - #eval $invocation - - local input="${1:-}" - echo "${input#/}" - return 0 -} - -# args: -# root_path - $1 -# child_path - $2 - this parameter can be empty -combine_paths() { - eval $invocation - - # TODO: Consider making it work with any number of paths. For now: - if [ ! -z "${3:-}" ]; then - say_err "combine_paths: Function takes two parameters." - return 1 - fi - - local root_path="$(remove_trailing_slash "$1")" - local child_path="$(remove_beginning_slash "${2:-}")" - say_verbose "combine_paths: root_path=$root_path" - say_verbose "combine_paths: child_path=$child_path" - echo "$root_path/$child_path" - return 0 -} - -get_machine_architecture() { - eval $invocation - - if command -v uname > /dev/null; then - CPUName=$(uname -m) - case $CPUName in - armv7l) - echo "arm" - return 0 - ;; - aarch64) - echo "arm64" - return 0 - ;; - esac - fi - - # Always default to 'x64' - echo "x64" - return 0 -} - -# args: -# architecture - $1 -get_normalized_architecture_from_architecture() { - eval $invocation - - local architecture="$(to_lowercase "$1")" - case "$architecture" in - \) - echo "$(get_normalized_architecture_from_architecture "$(get_machine_architecture)")" - return 0 - ;; - amd64|x64) - echo "x64" - return 0 - ;; - arm) - echo "arm" - return 0 - ;; - arm64) - echo "arm64" - return 0 - ;; - esac - - say_err "Architecture \`$architecture\` not supported. If you think this is a bug, report it at https://github.com/dotnet/cli/issues" - return 1 -} - -# The version text returned from the feeds is a 1-line or 2-line string: -# For the SDK and the dotnet runtime (2 lines): -# Line 1: # commit_hash -# Line 2: # 4-part version -# For the aspnetcore runtime (1 line): -# Line 1: # 4-part version - -# args: -# version_text - stdin -get_version_from_version_info() { - eval $invocation - - cat | tail -n 1 | sed 's/\r$//' - return 0 -} - -# args: -# install_root - $1 -# relative_path_to_package - $2 -# specific_version - $3 -is_dotnet_package_installed() { - eval $invocation - - local install_root="$1" - local relative_path_to_package="$2" - local specific_version="${3//[$'\t\r\n']}" - - local dotnet_package_path="$(combine_paths "$(combine_paths "$install_root" "$relative_path_to_package")" "$specific_version")" - say_verbose "is_dotnet_package_installed: dotnet_package_path=$dotnet_package_path" - - if [ -d "$dotnet_package_path" ]; then - return 0 - else - return 1 - fi -} - -# args: -# azure_feed - $1 -# channel - $2 -# normalized_architecture - $3 -# coherent - $4 -get_latest_version_info() { - eval $invocation - - local azure_feed="$1" - local channel="$2" - local normalized_architecture="$3" - local coherent="$4" - - local version_file_url=null - if [[ "$runtime" == "dotnet" ]]; then - version_file_url="$uncached_feed/Runtime/$channel/latest.version" - elif [[ "$runtime" == "aspnetcore" ]]; then - version_file_url="$uncached_feed/aspnetcore/Runtime/$channel/latest.version" - elif [ -z "$runtime" ]; then - if [ "$coherent" = true ]; then - version_file_url="$uncached_feed/Sdk/$channel/latest.coherent.version" - else - version_file_url="$uncached_feed/Sdk/$channel/latest.version" - fi - else - say_err "Invalid value for \$runtime" - return 1 - fi - say_verbose "get_latest_version_info: latest url: $version_file_url" - - download "$version_file_url" - return $? -} - -# args: -# azure_feed - $1 -# channel - $2 -# normalized_architecture - $3 -# version - $4 -get_specific_version_from_version() { - eval $invocation - - local azure_feed="$1" - local channel="$2" - local normalized_architecture="$3" - local version="$(to_lowercase "$4")" - - case "$version" in - latest) - local version_info - version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" false)" || return 1 - say_verbose "get_specific_version_from_version: version_info=$version_info" - echo "$version_info" | get_version_from_version_info - return 0 - ;; - coherent) - local version_info - version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" true)" || return 1 - say_verbose "get_specific_version_from_version: version_info=$version_info" - echo "$version_info" | get_version_from_version_info - return 0 - ;; - *) - echo "$version" - return 0 - ;; - esac -} - -# args: -# azure_feed - $1 -# channel - $2 -# normalized_architecture - $3 -# specific_version - $4 -construct_download_link() { - eval $invocation - - local azure_feed="$1" - local channel="$2" - local normalized_architecture="$3" - local specific_version="${4//[$'\t\r\n']}" - - local osname - osname="$(get_current_os_name)" || return 1 - - local download_link=null - if [[ "$runtime" == "dotnet" ]]; then - download_link="$azure_feed/Runtime/$specific_version/dotnet-runtime-$specific_version-$osname-$normalized_architecture.tar.gz" - elif [[ "$runtime" == "aspnetcore" ]]; then - download_link="$azure_feed/aspnetcore/Runtime/$specific_version/aspnetcore-runtime-$specific_version-$osname-$normalized_architecture.tar.gz" - elif [ -z "$runtime" ]; then - download_link="$azure_feed/Sdk/$specific_version/dotnet-sdk-$specific_version-$osname-$normalized_architecture.tar.gz" - else - return 1 - fi - - echo "$download_link" - return 0 -} - -# args: -# azure_feed - $1 -# channel - $2 -# normalized_architecture - $3 -# specific_version - $4 -construct_legacy_download_link() { - eval $invocation - - local azure_feed="$1" - local channel="$2" - local normalized_architecture="$3" - local specific_version="${4//[$'\t\r\n']}" - - local distro_specific_osname - distro_specific_osname="$(get_legacy_os_name)" || return 1 - - local legacy_download_link=null - if [[ "$runtime" == "dotnet" ]]; then - legacy_download_link="$azure_feed/Runtime/$specific_version/dotnet-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz" - elif [ -z "$runtime" ]; then - legacy_download_link="$azure_feed/Sdk/$specific_version/dotnet-dev-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz" - else - return 1 - fi - - echo "$legacy_download_link" - return 0 -} - -get_user_install_path() { - eval $invocation - - if [ ! -z "${DOTNET_INSTALL_DIR:-}" ]; then - echo "$DOTNET_INSTALL_DIR" - else - echo "$HOME/.dotnet" - fi - return 0 -} - -# args: -# install_dir - $1 -resolve_installation_path() { - eval $invocation - - local install_dir=$1 - if [ "$install_dir" = "" ]; then - local user_install_path="$(get_user_install_path)" - say_verbose "resolve_installation_path: user_install_path=$user_install_path" - echo "$user_install_path" - return 0 - fi - - echo "$install_dir" - return 0 -} - -# args: -# install_root - $1 -get_installed_version_info() { - eval $invocation - - local install_root="$1" - local version_file="$(combine_paths "$install_root" "$local_version_file_relative_path")" - say_verbose "Local version file: $version_file" - if [ ! -z "$version_file" ] | [ -r "$version_file" ]; then - local version_info="$(cat "$version_file")" - echo "$version_info" - return 0 - fi - - say_verbose "Local version file not found." - return 0 -} - -# args: -# relative_or_absolute_path - $1 -get_absolute_path() { - eval $invocation - - local relative_or_absolute_path=$1 - echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")" - return 0 -} - -# args: -# input_files - stdin -# root_path - $1 -# out_path - $2 -# override - $3 -copy_files_or_dirs_from_list() { - eval $invocation - - local root_path="$(remove_trailing_slash "$1")" - local out_path="$(remove_trailing_slash "$2")" - local override="$3" - local osname="$(get_current_os_name)" - local override_switch=$( - if [ "$override" = false ]; then - if [[ "$osname" == "linux-musl" ]]; then - printf -- "-u"; - else - printf -- "-n"; - fi - fi) - - cat | uniq | while read -r file_path; do - local path="$(remove_beginning_slash "${file_path#$root_path}")" - local target="$out_path/$path" - if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then - mkdir -p "$out_path/$(dirname "$path")" - cp -R $override_switch "$root_path/$path" "$target" - fi - done -} - -# args: -# zip_path - $1 -# out_path - $2 -extract_dotnet_package() { - eval $invocation - - local zip_path="$1" - local out_path="$2" - - local temp_out_path="$(mktemp -d "$temporary_file_template")" - - local failed=false - tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true - - local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/' - find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false - find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files" - - rm -rf "$temp_out_path" - - if [ "$failed" = true ]; then - say_err "Extraction failed" - return 1 - fi -} - -# args: -# remote_path - $1 -# [out_path] - $2 - stdout if not provided -download() { - eval $invocation - - local remote_path="$1" - local out_path="${2:-}" - - if [[ "$remote_path" != "http"* ]]; then - cp "$remote_path" "$out_path" - return $? - fi - - local failed=false - if machine_has "curl"; then - downloadcurl "$remote_path" "$out_path" || failed=true - elif machine_has "wget"; then - downloadwget "$remote_path" "$out_path" || failed=true - else - failed=true - fi - if [ "$failed" = true ]; then - say_verbose "Download failed: $remote_path" - return 1 - fi - return 0 -} - -downloadcurl() { - eval $invocation - local remote_path="$1" - local out_path="${2:-}" - - # Append feed_credential as late as possible before calling curl to avoid logging feed_credential - remote_path="${remote_path}${feed_credential}" - - local failed=false - if [ -z "$out_path" ]; then - curl --retry 10 -sSL -f --create-dirs "$remote_path" || failed=true - else - curl --retry 10 -sSL -f --create-dirs -o "$out_path" "$remote_path" || failed=true - fi - if [ "$failed" = true ]; then - say_verbose "Curl download failed" - return 1 - fi - return 0 -} - -downloadwget() { - eval $invocation - local remote_path="$1" - local out_path="${2:-}" - - # Append feed_credential as late as possible before calling wget to avoid logging feed_credential - remote_path="${remote_path}${feed_credential}" - - local failed=false - if [ -z "$out_path" ]; then - wget -q --tries 10 -O - "$remote_path" || failed=true - else - wget --tries 10 -O "$out_path" "$remote_path" || failed=true - fi - if [ "$failed" = true ]; then - say_verbose "Wget download failed" - return 1 - fi - return 0 -} - -calculate_vars() { - eval $invocation - valid_legacy_download_link=true - - normalized_architecture="$(get_normalized_architecture_from_architecture "$architecture")" - say_verbose "normalized_architecture=$normalized_architecture" - - specific_version="$(get_specific_version_from_version "$azure_feed" "$channel" "$normalized_architecture" "$version")" - say_verbose "specific_version=$specific_version" - if [ -z "$specific_version" ]; then - say_err "Could not resolve version information." - return 1 - fi - - download_link="$(construct_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")" - say_verbose "Constructed primary named payload URL: $download_link" - - legacy_download_link="$(construct_legacy_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")" || valid_legacy_download_link=false - - if [ "$valid_legacy_download_link" = true ]; then - say_verbose "Constructed legacy named payload URL: $legacy_download_link" - else - say_verbose "Cound not construct a legacy_download_link; omitting..." - fi - - install_root="$(resolve_installation_path "$install_dir")" - say_verbose "InstallRoot: $install_root" -} - -install_dotnet() { - eval $invocation - local download_failed=false - local asset_name='' - local asset_relative_path='' - - if [[ "$runtime" == "dotnet" ]]; then - asset_relative_path="shared/Microsoft.NETCore.App" - asset_name=".NET Core Runtime" - elif [[ "$runtime" == "aspnetcore" ]]; then - asset_relative_path="shared/Microsoft.AspNetCore.App" - asset_name="ASP.NET Core Runtime" - elif [ -z "$runtime" ]; then - asset_relative_path="sdk" - asset_name=".NET Core SDK" - else - say_err "Invalid value for \$runtime" - return 1 - fi - - # Check if the SDK version is already installed. - if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then - say "$asset_name version $specific_version is already installed." - return 0 - fi - - mkdir -p "$install_root" - zip_path="$(mktemp "$temporary_file_template")" - say_verbose "Zip path: $zip_path" - - say "Downloading link: $download_link" - - # Failures are normal in the non-legacy case for ultimately legacy downloads. - # Do not output to stderr, since output to stderr is considered an error. - download "$download_link" "$zip_path" 2>&1 || download_failed=true - - # if the download fails, download the legacy_download_link - if [ "$download_failed" = true ]; then - say "Cannot download: $download_link" - - if [ "$valid_legacy_download_link" = true ]; then - download_failed=false - download_link="$legacy_download_link" - zip_path="$(mktemp "$temporary_file_template")" - say_verbose "Legacy zip path: $zip_path" - say "Downloading legacy link: $download_link" - download "$download_link" "$zip_path" 2>&1 || download_failed=true - - if [ "$download_failed" = true ]; then - say "Cannot download: $download_link" - fi - fi - fi - - if [ "$download_failed" = true ]; then - say_err "Could not find/download: \`$asset_name\` with version = $specific_version" - say_err "Refer to: https://aka.ms/dotnet-os-lifecycle for information on .NET Core support" - return 1 - fi - - say "Extracting zip from $download_link" - extract_dotnet_package "$zip_path" "$install_root" - - # Check if the SDK version is now installed; if not, fail the installation. - if ! is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then - say_err "\`$asset_name\` with version = $specific_version failed to install with an unknown error." - return 1 - fi - - return 0 -} - -args=("$@") - -local_version_file_relative_path="/.version" -bin_folder_relative_path="" -temporary_file_template="${TMPDIR:-/tmp}/dotnet.XXXXXXXXX" - -channel="LTS" -version="Latest" -install_dir="" -architecture="" -dry_run=false -no_path=false -no_cdn=false -azure_feed="https://dotnetcli.azureedge.net/dotnet" -uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet" -feed_credential="" -verbose=false -runtime="" -runtime_id="" -override_non_versioned_files=true -non_dynamic_parameters="" - -while [ $# -ne 0 ] -do - name="$1" - case "$name" in - -c|--channel|-[Cc]hannel) - shift - channel="$1" - ;; - -v|--version|-[Vv]ersion) - shift - version="$1" - ;; - -i|--install-dir|-[Ii]nstall[Dd]ir) - shift - install_dir="$1" - ;; - --arch|--architecture|-[Aa]rch|-[Aa]rchitecture) - shift - architecture="$1" - ;; - --shared-runtime|-[Ss]hared[Rr]untime) - say_warning "The --shared-runtime flag is obsolete and may be removed in a future version of this script. The recommended usage is to specify '--runtime dotnet'." - if [ -z "$runtime" ]; then - runtime="dotnet" - fi - ;; - --runtime|-[Rr]untime) - shift - runtime="$1" - if [[ "$runtime" != "dotnet" ]] && [[ "$runtime" != "aspnetcore" ]]; then - say_err "Unsupported value for --runtime: '$1'. Valid values are 'dotnet' and 'aspnetcore'." - exit 1 - fi - ;; - --dry-run|-[Dd]ry[Rr]un) - dry_run=true - ;; - --no-path|-[Nn]o[Pp]ath) - no_path=true - non_dynamic_parameters+=" $name" - ;; - --verbose|-[Vv]erbose) - verbose=true - non_dynamic_parameters+=" $name" - ;; - --no-cdn|-[Nn]o[Cc]dn) - no_cdn=true - non_dynamic_parameters+=" $name" - ;; - --azure-feed|-[Aa]zure[Ff]eed) - shift - azure_feed="$1" - non_dynamic_parameters+=" $name "\""$1"\""" - ;; - --uncached-feed|-[Uu]ncached[Ff]eed) - shift - uncached_feed="$1" - non_dynamic_parameters+=" $name "\""$1"\""" - ;; - --feed-credential|-[Ff]eed[Cc]redential) - shift - feed_credential="$1" - non_dynamic_parameters+=" $name "\""$1"\""" - ;; - --runtime-id|-[Rr]untime[Ii]d) - shift - runtime_id="$1" - non_dynamic_parameters+=" $name "\""$1"\""" - ;; - --skip-non-versioned-files|-[Ss]kip[Nn]on[Vv]ersioned[Ff]iles) - override_non_versioned_files=false - non_dynamic_parameters+=" $name" - ;; - -?|--?|-h|--help|-[Hh]elp) - script_name="$(basename "$0")" - echo ".NET Tools Installer" - echo "Usage: $script_name [-c|--channel ] [-v|--version ] [-p|--prefix ]" - echo " $script_name -h|-?|--help" - echo "" - echo "$script_name is a simple command line interface for obtaining dotnet cli." - echo "" - echo "Options:" - echo " -c,--channel Download from the channel specified, Defaults to \`$channel\`." - echo " -Channel" - echo " Possible values:" - echo " - Current - most current release" - echo " - LTS - most current supported release" - echo " - 2-part version in a format A.B - represents a specific release" - echo " examples: 2.0; 1.0" - echo " - Branch name" - echo " examples: release/2.0.0; Master" - echo " Note: The version parameter overrides the channel parameter." - echo " -v,--version Use specific VERSION, Defaults to \`$version\`." - echo " -Version" - echo " Possible values:" - echo " - latest - most latest build on specific channel" - echo " - coherent - most latest coherent build on specific channel" - echo " coherent applies only to SDK downloads" - echo " - 3-part version in a format A.B.C - represents specific version of build" - echo " examples: 2.0.0-preview2-006120; 1.1.0" - echo " -i,--install-dir Install under specified location (see Install Location below)" - echo " -InstallDir" - echo " --architecture Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." - echo " --arch,-Architecture,-Arch" - echo " Possible values: x64, arm, and arm64" - echo " --runtime Installs a shared runtime only, without the SDK." - echo " -Runtime" - echo " Possible values:" - echo " - dotnet - the Microsoft.NETCore.App shared runtime" - echo " - aspnetcore - the Microsoft.AspNetCore.App shared runtime" - echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable." - echo " -SkipNonVersionedFiles" - echo " --dry-run,-DryRun Do not perform installation. Display download link." - echo " --no-path, -NoPath Do not set PATH for the current process." - echo " --verbose,-Verbose Display diagnostics information." - echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user." - echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user." - echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and use the uncached feed directly." - echo " --feed-credential,-FeedCredential Azure feed shared access token. This parameter typically is not specified." - echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)." - echo " -RuntimeId" - echo " -?,--?,-h,--help,-Help Shows this help message" - echo "" - echo "Obsolete parameters:" - echo " --shared-runtime The recommended alternative is '--runtime dotnet'." - echo " -SharedRuntime Installs just the shared runtime bits, not the entire SDK." - echo "" - echo "Install Location:" - echo " Location is chosen in following order:" - echo " - --install-dir option" - echo " - Environmental variable DOTNET_INSTALL_DIR" - echo " - $HOME/.dotnet" - exit 0 - ;; - *) - say_err "Unknown argument \`$name\`" - exit 1 - ;; - esac - - shift -done - -if [ "$no_cdn" = true ]; then - azure_feed="$uncached_feed" -fi - -check_min_reqs -calculate_vars -script_name=$(basename "$0") - -if [ "$dry_run" = true ]; then - say "Payload URLs:" - say "Primary named payload URL: $download_link" - if [ "$valid_legacy_download_link" = true ]; then - say "Legacy named payload URL: $legacy_download_link" - fi - repeatable_command="./$script_name --version "\""$specific_version"\"" --install-dir "\""$install_root"\"" --architecture "\""$normalized_architecture"\""" - if [[ "$runtime" == "dotnet" ]]; then - repeatable_command+=" --runtime "\""dotnet"\""" - elif [[ "$runtime" == "aspnetcore" ]]; then - repeatable_command+=" --runtime "\""aspnetcore"\""" - fi - repeatable_command+="$non_dynamic_parameters" - say "Repeatable invocation: $repeatable_command" - exit 0 -fi - -check_pre_reqs -install_dotnet - -bin_path="$(get_absolute_path "$(combine_paths "$install_root" "$bin_folder_relative_path")")" -if [ "$no_path" = false ]; then - say "Adding to current process PATH: \`$bin_path\`. Note: This change will be visible only when sourcing script." - export PATH="$bin_path":"$PATH" -else - say "Binaries of dotnet can be found in $bin_path" -fi - -say "Installation finished successfully." diff --git a/_benchmarks/benchmarker/scripts/git-install.ps1 b/_benchmarks/benchmarker/scripts/git-install.ps1 deleted file mode 100644 index a5d83de5..00000000 --- a/_benchmarks/benchmarker/scripts/git-install.ps1 +++ /dev/null @@ -1,40 +0,0 @@ -# borrowed: https://github.com/PowerShell/vscode-powershell/blob/develop/scripts/Install-VSCode.ps1 -# edited to support a custom install directory and fix an issue with ssl and -# simplify the script - we don't need update only a temp installation. - -param([string]$InstallDir="$env:TEMP") - -If(!(test-path $InstallDir)) -{ - New-Item -ItemType Directory -Force -Path $InstallDir -} - -$filename=-join($InstallDir, "\", "git-installer.exe") - -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - -foreach ($asset in (Invoke-RestMethod https://api.github.com/repos/git-for-windows/git/releases/latest).assets) { - if ($asset.name -match 'Git-\d*\.\d*\.\d*-64-bit\.exe') { - $dlurl = $asset.browser_download_url - $newver = $asset.name - } -} - -try { - $ProgressPreference = 'SilentlyContinue' - Write-Host "`nDownloading latest stable git..." -ForegroundColor Yellow - Remove-Item -Force $filename -ErrorAction SilentlyContinue - Invoke-WebRequest -Uri $dlurl -OutFile $filename - - Write-Host "`nInstalling git..." -ForegroundColor Yellow - Start-Process -Wait $filename -ArgumentList /VERYSILENT, /DIR="$InstallDir", \FORCECLOSEAPPLICATIONS - # or SILENT - - Write-Host "`nInstallation complete!`n`n" -ForegroundColor Green -} -finally { - $ProgressPreference = 'Continue' -} - -$s = get-process ssh-agent -ErrorAction SilentlyContinue -if ($s) {$true} \ No newline at end of file diff --git a/_benchmarks/benchmarker/scripts/node-install.ps1 b/_benchmarks/benchmarker/scripts/node-install.ps1 deleted file mode 100644 index dc6124fd..00000000 --- a/_benchmarks/benchmarker/scripts/node-install.ps1 +++ /dev/null @@ -1,51 +0,0 @@ -[cmdletbinding()] -$Install_Dir=$args[0] -$VERSION=$args[1] - -$Install_Dir=[System.IO.Path]::GetFullPath($Install_Dir) - -If(!(test-path $Install_Dir)) -{ - New-Item -ItemType Directory -Force -Path $Install_Dir -} - -function Say($str) { - Write-Host "node-install: $str" -} - -$url = "https://nodejs.org/dist/v$VERSION/node-v$VERSION-x64.msi" - -# i.e https://nodejs.org/dist/v10.16.0/node-v10.16.0-x64.msi -# Say "----------------------------" -# Say " downloading node " -# Say "----------------------------" -# Say "url : $url" - -$filename = "node.msi" -$node_msi = "$Install_Dir\$filename" -$start_time = Get-Date -$wc = New-Object System.Net.WebClient -$wc.DownloadFile($url, $node_msi) -# Say "Download of $filename finished at: $((Get-Date).Subtract($start_time).Seconds) second(s)" - -# Say "---------------------------" -# Say " installing node " -# Say "---------------------------" - -# Say $node_msi - -# $Install_Dir = $Install_Dir.replace("\","/") - -# Say "installation directory: $Install_Dir" - -# $params = '/i', "$node_msi", -# 'INSTALLDIR="$Install_Dir"', -# '/qn', -# '/norestart' -# # '/log $Install_Dir\install.log' - -# $p = Start-Process 'msiexec.exe' -ArgumentList $params -PassThru -Wait - -# Start-Process 'msiexec.exe' -ArgumentList '/i', "$node_msi", "INSTALLDIR=$Install_Dir", '/norestart' -Wait -PassThru - -Start-Process -Wait 'msiexec.exe' -ArgumentList '/i', $node_msi, "INSTALLDIR=$Install_Dir", '/passive' \ No newline at end of file diff --git a/_benchmarks/benchmarker/scripts/node-install.sh b/_benchmarks/benchmarker/scripts/node-install.sh deleted file mode 100644 index 7ad75cd1..00000000 --- a/_benchmarks/benchmarker/scripts/node-install.sh +++ /dev/null @@ -1,7 +0,0 @@ -INSTALL_DIR=$1 -VERSION=$2 -cd $INSTALL_DIR -curl http://nodejs.org/dist/node-$VERSION.tar.gz | tar xz --strip-components=1 -./configure --prefix=$INSTALL_DIR -make install -curl https://www.npmjs.org/install.sh | sh \ No newline at end of file diff --git a/_examples/experimental-handlers/casbin/middleware/main_test.go b/_examples/experimental-handlers/casbin/middleware/main_test.go index 275f2955..6a48b27d 100644 --- a/_examples/experimental-handlers/casbin/middleware/main_test.go +++ b/_examples/experimental-handlers/casbin/middleware/main_test.go @@ -3,7 +3,7 @@ package main import ( "testing" - "github.com/iris-contrib/httpexpect" + "github.com/gavv/httpexpect" "github.com/kataras/iris/httptest" ) diff --git a/_examples/experimental-handlers/casbin/wrapper/main_test.go b/_examples/experimental-handlers/casbin/wrapper/main_test.go index 152a8108..7820b06c 100644 --- a/_examples/experimental-handlers/casbin/wrapper/main_test.go +++ b/_examples/experimental-handlers/casbin/wrapper/main_test.go @@ -3,7 +3,7 @@ package main import ( "testing" - "github.com/iris-contrib/httpexpect" + "github.com/gavv/httpexpect" "github.com/kataras/iris/httptest" ) diff --git a/_examples/experimental-handlers/prometheus/simple/main.go b/_examples/experimental-handlers/prometheus/simple/main.go index ff624b14..48b2e671 100644 --- a/_examples/experimental-handlers/prometheus/simple/main.go +++ b/_examples/experimental-handlers/prometheus/simple/main.go @@ -8,7 +8,7 @@ import ( prometheusMiddleware "github.com/iris-contrib/middleware/prometheus" - "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" ) func main() { @@ -31,7 +31,7 @@ func main() { ctx.Writef("Slept for %d milliseconds", sleep) }) - app.Get("/metrics", iris.FromStd(prometheus.Handler())) + app.Get("/metrics", iris.FromStd(promhttp.Handler())) // http://localhost:8080/ // http://localhost:8080/anotfound diff --git a/_examples/file-server/embedding-gziped-files-into-app/main_test.go b/_examples/file-server/embedding-gziped-files-into-app/main_test.go index 4518bfdf..79075861 100644 --- a/_examples/file-server/embedding-gziped-files-into-app/main_test.go +++ b/_examples/file-server/embedding-gziped-files-into-app/main_test.go @@ -89,9 +89,10 @@ func TestEmbeddingGzipFilesIntoApp(t *testing.T) { if expected, got := response.Raw().StatusCode, httptest.StatusOK; expected != got { t.Fatalf("[%d] of '%s': expected %d status code but got %d", i, url, expected, got) } + rawBody := response.Body().Raw() func() { - reader, err := gzip.NewReader(bytes.NewBuffer(response.Content)) + reader, err := gzip.NewReader(strings.NewReader(rawBody)) defer reader.Close() if err != nil { t.Fatalf("[%d] of '%s': %v", i, url, err) diff --git a/_examples/http-listening/http3-quic/go.mod b/_examples/http-listening/http3-quic/go.mod new file mode 100644 index 00000000..608b8a3c --- /dev/null +++ b/_examples/http-listening/http3-quic/go.mod @@ -0,0 +1,7 @@ +module github.com/kataras/iris/_examples/http-listening/http3-quic + +go 1.12 + +require ( + github.com/prometheus/client_golang v1.0.0 +) diff --git a/_examples/http-listening/http3-quic/main.go b/_examples/http-listening/http3-quic/main.go index 4c69c887..e7e03f5f 100644 --- a/_examples/http-listening/http3-quic/main.go +++ b/_examples/http-listening/http3-quic/main.go @@ -8,7 +8,10 @@ import ( /* $ go get -u github.com/lucas-clemente/quic-go/... + # or if you're using GO MODULES: + $ go get github.com/lucas-clemente/quic-go@master */ + func main() { app := iris.New() diff --git a/cache/cache_test.go b/cache/cache_test.go index 07f30311..0d731e41 100644 --- a/cache/cache_test.go +++ b/cache/cache_test.go @@ -14,7 +14,7 @@ import ( "github.com/kataras/iris/context" "github.com/kataras/iris/core/errors" - "github.com/iris-contrib/httpexpect" + "github.com/gavv/httpexpect" "github.com/kataras/iris/httptest" ) diff --git a/core/host/supervisor_test.go b/core/host/supervisor_test.go index 47b26648..3f2dcbdd 100644 --- a/core/host/supervisor_test.go +++ b/core/host/supervisor_test.go @@ -12,7 +12,7 @@ import ( "strings" "testing" - "github.com/iris-contrib/httpexpect" + "github.com/gavv/httpexpect" ) const ( diff --git a/core/router/deprecated.go b/core/router/deprecated.go index a6e7603d..3dd4819f 100644 --- a/core/router/deprecated.go +++ b/core/router/deprecated.go @@ -1,6 +1,8 @@ package router import ( + "os" + "path/filepath" "runtime" "strings" @@ -18,23 +20,21 @@ func getCaller() (string, int) { var pcs [32]uintptr n := runtime.Callers(1, pcs[:]) frames := runtime.CallersFrames(pcs[:n]) - + wd, _ := os.Getwd() for { frame, more := frames.Next() file := frame.File - splitAfterPart := "/src/" - if (!strings.Contains(file, "github.com/kataras/iris") || - strings.Contains(file, "github.com/kataras/iris/_examples") || - strings.Contains(file, "github.com/iris-contrib/examples") || - (strings.Contains(file, "github.com/kataras/iris/core/router") && !strings.Contains(file, "deprecated.go"))) && + if (!strings.Contains(file, "/kataras/iris") || + strings.Contains(file, "/kataras/iris/_examples") || + strings.Contains(file, "/iris-contrib/examples") || + (strings.Contains(file, "/kataras/iris/core/router") && !strings.Contains(file, "deprecated.go"))) && !strings.HasSuffix(frame.Func.Name(), ".getCaller") && !strings.Contains(file, "/go/src/testing") { - // remove the $GOPATH. - n := strings.Index(file, splitAfterPart) - if n != -1 { - file = file[n+len(splitAfterPart):] + if relFile, err := filepath.Rel(wd, file); err == nil { + file = "./" + relFile } + return file, frame.Line } diff --git a/core/router/deprecated_example_test.go b/core/router/deprecated_example_test.go index 9ff5c553..cfad42a2 100644 --- a/core/router/deprecated_example_test.go +++ b/core/router/deprecated_example_test.go @@ -15,7 +15,7 @@ func ExampleParty_StaticWeb() { fmt.Print(err) // Output: StaticWeb is DEPRECATED and it will be removed eventually. - // Source: github.com/kataras/iris/core/router/deprecated_example_test.go:9 + // Source: ./deprecated_example_test.go:9 // Use .HandleDir("/static", "./assets") instead. } @@ -30,7 +30,7 @@ func ExampleParty_StaticHandler() { fmt.Print(err) // Output: StaticHandler is DEPRECATED and it will be removed eventually. - // Source: github.com/kataras/iris/core/router/deprecated_example_test.go:24 + // Source: ./deprecated_example_test.go:24 // Use iris.FileServer("./assets", iris.DirOptions{ShowList: false, Gzip: true}) instead. } @@ -46,7 +46,7 @@ func ExampleParty_StaticEmbedded() { fmt.Print(err) // Output: StaticEmbedded is DEPRECATED and it will be removed eventually. // It is also miss the AssetInfo bindata function, which is required now. - // Source: github.com/kataras/iris/core/router/deprecated_example_test.go:39 + // Source: ./deprecated_example_test.go:39 // Use .HandleDir("/static", "./assets", iris.DirOptions{Asset: Asset, AssetInfo: AssetInfo, AssetNames: AssetNames}) instead. } @@ -62,6 +62,6 @@ func ExampleParty_StaticEmbeddedGzip() { fmt.Print(err) // Output: StaticEmbeddedGzip is DEPRECATED and it will be removed eventually. // It is also miss the AssetInfo bindata function, which is required now. - // Source: github.com/kataras/iris/core/router/deprecated_example_test.go:55 + // Source: ./deprecated_example_test.go:55 // Use .HandleDir("/static", "./assets", iris.DirOptions{Gzip: true, Asset: Asset, AssetInfo: AssetInfo, AssetNames: AssetNames}) instead. } diff --git a/go.mod b/go.mod index 1f8b3c77..04c7b57f 100644 --- a/go.mod +++ b/go.mod @@ -3,27 +3,27 @@ module github.com/kataras/iris go 1.12 require ( + github.com/hashicorp/go-version v1.2.0 // indirect github.com/BurntSushi/toml v0.3.1 - github.com/Joker/jade v1.0.0 github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 - github.com/aymerick/raymond v2.0.2+incompatible - github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 github.com/fatih/structs v1.1.0 - github.com/flosch/pongo2 v0.0.0-20190505152737-8914e1cf9164 // vendor removed. github.com/iris-contrib/blackfriday v2.0.0+incompatible github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1 github.com/iris-contrib/go.uuid v2.0.0+incompatible - github.com/json-iterator/go v1.1.6 // vendor removed. - github.com/kataras/golog v0.0.0-20180321173939-03be10146386 + github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0 + github.com/json-iterator/go v1.1.6 github.com/kataras/neffos v0.0.7 github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect github.com/microcosm-cc/bluemonday v1.0.2 github.com/ryanuber/columnize v2.1.0+incompatible - github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5 - golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect - golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed // indirect - golang.org/x/text v0.3.2 // indirect - golang.org/x/tools v0.0.0-20190602112858-2de7f9bf822c // indirect - gopkg.in/yaml.v2 v2.2.2 + github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 + github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 // indirect + github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40 + github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4 + github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible // indirect + github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible + github.com/mediocregopher/radix/v3 v3.3.0 + github.com/etcd-io/bbolt v1.3.3 // indirect + github.com/dgraph-io/badger v1.6.0 // indirect + github.com/gavv/httpexpect v2.0.0+incompatible ) diff --git a/httptest/httptest.go b/httptest/httptest.go index 0994aa02..2d349521 100644 --- a/httptest/httptest.go +++ b/httptest/httptest.go @@ -7,7 +7,7 @@ import ( "github.com/kataras/iris" - "github.com/iris-contrib/httpexpect" + "github.com/gavv/httpexpect" ) type ( diff --git a/sessions/sessiondb/badger/database.go b/sessions/sessiondb/badger/database.go index 5c990e06..ca4b1ac8 100644 --- a/sessions/sessiondb/badger/database.go +++ b/sessions/sessiondb/badger/database.go @@ -14,6 +14,13 @@ import ( "github.com/kataras/golog" ) +/* + Badger has been updated to 1.6.0 - 2019-07-01 + which contains a lot of breaking changes + that are adapted correctly here. + 2019-07-14 +*/ + // DefaultFileMode used as the default database's "fileMode" // for creating the sessions directory path, opening and write the session file. var ( @@ -52,9 +59,7 @@ func New(directoryPath string) (*Database, error) { return nil, err } - opts := badger.DefaultOptions - opts.Dir = directoryPath - opts.ValueDir = directoryPath + opts := badger.DefaultOptions(directoryPath) service, err := badger.Open(opts) @@ -78,7 +83,7 @@ func NewFromDB(service *badger.DB) *Database { // if the return value is LifeTime{} then the session manager sets the life time based on the expiration duration lives in configuration. func (db *Database) Acquire(sid string, expires time.Duration) sessions.LifeTime { txn := db.Service.NewTransaction(true) - defer txn.Commit(nil) + defer txn.Commit() bsid := makePrefix(sid) item, err := txn.Get(bsid) @@ -91,7 +96,8 @@ func (db *Database) Acquire(sid string, expires time.Duration) sessions.LifeTime if err != nil { if err == badger.ErrKeyNotFound { // create it and set the expiration, we don't care about the value there. - err = txn.SetWithTTL(bsid, bsid, expires) + err = txn.SetEntry(badger.NewEntry(bsid, bsid).WithTTL(expires)) + } } @@ -129,7 +135,7 @@ func (db *Database) Set(sid string, lifetime sessions.LifeTime, key string, valu err = db.Service.Update(func(txn *badger.Txn) error { dur := lifetime.DurationUntilExpiration() - return txn.SetWithTTL(makeKey(sid, key), valueBytes, dur) + return txn.SetEntry(badger.NewEntry(makeKey(sid, key), valueBytes).WithTTL(dur)) }) if err != nil { @@ -145,18 +151,9 @@ func (db *Database) Get(sid string, key string) (value interface{}) { return err } - // return item.Value(func(valueBytes []byte) { - // if err := sessions.DefaultTranscoder.Unmarshal(valueBytes, &value); err != nil { - // golog.Error(err) - // } - // }) - - valueBytes, err := item.Value() - if err != nil { - return err - } - - return sessions.DefaultTranscoder.Unmarshal(valueBytes, &value) + return item.Value(func(valueBytes []byte) error { + return sessions.DefaultTranscoder.Unmarshal(valueBytes, &value) + }) }) if err != nil && err != badger.ErrKeyNotFound { @@ -192,13 +189,11 @@ func (db *Database) Visit(sid string, cb func(key string, value interface{})) { // continue // } - valueBytes, err := item.Value() - if err != nil { - golog.Error(err) - continue - } + err := item.Value(func(valueBytes []byte) error { + return sessions.DefaultTranscoder.Unmarshal(valueBytes, &value) + }) - if err = sessions.DefaultTranscoder.Unmarshal(valueBytes, &value); err != nil { + if err != nil { golog.Error(err) continue } @@ -236,9 +231,9 @@ func (db *Database) Delete(sid string, key string) (deleted bool) { err := txn.Delete(makeKey(sid, key)) if err != nil { golog.Error(err) + return false } - txn.Commit(nil) - return err == nil + return txn.Commit() == nil } // Clear removes all session key values but it keeps the session entry. @@ -246,7 +241,7 @@ func (db *Database) Clear(sid string) { prefix := makePrefix(sid) txn := db.Service.NewTransaction(true) - defer txn.Commit(nil) + defer txn.Commit() iter := txn.NewIterator(iterOptionsNoValues) defer iter.Close() @@ -264,7 +259,7 @@ func (db *Database) Release(sid string) { // and remove the $sid. txn := db.Service.NewTransaction(true) txn.Delete([]byte(sid)) - txn.Commit(nil) + txn.Commit() } // Close shutdowns the badger connection. diff --git a/sessions/sessiondb/redis/service.go b/sessions/sessiondb/redis/service.go index dca58963..b8f83095 100644 --- a/sessions/sessiondb/redis/service.go +++ b/sessions/sessiondb/redis/service.go @@ -33,7 +33,7 @@ type Config struct { Database string // MaxActive. Defaults to 10. MaxActive int - // Timeout for connect, write and read, defautls to 30 seconds, 0 means no timeout. + // Timeout for connect, write and read, defaults to 30 seconds, 0 means no timeout. Timeout time.Duration // Prefix "myprefix-for-this-website". Defaults to "". Prefix string diff --git a/versioning/AUTHORS b/versioning/AUTHORS deleted file mode 100644 index 848245bb..00000000 --- a/versioning/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -Gerasimos Maropoulos diff --git a/versioning/LICENSE b/versioning/LICENSE deleted file mode 100644 index fb9b3b8a..00000000 --- a/versioning/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2018-2019 Gerasimos Maropoulos. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Iris nor the names of its -contributor, Gerasimos Maropoulos, may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/versioning/deprecation.go b/versioning/deprecation.go index c7b8cd06..2b6066f5 100644 --- a/versioning/deprecation.go +++ b/versioning/deprecation.go @@ -36,7 +36,6 @@ func Deprecated(handler context.Handler, options DeprecationOptions) context.Han } return func(ctx context.Context) { - handler(ctx) ctx.Header("X-API-Warn", options.WarnMessage) if !options.DeprecationDate.IsZero() { @@ -46,5 +45,7 @@ func Deprecated(handler context.Handler, options DeprecationOptions) context.Han if options.DeprecationInfo != "" { ctx.Header("X-API-Deprecation-Info", options.DeprecationInfo) } + + handler(ctx) } }