mirror of
https://github.com/kataras/iris.git
synced 2025-02-09 02:34:55 +01:00
Updated all dependencies one by one to go.mod - Backup and remove the vendor folder entirely and update most of the examples - next commit will contain the rest of the updated
Former-commit-id: 2791c50256c0f00d6e08a408e5cb009262c49588
This commit is contained in:
parent
86a18ff545
commit
137c41344d
|
@ -10,7 +10,7 @@ go_import_path: github.com/kataras/iris
|
||||||
# global:
|
# global:
|
||||||
# - GOCACHE=off
|
# - GOCACHE=off
|
||||||
install:
|
install:
|
||||||
- go get ./... # for iris-contrib/httpexpect, kataras/golog
|
- go get ./...
|
||||||
script:
|
script:
|
||||||
- go test -v -cover ./...
|
- go test -v -cover ./...
|
||||||
after_script:
|
after_script:
|
||||||
|
|
|
@ -912,7 +912,7 @@ func main() {
|
||||||
|
|
||||||
### Testing
|
### 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
|
```go
|
||||||
package main
|
package main
|
||||||
|
|
|
@ -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)
|
|
||||||
}
|
|
|
@ -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()...)
|
|
||||||
}
|
|
|
@ -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()...)
|
|
||||||
}
|
|
638
_benchmarks/benchmarker/scripts/dotnet-install.ps1
vendored
638
_benchmarks/benchmarker/scripts/dotnet-install.ps1
vendored
|
@ -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: <auto> - this value represents currently running OS architecture
|
|
||||||
Architecture of dotnet binaries to be installed.
|
|
||||||
Possible values are: <auto>, 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="<auto>",
|
|
||||||
[string]$Architecture="<auto>",
|
|
||||||
[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 "<auto>" } { 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 "<auto>") {
|
|
||||||
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
|
|
1019
_benchmarks/benchmarker/scripts/dotnet-install.sh
vendored
1019
_benchmarks/benchmarker/scripts/dotnet-install.sh
vendored
File diff suppressed because it is too large
Load Diff
|
@ -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}
|
|
|
@ -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'
|
|
|
@ -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
|
|
|
@ -3,7 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/iris-contrib/httpexpect"
|
"github.com/gavv/httpexpect"
|
||||||
"github.com/kataras/iris/httptest"
|
"github.com/kataras/iris/httptest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/iris-contrib/httpexpect"
|
"github.com/gavv/httpexpect"
|
||||||
"github.com/kataras/iris/httptest"
|
"github.com/kataras/iris/httptest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ import (
|
||||||
|
|
||||||
prometheusMiddleware "github.com/iris-contrib/middleware/prometheus"
|
prometheusMiddleware "github.com/iris-contrib/middleware/prometheus"
|
||||||
|
|
||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
@ -31,7 +31,7 @@ func main() {
|
||||||
ctx.Writef("Slept for %d milliseconds", sleep)
|
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/
|
||||||
// http://localhost:8080/anotfound
|
// http://localhost:8080/anotfound
|
||||||
|
|
|
@ -89,9 +89,10 @@ func TestEmbeddingGzipFilesIntoApp(t *testing.T) {
|
||||||
if expected, got := response.Raw().StatusCode, httptest.StatusOK; expected != got {
|
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)
|
t.Fatalf("[%d] of '%s': expected %d status code but got %d", i, url, expected, got)
|
||||||
}
|
}
|
||||||
|
rawBody := response.Body().Raw()
|
||||||
|
|
||||||
func() {
|
func() {
|
||||||
reader, err := gzip.NewReader(bytes.NewBuffer(response.Content))
|
reader, err := gzip.NewReader(strings.NewReader(rawBody))
|
||||||
defer reader.Close()
|
defer reader.Close()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("[%d] of '%s': %v", i, url, err)
|
t.Fatalf("[%d] of '%s': %v", i, url, err)
|
||||||
|
|
7
_examples/http-listening/http3-quic/go.mod
Normal file
7
_examples/http-listening/http3-quic/go.mod
Normal file
|
@ -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
|
||||||
|
)
|
|
@ -8,7 +8,10 @@ import (
|
||||||
|
|
||||||
/*
|
/*
|
||||||
$ go get -u github.com/lucas-clemente/quic-go/...
|
$ 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() {
|
func main() {
|
||||||
app := iris.New()
|
app := iris.New()
|
||||||
|
|
||||||
|
|
2
cache/cache_test.go
vendored
2
cache/cache_test.go
vendored
|
@ -14,7 +14,7 @@ import (
|
||||||
"github.com/kataras/iris/context"
|
"github.com/kataras/iris/context"
|
||||||
"github.com/kataras/iris/core/errors"
|
"github.com/kataras/iris/core/errors"
|
||||||
|
|
||||||
"github.com/iris-contrib/httpexpect"
|
"github.com/gavv/httpexpect"
|
||||||
"github.com/kataras/iris/httptest"
|
"github.com/kataras/iris/httptest"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/iris-contrib/httpexpect"
|
"github.com/gavv/httpexpect"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package router
|
package router
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
@ -18,23 +20,21 @@ func getCaller() (string, int) {
|
||||||
var pcs [32]uintptr
|
var pcs [32]uintptr
|
||||||
n := runtime.Callers(1, pcs[:])
|
n := runtime.Callers(1, pcs[:])
|
||||||
frames := runtime.CallersFrames(pcs[:n])
|
frames := runtime.CallersFrames(pcs[:n])
|
||||||
|
wd, _ := os.Getwd()
|
||||||
for {
|
for {
|
||||||
frame, more := frames.Next()
|
frame, more := frames.Next()
|
||||||
file := frame.File
|
file := frame.File
|
||||||
|
|
||||||
splitAfterPart := "/src/"
|
if (!strings.Contains(file, "/kataras/iris") ||
|
||||||
if (!strings.Contains(file, "github.com/kataras/iris") ||
|
strings.Contains(file, "/kataras/iris/_examples") ||
|
||||||
strings.Contains(file, "github.com/kataras/iris/_examples") ||
|
strings.Contains(file, "/iris-contrib/examples") ||
|
||||||
strings.Contains(file, "github.com/iris-contrib/examples") ||
|
(strings.Contains(file, "/kataras/iris/core/router") && !strings.Contains(file, "deprecated.go"))) &&
|
||||||
(strings.Contains(file, "github.com/kataras/iris/core/router") && !strings.Contains(file, "deprecated.go"))) &&
|
|
||||||
!strings.HasSuffix(frame.Func.Name(), ".getCaller") && !strings.Contains(file, "/go/src/testing") {
|
!strings.HasSuffix(frame.Func.Name(), ".getCaller") && !strings.Contains(file, "/go/src/testing") {
|
||||||
|
|
||||||
// remove the $GOPATH.
|
if relFile, err := filepath.Rel(wd, file); err == nil {
|
||||||
n := strings.Index(file, splitAfterPart)
|
file = "./" + relFile
|
||||||
if n != -1 {
|
|
||||||
file = file[n+len(splitAfterPart):]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return file, frame.Line
|
return file, frame.Line
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ func ExampleParty_StaticWeb() {
|
||||||
|
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
// Output: StaticWeb is DEPRECATED and it will be removed eventually.
|
// 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.
|
// Use .HandleDir("/static", "./assets") instead.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ func ExampleParty_StaticHandler() {
|
||||||
|
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
// Output: StaticHandler is DEPRECATED and it will be removed eventually.
|
// 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.
|
// Use iris.FileServer("./assets", iris.DirOptions{ShowList: false, Gzip: true}) instead.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ func ExampleParty_StaticEmbedded() {
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
// Output: StaticEmbedded is DEPRECATED and it will be removed eventually.
|
// Output: StaticEmbedded is DEPRECATED and it will be removed eventually.
|
||||||
// It is also miss the AssetInfo bindata function, which is required now.
|
// 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.
|
// Use .HandleDir("/static", "./assets", iris.DirOptions{Asset: Asset, AssetInfo: AssetInfo, AssetNames: AssetNames}) instead.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,6 +62,6 @@ func ExampleParty_StaticEmbeddedGzip() {
|
||||||
fmt.Print(err)
|
fmt.Print(err)
|
||||||
// Output: StaticEmbeddedGzip is DEPRECATED and it will be removed eventually.
|
// Output: StaticEmbeddedGzip is DEPRECATED and it will be removed eventually.
|
||||||
// It is also miss the AssetInfo bindata function, which is required now.
|
// 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.
|
// Use .HandleDir("/static", "./assets", iris.DirOptions{Gzip: true, Asset: Asset, AssetInfo: AssetInfo, AssetNames: AssetNames}) instead.
|
||||||
}
|
}
|
||||||
|
|
26
go.mod
26
go.mod
|
@ -3,27 +3,27 @@ module github.com/kataras/iris
|
||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/hashicorp/go-version v1.2.0 // indirect
|
||||||
github.com/BurntSushi/toml v0.3.1
|
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/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/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/blackfriday v2.0.0+incompatible
|
||||||
github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1
|
github.com/iris-contrib/formBinder v0.0.0-20190104093907-fbd5963f41e1
|
||||||
github.com/iris-contrib/go.uuid v2.0.0+incompatible
|
github.com/iris-contrib/go.uuid v2.0.0+incompatible
|
||||||
github.com/json-iterator/go v1.1.6 // vendor removed.
|
github.com/iris-contrib/i18n v0.0.0-20171121225848-987a633949d0
|
||||||
github.com/kataras/golog v0.0.0-20180321173939-03be10146386
|
github.com/json-iterator/go v1.1.6
|
||||||
github.com/kataras/neffos v0.0.7
|
github.com/kataras/neffos v0.0.7
|
||||||
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect
|
github.com/kataras/pio v0.0.0-20190103105442-ea782b38602d // indirect
|
||||||
github.com/microcosm-cc/bluemonday v1.0.2
|
github.com/microcosm-cc/bluemonday v1.0.2
|
||||||
github.com/ryanuber/columnize v2.1.0+incompatible
|
github.com/ryanuber/columnize v2.1.0+incompatible
|
||||||
github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect
|
github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385
|
||||||
golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5
|
github.com/Joker/jade v1.0.1-0.20190614124447-d475f43051e7 // indirect
|
||||||
golang.org/x/net v0.0.0-20190522155817-f3200d17e092 // indirect
|
github.com/kataras/golog v0.0.0-20190624001437-99c81de45f40
|
||||||
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed // indirect
|
github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4
|
||||||
golang.org/x/text v0.3.2 // indirect
|
github.com/CloudyKit/jet v2.1.3-0.20180809161101-62edd43e4f88+incompatible // indirect
|
||||||
golang.org/x/tools v0.0.0-20190602112858-2de7f9bf822c // indirect
|
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible
|
||||||
gopkg.in/yaml.v2 v2.2.2
|
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
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,7 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/kataras/iris"
|
"github.com/kataras/iris"
|
||||||
|
|
||||||
"github.com/iris-contrib/httpexpect"
|
"github.com/gavv/httpexpect"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
|
|
|
@ -14,6 +14,13 @@ import (
|
||||||
"github.com/kataras/golog"
|
"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"
|
// DefaultFileMode used as the default database's "fileMode"
|
||||||
// for creating the sessions directory path, opening and write the session file.
|
// for creating the sessions directory path, opening and write the session file.
|
||||||
var (
|
var (
|
||||||
|
@ -52,9 +59,7 @@ func New(directoryPath string) (*Database, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
opts := badger.DefaultOptions
|
opts := badger.DefaultOptions(directoryPath)
|
||||||
opts.Dir = directoryPath
|
|
||||||
opts.ValueDir = directoryPath
|
|
||||||
|
|
||||||
service, err := badger.Open(opts)
|
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.
|
// 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 {
|
func (db *Database) Acquire(sid string, expires time.Duration) sessions.LifeTime {
|
||||||
txn := db.Service.NewTransaction(true)
|
txn := db.Service.NewTransaction(true)
|
||||||
defer txn.Commit(nil)
|
defer txn.Commit()
|
||||||
|
|
||||||
bsid := makePrefix(sid)
|
bsid := makePrefix(sid)
|
||||||
item, err := txn.Get(bsid)
|
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 != nil {
|
||||||
if err == badger.ErrKeyNotFound {
|
if err == badger.ErrKeyNotFound {
|
||||||
// create it and set the expiration, we don't care about the value there.
|
// 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 {
|
err = db.Service.Update(func(txn *badger.Txn) error {
|
||||||
dur := lifetime.DurationUntilExpiration()
|
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 {
|
if err != nil {
|
||||||
|
@ -145,19 +151,10 @@ func (db *Database) Get(sid string, key string) (value interface{}) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// return item.Value(func(valueBytes []byte) {
|
return item.Value(func(valueBytes []byte) error {
|
||||||
// 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 sessions.DefaultTranscoder.Unmarshal(valueBytes, &value)
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
|
||||||
if err != nil && err != badger.ErrKeyNotFound {
|
if err != nil && err != badger.ErrKeyNotFound {
|
||||||
golog.Error(err)
|
golog.Error(err)
|
||||||
|
@ -192,13 +189,11 @@ func (db *Database) Visit(sid string, cb func(key string, value interface{})) {
|
||||||
// continue
|
// continue
|
||||||
// }
|
// }
|
||||||
|
|
||||||
valueBytes, err := item.Value()
|
err := item.Value(func(valueBytes []byte) error {
|
||||||
if err != nil {
|
return sessions.DefaultTranscoder.Unmarshal(valueBytes, &value)
|
||||||
golog.Error(err)
|
})
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = sessions.DefaultTranscoder.Unmarshal(valueBytes, &value); err != nil {
|
if err != nil {
|
||||||
golog.Error(err)
|
golog.Error(err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
@ -236,9 +231,9 @@ func (db *Database) Delete(sid string, key string) (deleted bool) {
|
||||||
err := txn.Delete(makeKey(sid, key))
|
err := txn.Delete(makeKey(sid, key))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
golog.Error(err)
|
golog.Error(err)
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
txn.Commit(nil)
|
return txn.Commit() == nil
|
||||||
return err == nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear removes all session key values but it keeps the session entry.
|
// 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)
|
prefix := makePrefix(sid)
|
||||||
|
|
||||||
txn := db.Service.NewTransaction(true)
|
txn := db.Service.NewTransaction(true)
|
||||||
defer txn.Commit(nil)
|
defer txn.Commit()
|
||||||
|
|
||||||
iter := txn.NewIterator(iterOptionsNoValues)
|
iter := txn.NewIterator(iterOptionsNoValues)
|
||||||
defer iter.Close()
|
defer iter.Close()
|
||||||
|
@ -264,7 +259,7 @@ func (db *Database) Release(sid string) {
|
||||||
// and remove the $sid.
|
// and remove the $sid.
|
||||||
txn := db.Service.NewTransaction(true)
|
txn := db.Service.NewTransaction(true)
|
||||||
txn.Delete([]byte(sid))
|
txn.Delete([]byte(sid))
|
||||||
txn.Commit(nil)
|
txn.Commit()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close shutdowns the badger connection.
|
// Close shutdowns the badger connection.
|
||||||
|
|
|
@ -33,7 +33,7 @@ type Config struct {
|
||||||
Database string
|
Database string
|
||||||
// MaxActive. Defaults to 10.
|
// MaxActive. Defaults to 10.
|
||||||
MaxActive int
|
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
|
Timeout time.Duration
|
||||||
// Prefix "myprefix-for-this-website". Defaults to "".
|
// Prefix "myprefix-for-this-website". Defaults to "".
|
||||||
Prefix string
|
Prefix string
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Gerasimos Maropoulos <kataras2006@hotmail.com>
|
|
|
@ -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.
|
|
|
@ -36,7 +36,6 @@ func Deprecated(handler context.Handler, options DeprecationOptions) context.Han
|
||||||
}
|
}
|
||||||
|
|
||||||
return func(ctx context.Context) {
|
return func(ctx context.Context) {
|
||||||
handler(ctx)
|
|
||||||
ctx.Header("X-API-Warn", options.WarnMessage)
|
ctx.Header("X-API-Warn", options.WarnMessage)
|
||||||
|
|
||||||
if !options.DeprecationDate.IsZero() {
|
if !options.DeprecationDate.IsZero() {
|
||||||
|
@ -46,5 +45,7 @@ func Deprecated(handler context.Handler, options DeprecationOptions) context.Han
|
||||||
if options.DeprecationInfo != "" {
|
if options.DeprecationInfo != "" {
|
||||||
ctx.Header("X-API-Deprecation-Info", options.DeprecationInfo)
|
ctx.Header("X-API-Deprecation-Info", options.DeprecationInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
handler(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user