Initial commit
This commit is contained in:
commit
3fee9b2c47
|
@ -0,0 +1,25 @@
|
||||||
|
using System.Text;
|
||||||
|
using Tesses.Http;
|
||||||
|
internal class MainServer : ASPEndpointRequestHandler
|
||||||
|
{
|
||||||
|
public MainServer()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
[HttpGet("/")]
|
||||||
|
public IResponse Index(int a)
|
||||||
|
{
|
||||||
|
return String($"{a} is 42");
|
||||||
|
}
|
||||||
|
[HttpGet("/form")]
|
||||||
|
public void SomePage(ServerContext ctx)
|
||||||
|
{
|
||||||
|
ctx.Response.StatusLine=200;
|
||||||
|
ctx.Response.SendStatusCodeHtml();
|
||||||
|
}
|
||||||
|
[HttpGet("/4ever4me")]
|
||||||
|
public IResponse ForEverForMe()
|
||||||
|
{
|
||||||
|
return File(System.IO.File.OpenRead("/home/mike/Music/Demi Lovato/Holy Fvck/16 4 EVER 4 ME.mp3"),"audio/mpeg","4Ever4Me.mp3",true);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Text;
|
||||||
|
using Tesses.Http;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HTTPServer server = new HTTPServer(new MainServer(),new TcpListener(System.Net.IPAddress.Any,3222));
|
||||||
|
server.FirstTime = (e)=>{
|
||||||
|
Console.WriteLine("Connection Made");
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
server.CatchExceptions=false;
|
||||||
|
server.AllowMultipleRequestsOnOneConnection=true;
|
||||||
|
await server.ListenAsync();
|
|
@ -0,0 +1,18 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Tesses.Http\Tesses.Http.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="MimeTypesMap" Version="1.0.8" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,71 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v6.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v6.0": {
|
||||||
|
"Tesses.Http.Example/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Tesses.Http": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.Example.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {
|
||||||
|
"assemblyVersion": "1.0.8.0",
|
||||||
|
"fileVersion": "1.0.8.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Tesses.Http.Example/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"hashPath": "mimetypesmap.1.0.8.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net6.0",
|
||||||
|
"framework": {
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "6.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,18 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>My fucking random form</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form action="/form" method="POST" enctype="multipart/form-data">
|
||||||
|
<input type="file" name="somejim">
|
||||||
|
<input type="text" name="name">
|
||||||
|
<input type="password" name="password">
|
||||||
|
<input type="hidden" name="bloke" value="Demi Lovato">
|
||||||
|
<input type="submit" value="OK">
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
|
|
@ -0,0 +1,22 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Tesses.Http.Example")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Tesses.Http.Example")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Tesses.Http.Example")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
669e612f9f7f7dd7046fa4644507cb226ea518f5
|
|
@ -0,0 +1,10 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net6.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = Tesses.Http.Example
|
||||||
|
build_property.ProjectDir = /home/mike/Documents/Tesses.Http/Tesses.Http.Example/
|
|
@ -0,0 +1,8 @@
|
||||||
|
// <auto-generated/>
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
6363edc47200916f9b9c1a2d710f4dcb56cb3e38
|
|
@ -0,0 +1,20 @@
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.Example
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.Example.deps.json
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.Example.runtimeconfig.json
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.Example.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.Example.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Newtonsoft.Json.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/Tesses.Http.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.csproj.AssemblyReference.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.AssemblyInfoInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.AssemblyInfo.cs
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.csproj.CoreCompileInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.csproj.CopyComplete
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/refint/Tesses.Http.Example.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/Tesses.Http.Example.genruntimeconfig.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/Debug/net6.0/ref/Tesses.Http.Example.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.Example/bin/Debug/net6.0/MimeTypesMap.dll
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
99157670c863174d3ac2f8d212efc02e0f9034cc
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,135 @@
|
||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj",
|
||||||
|
"projectName": "Tesses.Http.Example",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net6.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.8, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"projectName": "Tesses.Http",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"netstandard2.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.8, )"
|
||||||
|
},
|
||||||
|
"NETStandard.Library": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[13.0.1, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/mike/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/mike/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.2.1</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/home/mike/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
|
@ -0,0 +1,159 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"targets": {
|
||||||
|
"net6.0": {
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"framework": ".NETStandard,Version=v2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"compile": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"sha512": "iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"lib/net452/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard1.1/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll",
|
||||||
|
"mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"mimetypesmap.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"LICENSE.md",
|
||||||
|
"lib/net20/Newtonsoft.Json.dll",
|
||||||
|
"lib/net20/Newtonsoft.Json.xml",
|
||||||
|
"lib/net35/Newtonsoft.Json.dll",
|
||||||
|
"lib/net35/Newtonsoft.Json.xml",
|
||||||
|
"lib/net40/Newtonsoft.Json.dll",
|
||||||
|
"lib/net40/Newtonsoft.Json.xml",
|
||||||
|
"lib/net45/Newtonsoft.Json.dll",
|
||||||
|
"lib/net45/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.xml",
|
||||||
|
"newtonsoft.json.13.0.1.nupkg.sha512",
|
||||||
|
"newtonsoft.json.nuspec",
|
||||||
|
"packageIcon.png"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"path": "../Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"msbuildProject": "../Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
"net6.0": [
|
||||||
|
"MimeTypesMap >= 1.0.8",
|
||||||
|
"Tesses.Http >= 1.0.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"/home/mike/.nuget/packages/": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj",
|
||||||
|
"projectName": "Tesses.Http.Example",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net6.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.8, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "A8woRyUpBEU4D6Le2DtxwMxVTptzZORCoTf3qdNFIhnjolqjQ1PwH3yb6qegoOMCCGR84l4l+OBCQm87Yz4w6g==",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "/home/mike/Documents/Tesses.Http/Tesses.Http.Example/Tesses.Http.Example.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"/home/mike/.nuget/packages/mimetypesmap/1.0.8/mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
namespace Tesses.Http.KitchenSink;
|
||||||
|
|
||||||
|
class AspRouteStyle : ASPEndpointRequestHandler
|
||||||
|
{
|
||||||
|
[HttpGet]
|
||||||
|
public string Add(int a,int b)
|
||||||
|
{
|
||||||
|
return $"{a} + {b} = {a+b}";
|
||||||
|
}
|
||||||
|
[HttpGet]
|
||||||
|
public object Something(bool b,int i,double f,string sz)
|
||||||
|
{
|
||||||
|
return new {
|
||||||
|
Boolean = b,
|
||||||
|
Integer = i,
|
||||||
|
Double=f,
|
||||||
|
String=sz
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
public static async Task Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
MountableServer mountableServer=new MountableServer(RequestHandler.FromDirectory("WebSite"));
|
||||||
|
mountableServer.Mount("/SrcDl",RequestHandler.FromDelegateSync(e=>{
|
||||||
|
e.Response.SendFileAsDownload("Program.cs");
|
||||||
|
}));
|
||||||
|
mountableServer.Mount("/PasswordProtected",new BasicAuthRequestHandler((user,pass)=>{return user=="ddlovato" && pass=="somepassword";},RequestHandler.FromDelegateSync(e=>{
|
||||||
|
e.Response.WithContentType("text/plain").SendText("Password Protected Data");
|
||||||
|
})));
|
||||||
|
mountableServer.Mount("/4d",RequestHandler.FromDelegateSync(e=>{
|
||||||
|
HTTPClient client = HTTPClient.Open("GET","https://nextcloud.tesses.cf/apps/files_sharing/publicpreview/aYHgTAxNcAXNG3R?x=2258&y=727&a=true&file=celluloid-shot1007.jpg&scalingup=0");
|
||||||
|
client.SendToServer(e);
|
||||||
|
}));
|
||||||
|
mountableServer.Mount("/Endpoints/ASP",new AspRouteStyle());
|
||||||
|
mountableServer.Mount("/Endpoints/upload_data/",
|
||||||
|
RequestHandler.FromDelegateSync(e=>{
|
||||||
|
|
||||||
|
var parser=e.Request.GetMultipartParser();
|
||||||
|
|
||||||
|
parser.Parse((a,b,c)=>{
|
||||||
|
|
||||||
|
return File.Create(Path.Combine("WebSite","Endpoints","uploads",b));
|
||||||
|
},true).ToArray();
|
||||||
|
e.Response.WithContentType("text/plain").SendText("HELLO");
|
||||||
|
})
|
||||||
|
);
|
||||||
|
SendEvents evts=new SendEvents();
|
||||||
|
mountableServer.Mount("/counter/count",RequestHandler.FromDelegateSync(e=>{
|
||||||
|
|
||||||
|
e.Response.ServerSentEvents(evts);
|
||||||
|
|
||||||
|
|
||||||
|
}));
|
||||||
|
|
||||||
|
Thread t=new Thread(()=>{
|
||||||
|
for(long i =0;;i++){
|
||||||
|
evts.SendEvent($"Ran for {i} Seconds");
|
||||||
|
Thread.Sleep(1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
t.Start();
|
||||||
|
|
||||||
|
HTTPServer server=new HTTPServer(mountableServer,new System.Net.Sockets.TcpListener(new IPEndPoint(0,3333)));
|
||||||
|
server.AllowMultipleRequestsOnOneConnection=true;
|
||||||
|
await server.ListenAsync();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Tesses.Http\Tesses.Http.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,16 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Upload a file</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<form method="post" action="./upload_data/" enctype="multipart/form-data">
|
||||||
|
<input type="file" name="file">
|
||||||
|
|
||||||
|
<input type="submit" value="Upload">
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
Binary file not shown.
After Width: | Height: | Size: 308 KiB |
Binary file not shown.
After Width: | Height: | Size: 308 KiB |
Binary file not shown.
After Width: | Height: | Size: 44 KiB |
Binary file not shown.
After Width: | Height: | Size: 26 KiB |
|
@ -0,0 +1,21 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Counter</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Counter</h1>
|
||||||
|
<h3 id="txt"></h3>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
const txt=document.getElementById('txt');
|
||||||
|
var source = new EventSource("/counter/count");
|
||||||
|
source.onmessage = function(event) {
|
||||||
|
txt.innerText = event.data;
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -0,0 +1,12 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Document</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Substance</h1>
|
||||||
|
</body>
|
||||||
|
</html>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,70 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETCoreApp,Version=v6.0",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETCoreApp,Version=v6.0": {
|
||||||
|
"Tesses.Http.KitchenSink/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"Tesses.Http": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.KitchenSink.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {
|
||||||
|
"assemblyVersion": "1.0.8.0",
|
||||||
|
"fileVersion": "1.0.8.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Tesses.Http.KitchenSink/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"hashPath": "mimetypesmap.1.0.8.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,9 @@
|
||||||
|
{
|
||||||
|
"runtimeOptions": {
|
||||||
|
"tfm": "net6.0",
|
||||||
|
"framework": {
|
||||||
|
"name": "Microsoft.NETCore.App",
|
||||||
|
"version": "6.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
|
|
@ -0,0 +1,22 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Tesses.Http.KitchenSink")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Tesses.Http.KitchenSink")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Tesses.Http.KitchenSink")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
e30a4ccd016835e1cef63b026d9deaeba2652d2f
|
|
@ -0,0 +1,10 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.TargetFramework = net6.0
|
||||||
|
build_property.TargetPlatformMinVersion =
|
||||||
|
build_property.UsingMicrosoftNETSdkWeb =
|
||||||
|
build_property.ProjectTypeGuids =
|
||||||
|
build_property.InvariantGlobalization =
|
||||||
|
build_property.PlatformNeutralAssembly =
|
||||||
|
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||||
|
build_property.RootNamespace = Tesses.Http.KitchenSink
|
||||||
|
build_property.ProjectDir = /home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/
|
|
@ -0,0 +1,8 @@
|
||||||
|
// <auto-generated/>
|
||||||
|
global using global::System;
|
||||||
|
global using global::System.Collections.Generic;
|
||||||
|
global using global::System.IO;
|
||||||
|
global using global::System.Linq;
|
||||||
|
global using global::System.Net.Http;
|
||||||
|
global using global::System.Threading;
|
||||||
|
global using global::System.Threading.Tasks;
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
a746a4ef62ea153b4753b4a691f371551d06ef73
|
|
@ -0,0 +1,20 @@
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.KitchenSink
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.KitchenSink.deps.json
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.KitchenSink.runtimeconfig.json
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.KitchenSink.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.KitchenSink.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/MimeTypesMap.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Newtonsoft.Json.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/bin/Debug/net6.0/Tesses.Http.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.csproj.AssemblyReference.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.AssemblyInfoInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.AssemblyInfo.cs
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.csproj.CoreCompileInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.csproj.CopyComplete
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/refint/Tesses.Http.KitchenSink.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/Tesses.Http.KitchenSink.genruntimeconfig.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/Debug/net6.0/ref/Tesses.Http.KitchenSink.dll
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
fdff5d1ced5cbad40fd00269d754d3a7cf9b38cd
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,129 @@
|
||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj",
|
||||||
|
"projectName": "Tesses.Http.KitchenSink",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net6.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"projectName": "Tesses.Http",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"netstandard2.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.8, )"
|
||||||
|
},
|
||||||
|
"NETStandard.Library": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[13.0.1, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/mike/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/mike/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.2.1</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/home/mike/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />
|
|
@ -0,0 +1,152 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"targets": {
|
||||||
|
"net6.0": {
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"framework": ".NETStandard,Version=v2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"compile": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"sha512": "iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"lib/net452/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard1.1/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll",
|
||||||
|
"mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"mimetypesmap.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"LICENSE.md",
|
||||||
|
"lib/net20/Newtonsoft.Json.dll",
|
||||||
|
"lib/net20/Newtonsoft.Json.xml",
|
||||||
|
"lib/net35/Newtonsoft.Json.dll",
|
||||||
|
"lib/net35/Newtonsoft.Json.xml",
|
||||||
|
"lib/net40/Newtonsoft.Json.dll",
|
||||||
|
"lib/net40/Newtonsoft.Json.xml",
|
||||||
|
"lib/net45/Newtonsoft.Json.dll",
|
||||||
|
"lib/net45/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.xml",
|
||||||
|
"newtonsoft.json.13.0.1.nupkg.sha512",
|
||||||
|
"newtonsoft.json.nuspec",
|
||||||
|
"packageIcon.png"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"path": "../Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"msbuildProject": "../Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
"net6.0": [
|
||||||
|
"Tesses.Http >= 1.0.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"/home/mike/.nuget/packages/": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj",
|
||||||
|
"projectName": "Tesses.Http.KitchenSink",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"net6.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"net6.0": {
|
||||||
|
"targetAlias": "net6.0",
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"frameworkReferences": {
|
||||||
|
"Microsoft.NETCore.App": {
|
||||||
|
"privateAssets": "all"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "V66VwZpW5UH8tYt+PlfbHAUTOj/+7/ZIV0E+qE9G+sD+0OWCrjem0xeUpchbVXkoPjrA3TP9s79jvfQpk0SVGQ==",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "/home/mike/Documents/Tesses.Http/Tesses.Http.KitchenSink/Tesses.Http.KitchenSink.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"/home/mike/.nuget/packages/mimetypesmap/1.0.8/mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
|
@ -0,0 +1,731 @@
|
||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Tesses.Http.VFSCollection
|
||||||
|
{
|
||||||
|
public static class Extensions
|
||||||
|
{
|
||||||
|
public static void ExtractTessesArchive(this VirtualStorage storage,Stream strm,bool ownStream)
|
||||||
|
{
|
||||||
|
using(TArchiveReader reader=new TArchiveReader(strm,ownStream))
|
||||||
|
{
|
||||||
|
reader.ExtractEverything((t,n,len)=>{
|
||||||
|
if(t == EntryType.File)
|
||||||
|
{
|
||||||
|
string pardir = Path.GetDirectoryName(n.TrimStart('.').TrimStart('/'));
|
||||||
|
storage.CreateDirectory(pardir);
|
||||||
|
return storage.Open(pardir,FileMode.Create,FileAccess.Write,FileShare.None);
|
||||||
|
}
|
||||||
|
if(t == EntryType.Directory)
|
||||||
|
{
|
||||||
|
storage.CreateDirectory(n.TrimStart('.').TrimStart('/'));
|
||||||
|
}
|
||||||
|
|
||||||
|
return Stream.Null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public enum EntryType : byte
|
||||||
|
{
|
||||||
|
File=0b00000000,
|
||||||
|
Directory=0b00000001,
|
||||||
|
Symlink=0b00000010
|
||||||
|
}
|
||||||
|
public class TArchiveReader : IDisposable
|
||||||
|
{
|
||||||
|
public delegate Stream ExtractEverythingDelegate(EntryType type,string name,long entLen);
|
||||||
|
public delegate void DoneWriting(Stream strm,string name);
|
||||||
|
public delegate void Symlink(string linkPath,string linkDest);
|
||||||
|
Stream strm;
|
||||||
|
bool own;
|
||||||
|
public TArchiveReader(Stream strm,bool ownStream=false)
|
||||||
|
{
|
||||||
|
this.strm=strm;
|
||||||
|
own=ownStream;
|
||||||
|
}
|
||||||
|
public TArchiveReader(string filename)
|
||||||
|
{
|
||||||
|
this.strm = File.OpenRead(filename);
|
||||||
|
own =true;
|
||||||
|
}
|
||||||
|
private void ReadLittleEndian(byte[] arrayToFill)
|
||||||
|
{
|
||||||
|
strm.Read(arrayToFill,0,arrayToFill.Length);
|
||||||
|
|
||||||
|
if(!BitConverter.IsLittleEndian)
|
||||||
|
{
|
||||||
|
Array.Reverse(arrayToFill);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private bool ReadEntryAttributes(out EntryType type, out string name,out long len)
|
||||||
|
{
|
||||||
|
// strm.WriteByte((byte)type);
|
||||||
|
//WriteString(name);
|
||||||
|
//WriteLittleEndian(BitConverter.GetBytes(len));
|
||||||
|
int t=strm.ReadByte();
|
||||||
|
if(t == -1)
|
||||||
|
{
|
||||||
|
type=EntryType.File;
|
||||||
|
name="ENDOFSTREAM.BIN";
|
||||||
|
len=0;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
type=(EntryType)t;
|
||||||
|
name=ReadString();
|
||||||
|
byte[] len0 = new byte[8];
|
||||||
|
ReadLittleEndian(len0);
|
||||||
|
len=BitConverter.ToInt64(len0,0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string ReadString()
|
||||||
|
{
|
||||||
|
byte[] len = new byte[4];
|
||||||
|
ReadLittleEndian(len);
|
||||||
|
byte[] strdat=new byte[BitConverter.ToInt32(len,0)];
|
||||||
|
strm.Read(strdat,0,strdat.Length);
|
||||||
|
return System.Text.Encoding.UTF8.GetString(strdat);
|
||||||
|
}
|
||||||
|
private void ReadAndDiscard(long l)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(strm.CanSeek)
|
||||||
|
{
|
||||||
|
strm.Seek(l,SeekOrigin.Current);
|
||||||
|
}else{
|
||||||
|
_copyTo(Stream.Null,l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private void _copyTo(Stream strm,long len)
|
||||||
|
{
|
||||||
|
byte[] buff=new byte[1024];
|
||||||
|
long pos=0;
|
||||||
|
int read=0;
|
||||||
|
do{
|
||||||
|
read=(int)Math.Min(1024,len-pos);
|
||||||
|
if(read == 0) return;
|
||||||
|
read=this.strm.Read(buff,0,read);
|
||||||
|
strm.Write(buff,0,read);
|
||||||
|
pos+=read;
|
||||||
|
}while(read != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExtractStartingWith(string archivePath,string outputDir,Symlink symlink=null)
|
||||||
|
{
|
||||||
|
Dictionary<string,List<string>> _f=new Dictionary<string, List<string>>();
|
||||||
|
ExtractEverything((type,name,len)=>{
|
||||||
|
if(name.StartsWith(archivePath)){
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case EntryType.File:
|
||||||
|
string fname=Path.Combine(outputDir,name);
|
||||||
|
string dirname = Path.GetDirectoryName(fname);
|
||||||
|
if(!string.IsNullOrWhiteSpace(dirname))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(dirname);
|
||||||
|
}
|
||||||
|
return File.Create(fname);
|
||||||
|
case EntryType.Directory:
|
||||||
|
string fname0=Path.Combine(outputDir,name);
|
||||||
|
Directory.CreateDirectory(fname0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Stream.Null;
|
||||||
|
},(strm0,name)=>{strm0.Dispose();},symlink);
|
||||||
|
}
|
||||||
|
public void Extract(string archivePath,Stream strm)
|
||||||
|
{
|
||||||
|
bool hasGone=false;;
|
||||||
|
ExtractEverything((type,name,len)=>{
|
||||||
|
if(hasGone) return null;
|
||||||
|
if(type == EntryType.File && name==archivePath){
|
||||||
|
hasGone=true;
|
||||||
|
return strm;
|
||||||
|
}
|
||||||
|
return Stream.Null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ExtractEverything(string outputDir,Symlink symlink=null)
|
||||||
|
{
|
||||||
|
Dictionary<string,List<string>> _f=new Dictionary<string, List<string>>();
|
||||||
|
ExtractEverything((type,name,len)=>{
|
||||||
|
switch(type)
|
||||||
|
{
|
||||||
|
case EntryType.File:
|
||||||
|
string fname=Path.Combine(outputDir,name);
|
||||||
|
|
||||||
|
string dirname = Path.GetDirectoryName(fname);
|
||||||
|
if(!string.IsNullOrWhiteSpace(dirname))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(dirname);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return File.Create(fname);
|
||||||
|
case EntryType.Directory:
|
||||||
|
string fname0=Path.Combine(outputDir,name);
|
||||||
|
Directory.CreateDirectory(fname0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return Stream.Null;
|
||||||
|
},(strm0,name)=>{strm0.Dispose();},symlink);
|
||||||
|
}
|
||||||
|
public void ExtractEverything(ExtractEverythingDelegate del,DoneWriting doneWriting=null,Symlink symlink=null)
|
||||||
|
{
|
||||||
|
if(del == null) return;
|
||||||
|
if(hasRead && strm.CanSeek)
|
||||||
|
{
|
||||||
|
strm.Seek(0,SeekOrigin.Begin);
|
||||||
|
}
|
||||||
|
if(hasRead && !strm.CanSeek)
|
||||||
|
{
|
||||||
|
throw new Exception("Can't Seek Stream");
|
||||||
|
}else{
|
||||||
|
bool read=false;
|
||||||
|
do{
|
||||||
|
EntryType type;
|
||||||
|
string name;
|
||||||
|
long len;
|
||||||
|
read=ReadEntryAttributes(out type,out name,out len);
|
||||||
|
if(read)
|
||||||
|
{
|
||||||
|
if(type == EntryType.Symlink)
|
||||||
|
{
|
||||||
|
MemoryStream strm=new MemoryStream();
|
||||||
|
_copyTo(strm,len);
|
||||||
|
using(StreamReader rdr=new StreamReader(strm))
|
||||||
|
{
|
||||||
|
string res= rdr.ReadToEnd();
|
||||||
|
symlink?.Invoke(name,res);
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
Stream strm=del(type,name,len);
|
||||||
|
if(strm == Stream.Null)
|
||||||
|
{
|
||||||
|
if(len>0)
|
||||||
|
ReadAndDiscard(len);
|
||||||
|
}
|
||||||
|
else if(strm != null)
|
||||||
|
{
|
||||||
|
_copyTo(strm,len);
|
||||||
|
if(doneWriting != null)
|
||||||
|
{
|
||||||
|
doneWriting(strm,name);
|
||||||
|
}else{
|
||||||
|
strm.Close();
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
hasRead=true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
}while(read);
|
||||||
|
|
||||||
|
hasRead=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
bool hasRead=false;
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
if(own) strm.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class MemoryStorage : VirtualStorage
|
||||||
|
{
|
||||||
|
protected override void DeleteEmptyDirectory(string dir)
|
||||||
|
{
|
||||||
|
string[] _p=dir.Split('/');
|
||||||
|
if(_p.Length < 1) return;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
if(!(dir0.Entries[_p[_p.Length-1]].IsFile))
|
||||||
|
dir0.Entries.Remove(_p[_p.Length-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override string ActualPath => "mem:///";
|
||||||
|
public override void SetCreationTime(string filename, DateTime time)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
dir0.Entries[_p[_p.Length]].Created=time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void SetLastAccessTime(string filename, DateTime time)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
dir0.Entries[_p[_p.Length]].LastAccess=time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override void SetLastWriteTime(string filename, DateTime time)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
dir0.Entries[_p[_p.Length]].LastWrite=time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override DateTime GetCreationTime(string filename)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return DateTime.Now;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
return dir0.Entries[_p[_p.Length]].Created;
|
||||||
|
}else{
|
||||||
|
return DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override DateTime GetLastWriteTime(string filename)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return DateTime.Now;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
return dir0.Entries[_p[_p.Length]].LastWrite;
|
||||||
|
}else{
|
||||||
|
return DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public override DateTime GetLastAccessTime(string filename)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return DateTime.Now;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dir0.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
return dir0.Entries[_p[_p.Length]].LastAccess;
|
||||||
|
}else{
|
||||||
|
return DateTime.Now;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private abstract class MemoryEntry
|
||||||
|
{
|
||||||
|
public abstract bool IsFile {get;}
|
||||||
|
|
||||||
|
|
||||||
|
public DateTime Created {get;set;}
|
||||||
|
public DateTime LastWrite {get;set;}
|
||||||
|
public DateTime LastAccess {get;set;}
|
||||||
|
}
|
||||||
|
private class MemoryFile : MemoryEntry
|
||||||
|
{
|
||||||
|
public MemoryFile()
|
||||||
|
{
|
||||||
|
LastAccess=DateTime.Now;
|
||||||
|
LastWrite=DateTime.Now;
|
||||||
|
Created=DateTime.Now;
|
||||||
|
}
|
||||||
|
public bool HasWriteAccess=false;
|
||||||
|
public override bool IsFile => true;
|
||||||
|
public byte[] Data=new byte[0];
|
||||||
|
|
||||||
|
public void Overwrite(byte[] data)
|
||||||
|
{
|
||||||
|
lock(this)
|
||||||
|
{
|
||||||
|
Data=data;
|
||||||
|
LastWrite = DateTime.Now;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private class MemoryStream2 : MemoryStream
|
||||||
|
{
|
||||||
|
MemoryFile _f;
|
||||||
|
bool _canWrite;
|
||||||
|
|
||||||
|
public MemoryStream2(MemoryFile file,bool canWrite) : base(file.Data.ToArray(),canWrite) //copies data into file
|
||||||
|
{
|
||||||
|
file.LastAccess = DateTime.Now;
|
||||||
|
_f=file;
|
||||||
|
_canWrite=canWrite;
|
||||||
|
if(file.HasWriteAccess && _canWrite)
|
||||||
|
{
|
||||||
|
throw new IOException("MemoryStorage doesn't support simulatious writers");
|
||||||
|
}
|
||||||
|
if(!file.HasWriteAccess)
|
||||||
|
file.HasWriteAccess=_canWrite;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Close()
|
||||||
|
{
|
||||||
|
if(_canWrite)
|
||||||
|
{
|
||||||
|
_f.Overwrite(this.ToArray());
|
||||||
|
_f.HasWriteAccess=false;
|
||||||
|
}
|
||||||
|
base.Close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private class MemoryDirectory : MemoryEntry
|
||||||
|
{
|
||||||
|
|
||||||
|
public MemoryDirectory()
|
||||||
|
{
|
||||||
|
Created = DateTime.Now;
|
||||||
|
LastWrite=DateTime.Now;
|
||||||
|
LastAccess=DateTime.Now;
|
||||||
|
Entries=new Dictionary<string, MemoryEntry>();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsFile => false;
|
||||||
|
public Dictionary<string,MemoryEntry> Entries {get;set;}
|
||||||
|
}
|
||||||
|
MemoryDirectory root=new MemoryDirectory();
|
||||||
|
public static MemoryStorage FromTessesArchive(Stream strm,bool ownStream)
|
||||||
|
{
|
||||||
|
MemoryStorage storage=new MemoryStorage();
|
||||||
|
storage.ExtractTessesArchive(strm,ownStream);
|
||||||
|
//public delegate Stream ExtractEverythingDelegate(EntryType type,string name,long entLen);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return storage;
|
||||||
|
}
|
||||||
|
private MemoryDirectory _create(MemoryDirectory dir,string p)
|
||||||
|
{
|
||||||
|
if(!dir.Entries.ContainsKey(p))
|
||||||
|
{
|
||||||
|
dir.Entries.Add(p,new MemoryDirectory());
|
||||||
|
}
|
||||||
|
var dir2= dir.Entries[p] as MemoryDirectory;
|
||||||
|
return dir2;
|
||||||
|
}
|
||||||
|
private MemoryEntry _get(MemoryDirectory dir,string p)
|
||||||
|
{
|
||||||
|
if(!dir.Entries.ContainsKey(p))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dir.Entries[p];
|
||||||
|
}
|
||||||
|
public override void CreateDirectory(string path)
|
||||||
|
{
|
||||||
|
string[] _p=path.Split('/');
|
||||||
|
var dir = root;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
foreach(var item in _p)
|
||||||
|
{
|
||||||
|
dir= _create(root,item);
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Delete(string file)
|
||||||
|
{
|
||||||
|
string[] _p=file.Split('/');
|
||||||
|
if(_p.Length < 1) return;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir=_get(dir,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dir.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
if(dir.Entries[_p[_p.Length-1]].IsFile)
|
||||||
|
dir.Entries.Remove(_p[_p.Length-1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool DirectoryExists(string filename)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return false;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir=_get(dir,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dir.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
return !(dir.Entries[_p[_p.Length-1]].IsFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<string> EnumerateDirectories(string dir)
|
||||||
|
{
|
||||||
|
string[] _p=dir.Split('/');
|
||||||
|
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p)
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(var items in dir0.Entries)
|
||||||
|
{
|
||||||
|
if(!items.Value.IsFile)
|
||||||
|
yield return items.Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<string> EnumerateFiles(string dir)
|
||||||
|
{
|
||||||
|
|
||||||
|
string[] _p=dir.Split('/');
|
||||||
|
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir0=root;
|
||||||
|
foreach(var item in _p)
|
||||||
|
{
|
||||||
|
dir0=_get(dir0,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir0 == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(var items in dir0.Entries)
|
||||||
|
{
|
||||||
|
if(items.Value.IsFile)
|
||||||
|
yield return items.Key;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool FileExists(string filename)
|
||||||
|
{
|
||||||
|
string[] _p=filename.Split('/');
|
||||||
|
if(_p.Length < 1) return false;
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir=_get(dir,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir == null)
|
||||||
|
{
|
||||||
|
throw new Exception($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(dir.Entries.ContainsKey(_p[_p.Length-1]))
|
||||||
|
{
|
||||||
|
return (dir.Entries[_p[_p.Length-1]].IsFile);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Stream Open(string file, FileMode mode, FileAccess access, FileShare share)
|
||||||
|
{
|
||||||
|
string[] _p=file.Split('/');
|
||||||
|
if(_p.Length < 1) throw new IOException("Path empty");
|
||||||
|
List<string> __c=new List<string>();
|
||||||
|
MemoryDirectory dir=root;
|
||||||
|
foreach(var item in _p.Take(_p.Length -1))
|
||||||
|
{
|
||||||
|
dir=_get(dir,item) as MemoryDirectory;
|
||||||
|
__c.Add(item);
|
||||||
|
if(dir == null)
|
||||||
|
{
|
||||||
|
throw new IOException($"The path {PathCombine(__c)} is a file, should be a directory");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//we will now try to get the file
|
||||||
|
string filename=_p[_p.Length -1];
|
||||||
|
if(dir.Entries.ContainsKey(filename))
|
||||||
|
{
|
||||||
|
if(!dir.Entries[filename].IsFile) throw new IOException("Not a file");
|
||||||
|
//the file exists
|
||||||
|
if(mode == FileMode.CreateNew) throw new IOException("File Exists");
|
||||||
|
|
||||||
|
var _file= dir.Entries[filename] as MemoryFile;
|
||||||
|
lock(_file)
|
||||||
|
{
|
||||||
|
if(mode == FileMode.Create) {
|
||||||
|
_file.Data=new byte[0];
|
||||||
|
}
|
||||||
|
//we need to open file
|
||||||
|
MemoryStream2 strm=new MemoryStream2(_file,access != FileAccess.Read);
|
||||||
|
|
||||||
|
if(mode != FileMode.Truncate)
|
||||||
|
{
|
||||||
|
strm.Position=0;
|
||||||
|
}else{
|
||||||
|
strm.Position=strm.Length;
|
||||||
|
}
|
||||||
|
return strm;
|
||||||
|
}
|
||||||
|
|
||||||
|
}else{
|
||||||
|
if(mode == FileMode.Open) throw new IOException("File Doesn't Exist");
|
||||||
|
MemoryFile _file=new MemoryFile();
|
||||||
|
dir.Entries.Add(filename,_file);
|
||||||
|
|
||||||
|
lock(_file)
|
||||||
|
{
|
||||||
|
MemoryStream2 strm=new MemoryStream2(_file,access != FileAccess.Read);
|
||||||
|
return strm;
|
||||||
|
}
|
||||||
|
|
||||||
|
//the file doesnt exist
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class SSHStorage : VirtualStorage
|
||||||
|
{
|
||||||
|
public override void CreateDirectory(string path)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Delete(string file)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool DirectoryExists(string filename)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<string> EnumerateDirectories(string dir)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IEnumerable<string> EnumerateFiles(string dir)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool FileExists(string filename)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Stream Open(string file, FileMode mode, FileAccess access, FileShare share)
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\Tesses.Http\Tesses.Http.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="SSH.NET" Version="2020.0.2" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>netstandard2.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"runtimeTarget": {
|
||||||
|
"name": ".NETStandard,Version=v2.0/",
|
||||||
|
"signature": ""
|
||||||
|
},
|
||||||
|
"compilationOptions": {},
|
||||||
|
"targets": {
|
||||||
|
".NETStandard,Version=v2.0": {},
|
||||||
|
".NETStandard,Version=v2.0/": {
|
||||||
|
"Tesses.Http.VFSCollection/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"NETStandard.Library": "2.0.3",
|
||||||
|
"Tesses.Http": "1.0.0"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.VFSCollection.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Microsoft.NETCore.Platforms/1.1.0": {},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {
|
||||||
|
"assemblyVersion": "1.0.8.0",
|
||||||
|
"fileVersion": "1.0.8.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NETStandard.Library/2.0.3": {
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.Platforms": "1.1.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {
|
||||||
|
"assemblyVersion": "13.0.0.0",
|
||||||
|
"fileVersion": "13.0.1.25517"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Tesses.Http.VFSCollection/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
},
|
||||||
|
"Microsoft.NETCore.Platforms/1.1.0": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
|
||||||
|
"path": "microsoft.netcore.platforms/1.1.0",
|
||||||
|
"hashPath": "microsoft.netcore.platforms.1.1.0.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"hashPath": "mimetypesmap.1.0.8.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"NETStandard.Library/2.0.3": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
|
||||||
|
"path": "netstandard.library/2.0.3",
|
||||||
|
"hashPath": "netstandard.library.2.0.3.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"serviceable": true,
|
||||||
|
"sha512": "sha512-ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"hashPath": "newtonsoft.json.13.0.1.nupkg.sha512"
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"serviceable": false,
|
||||||
|
"sha512": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,4 @@
|
||||||
|
// <autogenerated />
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETStandard,Version=v2.0", FrameworkDisplayName = "")]
|
|
@ -0,0 +1,22 @@
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
// <auto-generated>
|
||||||
|
// This code was generated by a tool.
|
||||||
|
//
|
||||||
|
// Changes to this file may cause incorrect behavior and will be lost if
|
||||||
|
// the code is regenerated.
|
||||||
|
// </auto-generated>
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Tesses.Http.VFSCollection")]
|
||||||
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
|
||||||
|
[assembly: System.Reflection.AssemblyProductAttribute("Tesses.Http.VFSCollection")]
|
||||||
|
[assembly: System.Reflection.AssemblyTitleAttribute("Tesses.Http.VFSCollection")]
|
||||||
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|
||||||
|
// Generated by the MSBuild WriteCodeFragment class.
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
e923dcb2a108173e8b86fc6ff1172ab495aac9d0
|
|
@ -0,0 +1,3 @@
|
||||||
|
is_global = true
|
||||||
|
build_property.RootNamespace = Tesses.Http.VFSCollection
|
||||||
|
build_property.ProjectDir = /home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
a592453a8b5bace07babb87dbe5b1e4bf71dead9
|
|
@ -0,0 +1,13 @@
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/bin/Debug/netstandard2.0/Tesses.Http.VFSCollection.deps.json
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/bin/Debug/netstandard2.0/Tesses.Http.VFSCollection.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/bin/Debug/netstandard2.0/Tesses.Http.VFSCollection.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/bin/Debug/netstandard2.0/Tesses.Http.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/bin/Debug/netstandard2.0/Tesses.Http.pdb
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.csproj.AssemblyReference.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.GeneratedMSBuildEditorConfig.editorconfig
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.AssemblyInfoInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.AssemblyInfo.cs
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.csproj.CoreCompileInputs.cache
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.csproj.CopyComplete
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.dll
|
||||||
|
/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/Debug/netstandard2.0/Tesses.Http.VFSCollection.pdb
|
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,136 @@
|
||||||
|
{
|
||||||
|
"format": 1,
|
||||||
|
"restore": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj": {}
|
||||||
|
},
|
||||||
|
"projects": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj",
|
||||||
|
"projectName": "Tesses.Http.VFSCollection",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"netstandard2.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"NETStandard.Library": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
},
|
||||||
|
"SSH.NET": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2020.0.2, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"projectName": "Tesses.Http",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"netstandard2.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"projectReferences": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[1.0.8, )"
|
||||||
|
},
|
||||||
|
"NETStandard.Library": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[13.0.1, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
|
||||||
|
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
|
||||||
|
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
|
||||||
|
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/mike/.nuget/packages/</NuGetPackageRoot>
|
||||||
|
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/mike/.nuget/packages/</NuGetPackageFolders>
|
||||||
|
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
|
||||||
|
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.2.1</NuGetToolVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<SourceRoot Include="/home/mike/.nuget/packages/" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||||
|
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
|
||||||
|
<Import Project="$(NuGetPackageRoot)netstandard.library/2.0.3/build/netstandard2.0/NETStandard.Library.targets" Condition="Exists('$(NuGetPackageRoot)netstandard.library/2.0.3/build/netstandard2.0/NETStandard.Library.targets')" />
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
|
@ -0,0 +1,414 @@
|
||||||
|
{
|
||||||
|
"version": 3,
|
||||||
|
"targets": {
|
||||||
|
".NETStandard,Version=v2.0": {
|
||||||
|
"Microsoft.NETCore.Platforms/1.1.0": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard1.0/_._": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard1.0/_._": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"NETStandard.Library/2.0.3": {
|
||||||
|
"type": "package",
|
||||||
|
"dependencies": {
|
||||||
|
"Microsoft.NETCore.Platforms": "1.1.0"
|
||||||
|
},
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard1.0/_._": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard1.0/_._": {}
|
||||||
|
},
|
||||||
|
"build": {
|
||||||
|
"build/netstandard2.0/NETStandard.Library.targets": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SSH.NET/2020.0.2": {
|
||||||
|
"type": "package",
|
||||||
|
"dependencies": {
|
||||||
|
"SshNet.Security.Cryptography": "[1.3.0]"
|
||||||
|
},
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/Renci.SshNet.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/Renci.SshNet.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"SshNet.Security.Cryptography/1.3.0": {
|
||||||
|
"type": "package",
|
||||||
|
"compile": {
|
||||||
|
"lib/netstandard2.0/SshNet.Security.Cryptography.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"lib/netstandard2.0/SshNet.Security.Cryptography.dll": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"framework": ".NETStandard,Version=v2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"MimeTypesMap": "1.0.8",
|
||||||
|
"Newtonsoft.Json": "13.0.1"
|
||||||
|
},
|
||||||
|
"compile": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
},
|
||||||
|
"runtime": {
|
||||||
|
"bin/placeholder/Tesses.Http.dll": {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"libraries": {
|
||||||
|
"Microsoft.NETCore.Platforms/1.1.0": {
|
||||||
|
"sha512": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "microsoft.netcore.platforms/1.1.0",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"ThirdPartyNotices.txt",
|
||||||
|
"dotnet_library_license.txt",
|
||||||
|
"lib/netstandard1.0/_._",
|
||||||
|
"microsoft.netcore.platforms.1.1.0.nupkg.sha512",
|
||||||
|
"microsoft.netcore.platforms.nuspec",
|
||||||
|
"runtime.json"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"MimeTypesMap/1.0.8": {
|
||||||
|
"sha512": "iOm6Zar+yVROhlyrGGSJTfThvNoHLUeYeQQND9YD/ot/nA2qsWUp9kP2MHTdF9P7I8afW6eCf8vdELLZjDFdSQ==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "mimetypesmap/1.0.8",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"lib/net452/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard1.1/MimeTypesMap.dll",
|
||||||
|
"lib/netstandard2.0/MimeTypesMap.dll",
|
||||||
|
"mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"mimetypesmap.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"NETStandard.Library/2.0.3": {
|
||||||
|
"sha512": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "netstandard.library/2.0.3",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"LICENSE.TXT",
|
||||||
|
"THIRD-PARTY-NOTICES.TXT",
|
||||||
|
"build/netstandard2.0/NETStandard.Library.targets",
|
||||||
|
"build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.AppContext.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Collections.Concurrent.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Collections.NonGeneric.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Collections.Specialized.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Collections.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ComponentModel.Composition.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ComponentModel.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ComponentModel.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Console.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Core.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Data.Common.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Data.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.Contracts.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.Debug.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.Process.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.Tools.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Diagnostics.Tracing.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Drawing.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Drawing.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Dynamic.Runtime.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Globalization.Calendars.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Globalization.Extensions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Globalization.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.Compression.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.FileSystem.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.IsolatedStorage.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.Pipes.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll",
|
||||||
|
"build/netstandard2.0/ref/System.IO.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Linq.Expressions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Linq.Parallel.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Linq.Queryable.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Linq.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Http.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.NameResolution.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.NetworkInformation.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Ping.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Requests.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Security.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.Sockets.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.WebSockets.Client.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.WebSockets.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Net.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Numerics.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ObjectModel.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Reflection.Extensions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Reflection.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Reflection.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Resources.Reader.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Resources.ResourceManager.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Resources.Writer.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Extensions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Handles.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.InteropServices.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Numerics.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.Serialization.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Runtime.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Claims.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.Principal.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Security.SecureString.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ServiceModel.Web.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Text.Encoding.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Text.RegularExpressions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.Overlapped.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.Tasks.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.Thread.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.ThreadPool.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.Timer.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Threading.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Transactions.dll",
|
||||||
|
"build/netstandard2.0/ref/System.ValueTuple.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Web.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Windows.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.Linq.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.ReaderWriter.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.Serialization.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.XDocument.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.XPath.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.XmlDocument.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.XmlSerializer.dll",
|
||||||
|
"build/netstandard2.0/ref/System.Xml.dll",
|
||||||
|
"build/netstandard2.0/ref/System.dll",
|
||||||
|
"build/netstandard2.0/ref/mscorlib.dll",
|
||||||
|
"build/netstandard2.0/ref/netstandard.dll",
|
||||||
|
"build/netstandard2.0/ref/netstandard.xml",
|
||||||
|
"lib/netstandard1.0/_._",
|
||||||
|
"netstandard.library.2.0.3.nupkg.sha512",
|
||||||
|
"netstandard.library.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Newtonsoft.Json/13.0.1": {
|
||||||
|
"sha512": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "newtonsoft.json/13.0.1",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"LICENSE.md",
|
||||||
|
"lib/net20/Newtonsoft.Json.dll",
|
||||||
|
"lib/net20/Newtonsoft.Json.xml",
|
||||||
|
"lib/net35/Newtonsoft.Json.dll",
|
||||||
|
"lib/net35/Newtonsoft.Json.xml",
|
||||||
|
"lib/net40/Newtonsoft.Json.dll",
|
||||||
|
"lib/net40/Newtonsoft.Json.xml",
|
||||||
|
"lib/net45/Newtonsoft.Json.dll",
|
||||||
|
"lib/net45/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.0/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard1.3/Newtonsoft.Json.xml",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.dll",
|
||||||
|
"lib/netstandard2.0/Newtonsoft.Json.xml",
|
||||||
|
"newtonsoft.json.13.0.1.nupkg.sha512",
|
||||||
|
"newtonsoft.json.nuspec",
|
||||||
|
"packageIcon.png"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"SSH.NET/2020.0.2": {
|
||||||
|
"sha512": "G0dNlTBAM00KZXv1wWVwgg26d9/METcM6qWBpNQwllzQmmbu+Zu+FS1L1X4fFgGdPu3e8k9mmTBu6SwtQ0614g==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "ssh.net/2020.0.2",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"lib/net35/Renci.SshNet.dll",
|
||||||
|
"lib/net35/Renci.SshNet.xml",
|
||||||
|
"lib/net40/Renci.SshNet.dll",
|
||||||
|
"lib/net40/Renci.SshNet.xml",
|
||||||
|
"lib/netstandard1.3/Renci.SshNet.dll",
|
||||||
|
"lib/netstandard1.3/Renci.SshNet.xml",
|
||||||
|
"lib/netstandard2.0/Renci.SshNet.dll",
|
||||||
|
"lib/netstandard2.0/Renci.SshNet.xml",
|
||||||
|
"lib/sl4/Renci.SshNet.dll",
|
||||||
|
"lib/sl4/Renci.SshNet.xml",
|
||||||
|
"lib/sl5/Renci.SshNet.dll",
|
||||||
|
"lib/sl5/Renci.SshNet.xml",
|
||||||
|
"lib/uap10/Renci.SshNet.dll",
|
||||||
|
"lib/uap10/Renci.SshNet.xml",
|
||||||
|
"lib/wp71/Renci.SshNet.dll",
|
||||||
|
"lib/wp71/Renci.SshNet.xml",
|
||||||
|
"lib/wp8/Renci.SshNet.dll",
|
||||||
|
"lib/wp8/Renci.SshNet.xml",
|
||||||
|
"ssh.net.2020.0.2.nupkg.sha512",
|
||||||
|
"ssh.net.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"SshNet.Security.Cryptography/1.3.0": {
|
||||||
|
"sha512": "5pBIXRjcSO/amY8WztpmNOhaaCNHY/B6CcYDI7FSTgqSyo/ZUojlLiKcsl+YGbxQuLX439qIkMfP0PHqxqJi/Q==",
|
||||||
|
"type": "package",
|
||||||
|
"path": "sshnet.security.cryptography/1.3.0",
|
||||||
|
"files": [
|
||||||
|
".nupkg.metadata",
|
||||||
|
".signature.p7s",
|
||||||
|
"lib/net20/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/net20/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/net40/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/net40/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/net45/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/net45/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/netstandard1.0/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/netstandard1.0/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/netstandard1.3/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/netstandard1.3/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/netstandard2.0/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/netstandard2.0/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/portable-net45+win8+wpa81/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/portable-net45+win8+wpa81/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/sl4/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/sl4/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/sl5/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/sl5/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/uap10.0/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/uap10.0/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/wp71/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/wp71/SshNet.Security.Cryptography.xml",
|
||||||
|
"lib/wp8/SshNet.Security.Cryptography.dll",
|
||||||
|
"lib/wp8/SshNet.Security.Cryptography.xml",
|
||||||
|
"sshnet.security.cryptography.1.3.0.nupkg.sha512",
|
||||||
|
"sshnet.security.cryptography.nuspec"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"Tesses.Http/1.0.0": {
|
||||||
|
"type": "project",
|
||||||
|
"path": "../Tesses.Http/Tesses.Http.csproj",
|
||||||
|
"msbuildProject": "../Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"projectFileDependencyGroups": {
|
||||||
|
".NETStandard,Version=v2.0": [
|
||||||
|
"NETStandard.Library >= 2.0.3",
|
||||||
|
"SSH.NET >= 2020.0.2",
|
||||||
|
"Tesses.Http >= 1.0.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"packageFolders": {
|
||||||
|
"/home/mike/.nuget/packages/": {}
|
||||||
|
},
|
||||||
|
"project": {
|
||||||
|
"version": "1.0.0",
|
||||||
|
"restore": {
|
||||||
|
"projectUniqueName": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj",
|
||||||
|
"projectName": "Tesses.Http.VFSCollection",
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj",
|
||||||
|
"packagesPath": "/home/mike/.nuget/packages/",
|
||||||
|
"outputPath": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/obj/",
|
||||||
|
"projectStyle": "PackageReference",
|
||||||
|
"configFilePaths": [
|
||||||
|
"/home/mike/.nuget/NuGet/NuGet.Config"
|
||||||
|
],
|
||||||
|
"originalTargetFrameworks": [
|
||||||
|
"netstandard2.0"
|
||||||
|
],
|
||||||
|
"sources": {
|
||||||
|
"/usr/share/dotnet/library-packs": {},
|
||||||
|
"https://api.nuget.org/v3/index.json": {}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"projectReferences": {
|
||||||
|
"/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj": {
|
||||||
|
"projectPath": "/home/mike/Documents/Tesses.Http/Tesses.Http/Tesses.Http.csproj"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"warningProperties": {
|
||||||
|
"warnAsError": [
|
||||||
|
"NU1605"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"frameworks": {
|
||||||
|
"netstandard2.0": {
|
||||||
|
"targetAlias": "netstandard2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"NETStandard.Library": {
|
||||||
|
"suppressParent": "All",
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2.0.3, )",
|
||||||
|
"autoReferenced": true
|
||||||
|
},
|
||||||
|
"SSH.NET": {
|
||||||
|
"target": "Package",
|
||||||
|
"version": "[2020.0.2, )"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"imports": [
|
||||||
|
"net461",
|
||||||
|
"net462",
|
||||||
|
"net47",
|
||||||
|
"net471",
|
||||||
|
"net472",
|
||||||
|
"net48"
|
||||||
|
],
|
||||||
|
"assetTargetFallback": true,
|
||||||
|
"warn": true,
|
||||||
|
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/6.0.302/RuntimeIdentifierGraph.json"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"dgSpecHash": "Tpviiwao27yHwlw/jaZfgfslyiUqqYM9sFSMDY5pwqTbFMinid1RpT1ua6/ecBv6/fhW5NjAwUYtdS24ZyhdDA==",
|
||||||
|
"success": true,
|
||||||
|
"projectFilePath": "/home/mike/Documents/Tesses.Http/Tesses.Http.VFSCollection/Tesses.Http.VFSCollection.csproj",
|
||||||
|
"expectedPackageFiles": [
|
||||||
|
"/home/mike/.nuget/packages/microsoft.netcore.platforms/1.1.0/microsoft.netcore.platforms.1.1.0.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/mimetypesmap/1.0.8/mimetypesmap.1.0.8.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/netstandard.library/2.0.3/netstandard.library.2.0.3.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/ssh.net/2020.0.2/ssh.net.2020.0.2.nupkg.sha512",
|
||||||
|
"/home/mike/.nuget/packages/sshnet.security.cryptography/1.3.0/sshnet.security.cryptography.1.3.0.nupkg.sha512"
|
||||||
|
],
|
||||||
|
"logs": []
|
||||||
|
}
|
|
@ -0,0 +1,441 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Linq;
|
||||||
|
using HeyRed.Mime;
|
||||||
|
|
||||||
|
namespace Tesses.Http
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public abstract class ASPEndpointRequestHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
protected virtual Stream GetPostFileStream(string name,string filename,string contentType)
|
||||||
|
{
|
||||||
|
return new MemoryStream();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<___RouteMethod> ___RouteMethods=new List<___RouteMethod>();
|
||||||
|
|
||||||
|
private class ___RouteMethod
|
||||||
|
{
|
||||||
|
public string Method;
|
||||||
|
public bool ContainsServerCtx;
|
||||||
|
public bool ContainsMultipart;
|
||||||
|
public bool ReturnsVoid;
|
||||||
|
|
||||||
|
public string Name;
|
||||||
|
|
||||||
|
public MethodInfo info;
|
||||||
|
|
||||||
|
public ASPEndpointRequestHandler _instance;
|
||||||
|
|
||||||
|
|
||||||
|
public void Call(ServerContext ctx,MultipartParser p,Dictionary<string,List<string>> args)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!ContainsMultipart && p != null)
|
||||||
|
{
|
||||||
|
foreach(var item in p.Parse(_instance.GetPostFileStream,true))
|
||||||
|
{
|
||||||
|
if(!item.HasFileName)
|
||||||
|
{
|
||||||
|
args.Add(item.Name,item.GetStringData());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
object[] ar_= _args.Select<___Arg,object>((e)=>{
|
||||||
|
return e.GetArgument(ctx,p,args);
|
||||||
|
}).ToArray();
|
||||||
|
|
||||||
|
|
||||||
|
object o=info.Invoke(_instance,ar_);
|
||||||
|
if(!ReturnsVoid)
|
||||||
|
{
|
||||||
|
IResponse r = o as IResponse;
|
||||||
|
Stream s = o as Stream;
|
||||||
|
string r2 = o as string;
|
||||||
|
StringBuilder b=o as StringBuilder;
|
||||||
|
|
||||||
|
|
||||||
|
if(r!=null)
|
||||||
|
{
|
||||||
|
r.Handle(ctx);
|
||||||
|
}else if(s != null)
|
||||||
|
{
|
||||||
|
FileResponse resp=new FileResponse(s,"application/octet-stream",true);
|
||||||
|
resp.Handle(ctx);
|
||||||
|
}else if(b != null)
|
||||||
|
{
|
||||||
|
TextResponse resp=new TextResponse(b.ToString(),"text/plain");
|
||||||
|
resp.Handle(ctx);
|
||||||
|
}
|
||||||
|
else if(!string.IsNullOrEmpty(r2))
|
||||||
|
{
|
||||||
|
TextResponse resp=new TextResponse(r2,"text/plain");
|
||||||
|
resp.Handle(ctx);
|
||||||
|
}else{
|
||||||
|
TextResponse resp=new TextResponse(JsonConvert.SerializeObject(o),"application/json");
|
||||||
|
resp.Handle(ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<___Arg> _args=new List<___Arg>();
|
||||||
|
}
|
||||||
|
private class ___Arg
|
||||||
|
{
|
||||||
|
|
||||||
|
public bool _isServerCtx;
|
||||||
|
public bool _isMultipart;
|
||||||
|
public string name;
|
||||||
|
public Type type;
|
||||||
|
private object Default()
|
||||||
|
{
|
||||||
|
if(type.GetTypeInfo().IsValueType)
|
||||||
|
{
|
||||||
|
return Activator.CreateInstance(type);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
private object ___to_type_ar(Type t,List<string> items)
|
||||||
|
{
|
||||||
|
object o;
|
||||||
|
if(t.IsArray)
|
||||||
|
{
|
||||||
|
var t0=t.MakeArrayType();
|
||||||
|
object[] items2=new object[items.Count];
|
||||||
|
foreach(var item in items)
|
||||||
|
{
|
||||||
|
___to_type(t0,item);
|
||||||
|
}
|
||||||
|
o=items;
|
||||||
|
}else{
|
||||||
|
o=___to_type(t,items.FirstOrDefault());
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
private object ___to_type(Type t,string value)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
if(t == typeof(String))
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
foreach(var item in t.GetMethods())
|
||||||
|
{
|
||||||
|
var _params = item.GetParameters();
|
||||||
|
if(_params.Length != 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(_params[0].ParameterType != typeof(String)) continue;
|
||||||
|
|
||||||
|
if(item.IsStatic && !item.IsConstructor && item.Name == "Parse")
|
||||||
|
{
|
||||||
|
return item.Invoke(null,new object[]{value});
|
||||||
|
}
|
||||||
|
if(item.IsConstructor)
|
||||||
|
{
|
||||||
|
return Activator.CreateInstance(t,value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
MethodInfo method = typeof(JsonConvert).GetMethod(nameof(JsonConvert.SerializeObject));
|
||||||
|
MethodInfo generic = method.MakeGenericMethod(t);
|
||||||
|
return generic.Invoke(null,new object[]{value});
|
||||||
|
}catch(Exception ex)
|
||||||
|
{
|
||||||
|
_=ex;
|
||||||
|
return Default();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public object GetArgument(ServerContext ctx,MultipartParser p,Dictionary<string,List<string>> args)
|
||||||
|
{
|
||||||
|
if(_isServerCtx)
|
||||||
|
{
|
||||||
|
return ctx;
|
||||||
|
}
|
||||||
|
if(_isMultipart)
|
||||||
|
{
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
foreach(var item in args)
|
||||||
|
{
|
||||||
|
if(item.Key.ToLower() == name)
|
||||||
|
{
|
||||||
|
return ___to_type_ar(type,item.Value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Default();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public TextResponse String(string text,string mimeType="text/html")
|
||||||
|
{
|
||||||
|
|
||||||
|
return new TextResponse(text,mimeType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileResponse File(Stream strm,string mimeType,bool ownStream=true)
|
||||||
|
{
|
||||||
|
return new FileResponse(strm,mimeType,ownStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
public FileResponse File(string filename,bool inline=true)
|
||||||
|
{
|
||||||
|
return new FileResponse(filename,inline);
|
||||||
|
}
|
||||||
|
public FileResponse File(Stream strm,string mimeType,string filename,bool inline=false,bool ownStream=false)
|
||||||
|
{
|
||||||
|
return new FileResponse(strm,mimeType,filename,inline,ownStream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool ___has_loaded=false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void ___lazy_load_everything()
|
||||||
|
{
|
||||||
|
if(!___has_loaded)
|
||||||
|
{
|
||||||
|
Type t=GetType();
|
||||||
|
foreach(var item in t.GetMethods())
|
||||||
|
{
|
||||||
|
IHttpRoute route = new HttpGetAttribute($"/{item.Name}");
|
||||||
|
|
||||||
|
foreach(var r in item.GetCustomAttributes())
|
||||||
|
{
|
||||||
|
var rte=r as IHttpRoute;
|
||||||
|
if(rte != null)
|
||||||
|
{
|
||||||
|
route=rte;
|
||||||
|
if(string.IsNullOrWhiteSpace(rte.RouteName))
|
||||||
|
{
|
||||||
|
|
||||||
|
route.RouteName = $"/{item.Name}";
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
___RouteMethod m=new ___RouteMethod();
|
||||||
|
var __props = item.GetParameters();
|
||||||
|
m.ContainsServerCtx = __props.Any(e=>e.ParameterType == typeof(ServerContext));
|
||||||
|
m.ContainsMultipart = __props.Any(e=>e.ParameterType == typeof(MultipartParser));
|
||||||
|
m.ReturnsVoid = item.ReturnType == typeof(void);
|
||||||
|
m.info=item;
|
||||||
|
m.Name = route.RouteName;
|
||||||
|
m.Method=route.Method;
|
||||||
|
m._instance = this;
|
||||||
|
m._args=new List<___Arg>();
|
||||||
|
|
||||||
|
if(m.ContainsServerCtx || !m.ReturnsVoid)
|
||||||
|
{
|
||||||
|
//add route to
|
||||||
|
foreach(var args in __props)
|
||||||
|
{
|
||||||
|
___Arg a=new ___Arg();
|
||||||
|
a._isServerCtx = args.ParameterType == typeof(ServerContext);
|
||||||
|
a._isMultipart = args.ParameterType == typeof(MultipartParser);
|
||||||
|
a.name = args.Name.ToLower();
|
||||||
|
a.type = args.ParameterType;
|
||||||
|
m._args.Add(a);
|
||||||
|
}
|
||||||
|
___RouteMethods.Add(m);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
___has_loaded=true;
|
||||||
|
}
|
||||||
|
public async Task Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
___lazy_load_everything();
|
||||||
|
Dictionary<string,List<string>> args=new Dictionary<string, List<string>>();
|
||||||
|
MultipartParser parser=null;
|
||||||
|
foreach(var m in ___RouteMethods)
|
||||||
|
{
|
||||||
|
args.Clear();
|
||||||
|
string p=ctx.Request.GetQueryParameters(ctx.Request.CurrentUrl,args);
|
||||||
|
|
||||||
|
if(m.Method == ctx.Request.RequestLine.Method && m.Name ==p)
|
||||||
|
{
|
||||||
|
//want to check for method
|
||||||
|
|
||||||
|
|
||||||
|
if(m.Method == "POST")
|
||||||
|
{
|
||||||
|
string _ctt;
|
||||||
|
if(ctx.Request.Headers.TryGetFirst("Content-Type",out _ctt))
|
||||||
|
{
|
||||||
|
if(_ctt.StartsWith("multipart/form-data"))
|
||||||
|
{
|
||||||
|
parser = ctx.Request.GetMultipartParser();
|
||||||
|
}
|
||||||
|
if(_ctt == "application/x-www-form-urlencoded")
|
||||||
|
{
|
||||||
|
ctx.Request.GetUrlEncodedPost(args);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Call(ctx,parser,args);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class FileResponse : IResponse
|
||||||
|
{
|
||||||
|
bool inline;
|
||||||
|
public FileResponse(Stream strm,string mimeType,bool ownStream)
|
||||||
|
{
|
||||||
|
this.ownStream=ownStream;
|
||||||
|
Stream = strm;
|
||||||
|
MimeType=mimeType;
|
||||||
|
FileName="";
|
||||||
|
}
|
||||||
|
public FileResponse(Stream strm,string mimeType,string filename,bool inline,bool ownStream)
|
||||||
|
{
|
||||||
|
this.ownStream=ownStream;
|
||||||
|
Stream =strm;
|
||||||
|
MimeType = mimeType;
|
||||||
|
FileName=filename;
|
||||||
|
this.inline=inline;
|
||||||
|
}
|
||||||
|
bool ownStream;
|
||||||
|
public FileResponse(string filename,bool inline)
|
||||||
|
{
|
||||||
|
ownStream=true;
|
||||||
|
MimeType=MimeTypesMap.GetMimeType(filename);
|
||||||
|
Stream=File.OpenRead(filename);
|
||||||
|
FileName = Path.GetFileName(filename);
|
||||||
|
this.inline=inline;
|
||||||
|
}
|
||||||
|
public Stream Stream {get;set;}
|
||||||
|
public string MimeType {get;set;}
|
||||||
|
|
||||||
|
public string FileName {get;set;}
|
||||||
|
|
||||||
|
public void Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
if(string.IsNullOrWhiteSpace(FileName))
|
||||||
|
{
|
||||||
|
ctx.Response.WithContentType(MimeType).SendRangableResponseStream(Stream);
|
||||||
|
|
||||||
|
}else{
|
||||||
|
ctx.Response.WithContentType(MimeType).WithFileName(FileName,inline).SendRangableResponseStream(Stream);
|
||||||
|
|
||||||
|
}
|
||||||
|
if(ownStream)
|
||||||
|
Stream.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TextResponse : IResponse
|
||||||
|
{
|
||||||
|
public TextResponse(string text,string mime)
|
||||||
|
{
|
||||||
|
Text=text;
|
||||||
|
MimeType=mime;
|
||||||
|
}
|
||||||
|
public string Text {get;set;}
|
||||||
|
public string MimeType {get;set;}
|
||||||
|
|
||||||
|
public void Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
ctx.Response.WithContentType(MimeType).SendText(Text);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IResponse
|
||||||
|
{
|
||||||
|
void Handle(ServerContext ctx);
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IHttpRoute
|
||||||
|
{
|
||||||
|
string RouteName {get;set;}
|
||||||
|
|
||||||
|
string Method {get;}
|
||||||
|
}
|
||||||
|
|
||||||
|
[AttributeUsage(AttributeTargets.Method)]
|
||||||
|
|
||||||
|
public sealed class HttpGetAttribute :Attribute, IHttpRoute
|
||||||
|
{
|
||||||
|
public string Method {get{return "GET";}}
|
||||||
|
public string RouteName {get;set;}
|
||||||
|
public HttpGetAttribute(string name)
|
||||||
|
{
|
||||||
|
RouteName=name;
|
||||||
|
}
|
||||||
|
public HttpGetAttribute()
|
||||||
|
{
|
||||||
|
RouteName = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[AttributeUsage(AttributeTargets.Method)]
|
||||||
|
|
||||||
|
public sealed class HttpPostAttribute :Attribute, IHttpRoute
|
||||||
|
{
|
||||||
|
public string Method {get{return "POST";}}
|
||||||
|
public string RouteName {get;set;}
|
||||||
|
public HttpPostAttribute(string name)
|
||||||
|
{
|
||||||
|
RouteName=name;
|
||||||
|
}
|
||||||
|
public HttpPostAttribute()
|
||||||
|
{
|
||||||
|
RouteName = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public sealed class HttpMethodAttribute : Attribute, IHttpRoute
|
||||||
|
{
|
||||||
|
string _meth;
|
||||||
|
public string Method {get{return _meth;}}
|
||||||
|
|
||||||
|
public string RouteName {get;set;}
|
||||||
|
|
||||||
|
public HttpMethodAttribute(string method)
|
||||||
|
{
|
||||||
|
_meth=method;
|
||||||
|
RouteName="";
|
||||||
|
}
|
||||||
|
public HttpMethodAttribute(string method,string route)
|
||||||
|
{
|
||||||
|
_meth = method;
|
||||||
|
RouteName = route;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,138 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Linq;
|
||||||
|
using HeyRed.Mime;
|
||||||
|
|
||||||
|
namespace Tesses.Http
|
||||||
|
{/// <summary>
|
||||||
|
/// Check username and password are correct or if request can be anonymous
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="username">Username, can and will be "" on first request for resource</param>
|
||||||
|
/// <param name="password">Password, can and will be "" on first request for resource</param>
|
||||||
|
/// <returns>true for authorized, false for unauthorized</returns>
|
||||||
|
public delegate bool Authenticate(string username, string password);
|
||||||
|
/// <summary>
|
||||||
|
/// Check username and password are correct or if request can be anonymous
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="context">Server Context</param>
|
||||||
|
/// <param name="username">Username, can and will be "" on first request for resource</param>
|
||||||
|
/// <param name="password">Password, can and will be "" on first request for resource</param>
|
||||||
|
/// <returns>true for authorized, false for unauthorized</returns>
|
||||||
|
public delegate bool AuthenticateWithContext(ServerContext context,string username,string password);
|
||||||
|
/// <summary>
|
||||||
|
/// Protect server with password
|
||||||
|
/// </summary>
|
||||||
|
public class BasicAuthRequestHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Construct server for user authorization
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="auth">callback for authorization</param>
|
||||||
|
/// <param name="inner">server to protect</param>
|
||||||
|
/// <param name="realm">realm parameter in WWW-Auhenticate Header</param>
|
||||||
|
public BasicAuthRequestHandler(Authenticate auth,IRequestHandler inner,string realm="SampleRealm")
|
||||||
|
{
|
||||||
|
Authenticate = auth;
|
||||||
|
InnerServer = inner;
|
||||||
|
Realm = realm;
|
||||||
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// Construct server for user authorization (With ServerContext in callback)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="auth">callback for authorization</param>
|
||||||
|
/// <param name="inner">server to protect</param>
|
||||||
|
/// <param name="realm">realm parameter in WWW-Auhenticate Header</param>
|
||||||
|
public BasicAuthRequestHandler(AuthenticateWithContext auth,IRequestHandler inner,string realm = "SampleRealm")
|
||||||
|
{
|
||||||
|
AuthenticateWithContext=auth;
|
||||||
|
InnerServer=inner;
|
||||||
|
Realm = realm;
|
||||||
|
}
|
||||||
|
public async Task Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
if(await Authorize(ctx))
|
||||||
|
{
|
||||||
|
|
||||||
|
await RequestHandler.Guaranteed(ctx,InnerServer).Handle(ctx);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Server to protect
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public IRequestHandler InnerServer { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Authentication callback without ServerContext
|
||||||
|
/// </summary>
|
||||||
|
public Authenticate Authenticate { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Authentication callback with ServerContext
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public AuthenticateWithContext AuthenticateWithContext {get;set;}
|
||||||
|
/// <summary>
|
||||||
|
/// Realm parameter in WWW-Authenticate header
|
||||||
|
/// </summary>
|
||||||
|
public string Realm { get; set; }
|
||||||
|
|
||||||
|
private bool ValidAuth(ServerContext ctx)
|
||||||
|
{
|
||||||
|
string auth;
|
||||||
|
if(Authenticate == null && AuthenticateWithContext == null) return true;
|
||||||
|
if (ctx.Request.Headers.TryGetFirst("Authorization", out auth))
|
||||||
|
{
|
||||||
|
string[] authorization = auth.Split(' ');
|
||||||
|
//authorization_basic
|
||||||
|
|
||||||
|
if (authorization[0] == "Basic")
|
||||||
|
{
|
||||||
|
string[] userPass = Encoding.UTF8.GetString(Convert.FromBase64String(authorization[1])).Split(new char[] { ':' },2);
|
||||||
|
//return userPass.Equals($"{config.UserName}:{config.Password}", StringComparison.Ordinal);
|
||||||
|
if(Authenticate != null)
|
||||||
|
return Authenticate(userPass[0], userPass[1]);
|
||||||
|
|
||||||
|
if(AuthenticateWithContext != null)
|
||||||
|
return AuthenticateWithContext(ctx,userPass[0],userPass[2]);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
if(Authenticate != null)
|
||||||
|
return Authenticate("", "");
|
||||||
|
|
||||||
|
if(AuthenticateWithContext != null)
|
||||||
|
return AuthenticateWithContext(ctx,"","");
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
private async Task<bool> Authorize(ServerContext ctx)
|
||||||
|
{
|
||||||
|
if (Authenticate == null && AuthenticateWithContext == null)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (ValidAuth(ctx))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
ctx.Response.Headers.Add("WWW-Authenticate", $"Basic realm=\"{Realm}\"");
|
||||||
|
ctx.Response.StatusLine = 401;
|
||||||
|
await UnauthorizedPage(ctx);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
protected virtual async Task UnauthorizedPage(ServerContext ctx)
|
||||||
|
{
|
||||||
|
ctx.Response.SendStatusCodeHtml();
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
using System;
|
||||||
|
using System.IO;
|
||||||
|
using System.Net;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text;
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Linq;
|
||||||
|
using HeyRed.Mime;
|
||||||
|
|
||||||
|
namespace Tesses.Http
|
||||||
|
{
|
||||||
|
public class ChangableRequestHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
public IRequestHandler Handler {get;set;}
|
||||||
|
public async Task Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
await RequestHandler.Guaranteed(ctx,Handler).Handle(ctx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Tesses.Http
|
||||||
|
{
|
||||||
|
public class ErrorRequestHandler : IRequestHandler
|
||||||
|
{
|
||||||
|
public async Task Handle(ServerContext ctx)
|
||||||
|
{
|
||||||
|
ctx.Response.SendStatusCodeHtml();
|
||||||
|
await Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue