diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 1c67b00b..7211db60 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -11860,6 +11860,11 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "spark-md5": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.1.tgz", + "integrity": "sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==" + }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 0aea1e0d..99e9bae5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -19,6 +19,7 @@ "normalize.css": "^8.0.1", "noty": "^3.2.0-beta", "qrcode.vue": "^1.7.0", + "spark-md5": "^3.0.1", "vue": "^2.6.10", "vue-i18n": "^8.15.3", "vue-lazyload": "^1.3.3", diff --git a/frontend/src/api/files.js b/frontend/src/api/files.js index 2b5cf540..3c1a3bcc 100644 --- a/frontend/src/api/files.js +++ b/frontend/src/api/files.js @@ -1,8 +1,10 @@ import { fetchURL, removePrefix } from './utils' +import { md5Generate } from '../../src/utils/md5' import { baseURL } from '@/utils/constants' import store from '@/store' -export async function fetch (url) { + /* eslint-disable no-debugger */ +export async function fetch(url) { url = removePrefix(url) const res = await fetchURL(`/api/resources${url}`, {}) @@ -31,7 +33,7 @@ export async function fetch (url) { } } -async function resourceAction (url, method, content) { +async function resourceAction(url, method, content) { url = removePrefix(url) let opts = { method } @@ -49,15 +51,15 @@ async function resourceAction (url, method, content) { } } -export async function remove (url) { +export async function remove(url) { return resourceAction(url, 'DELETE') } -export async function put (url, content = '') { +export async function put(url, content = '') { return resourceAction(url, 'PUT', content) } -export function download (format, ...files) { +export function download(format, ...files) { let url = `${baseURL}/api/raw` if (files.length === 1) { @@ -82,7 +84,7 @@ export function download (format, ...files) { window.open(url) } -export async function post (url, content = '', overwrite = false, onupload) { +export async function post(url, content = '', overwrite = false, onupload) { url = removePrefix(url) let bufferContent @@ -90,34 +92,67 @@ export async function post (url, content = '', overwrite = false, onupload) { bufferContent = await new Response(content).arrayBuffer() } - return new Promise((resolve, reject) => { - let request = new XMLHttpRequest() - request.open('POST', `${baseURL}/api/resources${url}?override=${overwrite}`, true) - request.setRequestHeader('X-Auth', store.state.jwt) - - if (typeof onupload === 'function') { - request.upload.onprogress = onupload - } - - request.onload = () => { - if (request.status === 200) { - resolve(request.responseText) - } else if (request.status === 409) { - reject(request.status) - } else { - reject(request.responseText) + let partialUpload = function partialUpload(url, params, content) { + return new Promise((resolve, reject) => { + debugger; + let request = new XMLHttpRequest() + request.open('POST', `${baseURL}/api/resources${url}?override=${overwrite}${params}`, true) + request.setRequestHeader('X-Auth', store.state.jwt) + if (typeof onupload === 'function') { + request.upload.onprogress = onupload } - } - request.onerror = (error) => { - reject(error) - } + request.onload = () => { + if (request.status === 200) { + resolve(request.responseText) + } else if (request.status === 409) { + reject(request.status) + } else { + reject(request.responseText) + } + } - request.send(bufferContent || content) - }) + request.onerror = (error) => { + reject(error) + } + + request.send(content); + }) + } + + if (!content) { + //create folder or create new file + await partialUpload(url, "", content); + return; + } + + debugger; + let fileSize = content.size; + let mb = 1024 * 1024; + let fileSizeMB = fileSize / mb; + let chunkSize = fileSizeMB <= 50 ? 5 * mb : 10 * mb;//each chunck capacity + let totalChunks = Math.ceil(fileSize / chunkSize);//get total chunck pieces + let fileID = await md5Generate(content); + let allContent = bufferContent || content; + //totalChunks = 1; + for (let index = 0; index < totalChunks; index++) { + debugger; + let fileContent = null; + let startIndex, endInex; + if (index < totalChunks - 1) { + startIndex = index * chunkSize; + endInex = (index + 1) * chunkSize; + } else { + startIndex = index * chunkSize; + endInex = fileSize; + } + fileContent = allContent.slice(startIndex, endInex); + let params = `&fileID=${fileID}&chunckIndex=${index + 1}&totalChunck=${totalChunks}` + await partialUpload(url, params, fileContent); + } } -function moveCopy (items, copy = false, overwrite = false, rename = false) { +function moveCopy(items, copy = false, overwrite = false, rename = false) { let promises = [] for (let item of items) { @@ -130,15 +165,15 @@ function moveCopy (items, copy = false, overwrite = false, rename = false) { return Promise.all(promises) } -export function move (items, overwrite = false, rename = false) { +export function move(items, overwrite = false, rename = false) { return moveCopy(items, false, overwrite, rename) } -export function copy (items, overwrite = false, rename = false) { +export function copy(items, overwrite = false, rename = false) { return moveCopy(items, true, overwrite, rename) } -export async function checksum (url, algo) { +export async function checksum(url, algo) { const data = await resourceAction(`${url}?checksum=${algo}`, 'GET') return (await data.json()).checksums[algo] } diff --git a/frontend/src/utils/md5.js b/frontend/src/utils/md5.js new file mode 100644 index 00000000..cff3ad5d --- /dev/null +++ b/frontend/src/utils/md5.js @@ -0,0 +1,45 @@ +import sparkMD5 from 'spark-md5' + +/** + * + * @param {*} file + * @param {*default hash 2M stream file ,maxSpiece indecate how many times hash,there we need't get all file hash} maxSpiece + */ +export async function md5Generate(file, maxSpiece = 5) { + maxSpiece = maxSpiece > 20 ? 20 : maxSpiece < 5 ? 5 : maxSpiece; + return new Promise((resolve, reject) => { + var blobSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice, + chunkSize = 2097152, // Read in chunks of 2MB + chunks = Math.ceil(file.size / chunkSize), + currentChunk = 0, + spark = new sparkMD5.ArrayBuffer(), + fileReader = new FileReader(); + if (chunks > maxSpiece) { + chunks = maxSpiece; + } + fileReader.onload = function (e) { + spark.append(e.target.result); // Append array buffer + currentChunk++; + + if (currentChunk < chunks) { + loadNext(); + } else { + let hash = spark.end() + console.info('computed hash', hash); // Compute hash + resolve(hash); + } + }; + + fileReader.onerror = function () { + reject('oops, something went wrong.'); + }; + + function loadNext() { + var start = currentChunk * chunkSize, + end = ((start + chunkSize) >= file.size) ? file.size : start + chunkSize; + fileReader.readAsArrayBuffer(blobSlice.call(file, start, end)); + } + + loadNext(); + }) +} \ No newline at end of file diff --git a/http/resource.go b/http/resource.go index daeb344b..e7e070fe 100644 --- a/http/resource.go +++ b/http/resource.go @@ -128,7 +128,11 @@ var resourcePostPutHandler = withUser(func(w http.ResponseWriter, r *http.Reques if err != nil { return err } - + u, err := url.Parse(r.URL.RequestURI()) + fmt.Println(u) + if err != nil { + panic(err) + } file, err := d.user.Fs.OpenFile(r.URL.Path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) if err != nil { return err diff --git a/logs/2020-12-17.log b/logs/2020-12-17.log new file mode 100755 index 00000000..824a1684 --- /dev/null +++ b/logs/2020-12-17.log @@ -0,0 +1,69 @@ +2020-12-17 15:36:38.9919|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-17 15:36:39.2215|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 232.3995ms 200 text/html +2020-12-17 15:36:39.4287|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-17 15:36:41.7248|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2296.1272ms 200 application/json;charset=utf-8 +2020-12-17 15:37:43.9033|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-17 15:37:44.0489|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 148.1349ms 200 text/html +2020-12-17 15:37:44.1570|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-17 15:37:46.3277|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2170.6965ms 200 application/json;charset=utf-8 +2020-12-17 17:50:38.3509|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-17 17:50:38.5127|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 164.2284ms 200 text/html +2020-12-17 17:50:38.6389|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-17 17:50:38.8269|Imagine.WebAPI.Middlewares.ErrorHandlingMiddleware|ERROR|The following errors occurred with attribute routing information: + +Error 1: +Attribute routes with the same name '导入维护数据' must have the same template: +Action: 'Imagine.WebAPI.Controllers.v2.AgreementDataReport.SuperviseController.ImportRecord (Imagine.WebAPI)' - Template: 'api/v2/AgreementDataReport/supervise/import' +Action: 'Imagine.WebAPI.Controllers.v2.AgreementDataReport.TrainerController.ImportRecord (Imagine.WebAPI)' - Template: 'api/v2/AgreementDataReport/trainer/import' at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorBuilder.Build(ApplicationModel application) + at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorProvider.GetDescriptors() + at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context) + at Microsoft.AspNetCore.Mvc.Internal.ActionDescriptorCollectionProvider.UpdateCollection() + at Microsoft.AspNetCore.Mvc.Internal.ActionDescriptorCollectionProvider.get_ActionDescriptors() + at Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider.get_ApiDescriptionGroups() + at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath, String[] schemes) + at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext) + at Imagine.WebAPI.Middlewares.ErrorHandlingMiddleware.Invoke(HttpContext context, LogRecordServices logRecordServices) in C:\WorkSpace\ERP\Web\Imagine.WebAPI\Middlewares\ErrorHandlingMiddleware.cs:line 38 +2020-12-17 17:50:38.8269|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 197.5292ms 500 application/json +2020-12-17 17:50:43.5638|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui-bundle.js.map +2020-12-17 17:50:43.5638|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui-standalone-preset.js.map +2020-12-17 17:50:43.5638|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui.css.map +2020-12-17 17:50:43.5974|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui.css.map'. Physical path: 'N/A' +2020-12-17 17:50:43.5974|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 33.0553ms 200 text/plain +2020-12-17 17:50:43.6468|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-standalone-preset.js.map'. Physical path: 'N/A' +2020-12-17 17:50:43.6777|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 113.7774ms 200 text/plain +2020-12-17 17:50:43.6963|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-bundle.js.map'. Physical path: 'N/A' +2020-12-17 17:50:43.7193|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 155.5366ms 200 text/plain +2020-12-17 17:50:44.5492|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-17 17:50:44.5492|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 0.6966ms 200 text/html +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui-bundle.js.map +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui.css.map +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/swagger-ui-standalone-preset.js.map +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui.css.map'. Physical path: 'N/A' +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1.1869ms 200 text/plain +2020-12-17 17:50:44.6955|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-standalone-preset.js.map'. Physical path: 'N/A' +2020-12-17 17:50:44.7043|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-bundle.js.map'. Physical path: 'N/A' +2020-12-17 17:50:44.7043|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 7.9223ms 200 text/plain +2020-12-17 17:50:44.7449|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-17 17:50:44.7567|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/favicon-32x32.png +2020-12-17 17:50:44.7567|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/favicon-32x32.png'. Physical path: 'N/A' +2020-12-17 17:50:44.7567|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2.2996ms 200 image/png +2020-12-17 17:50:44.7567|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 64.6675ms 200 text/plain +2020-12-17 17:50:44.8547|Imagine.WebAPI.Middlewares.ErrorHandlingMiddleware|ERROR|The following errors occurred with attribute routing information: + +Error 1: +Attribute routes with the same name '导入维护数据' must have the same template: +Action: 'Imagine.WebAPI.Controllers.v2.AgreementDataReport.SuperviseController.ImportRecord (Imagine.WebAPI)' - Template: 'api/v2/AgreementDataReport/supervise/import' +Action: 'Imagine.WebAPI.Controllers.v2.AgreementDataReport.TrainerController.ImportRecord (Imagine.WebAPI)' - Template: 'api/v2/AgreementDataReport/trainer/import' at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorBuilder.Build(ApplicationModel application) + at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorProvider.GetDescriptors() + at Microsoft.AspNetCore.Mvc.Internal.ControllerActionDescriptorProvider.OnProvidersExecuting(ActionDescriptorProviderContext context) + at Microsoft.AspNetCore.Mvc.Internal.ActionDescriptorCollectionProvider.UpdateCollection() + at Microsoft.AspNetCore.Mvc.Internal.ActionDescriptorCollectionProvider.get_ActionDescriptors() + at Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescriptionGroupCollectionProvider.get_ApiDescriptionGroups() + at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath, String[] schemes) + at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext) + at Imagine.WebAPI.Middlewares.ErrorHandlingMiddleware.Invoke(HttpContext context, LogRecordServices logRecordServices) in C:\WorkSpace\ERP\Web\Imagine.WebAPI\Middlewares\ErrorHandlingMiddleware.cs:line 38 +2020-12-17 17:50:44.8547|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 110.7455ms 500 application/json +2020-12-17 17:51:31.7252|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-17 17:51:31.8726|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 150.0688ms 200 text/html +2020-12-17 17:51:32.0176|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-17 17:51:34.2256|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2208.0491ms 200 application/json;charset=utf-8 diff --git a/logs/2020-12-18.log b/logs/2020-12-18.log new file mode 100755 index 00000000..87acbb9e --- /dev/null +++ b/logs/2020-12-18.log @@ -0,0 +1,59 @@ +2020-12-18 09:37:01.6228|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/index.html +2020-12-18 09:37:01.7837|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 163.6062ms 200 text/html +2020-12-18 09:37:01.9117|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50828/swagger/v2/swagger.json +2020-12-18 09:37:04.0405|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2128.7722ms 200 application/json;charset=utf-8 +2020-12-18 09:42:48.7388|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/ +2020-12-18 09:42:48.8877|IdentityServer4.AccessTokenValidation.IdentityServerAuthenticationHandler|DEBUG|AuthenticationScheme: Bearer was not authenticated. +2020-12-18 09:42:49.1034|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 367.2512ms 404 +2020-12-18 09:42:58.2628|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/index.html +2020-12-18 09:42:58.2735|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 10.6388ms 200 text/html +2020-12-18 09:42:58.2919|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui.css +2020-12-18 09:42:58.2919|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-bundle.js +2020-12-18 09:42:58.2919|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-standalone-preset.js +2020-12-18 09:42:58.3459|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui.css'. Physical path: 'N/A' +2020-12-18 09:42:58.3591|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-standalone-preset.js'. Physical path: 'N/A' +2020-12-18 09:42:58.3591|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 72.4985ms 200 text/css +2020-12-18 09:42:58.3591|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 70.3671ms 200 application/javascript +2020-12-18 09:42:58.3755|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-bundle.js'. Physical path: 'N/A' +2020-12-18 09:42:58.3755|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 94.0118ms 200 application/javascript +2020-12-18 09:42:58.5457|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/v2/swagger.json +2020-12-18 09:42:58.5457|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/favicon-32x32.png +2020-12-18 09:42:58.5457|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/favicon-32x32.png'. Physical path: 'N/A' +2020-12-18 09:42:58.5457|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2.1855ms 200 image/png +2020-12-18 09:43:00.5989|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2053.1754ms 200 application/json;charset=utf-8 +2020-12-18 09:47:13.3514|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/index.html +2020-12-18 09:47:13.3514|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 0.7838ms 200 text/html +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui.css +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui.css'. Physical path: 'N/A' +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-bundle.js +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-standalone-preset.js +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-standalone-preset.js'. Physical path: 'N/A' +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2.225ms 200 text/css +2020-12-18 09:47:13.3837|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-bundle.js'. Physical path: 'N/A' +2020-12-18 09:47:13.3922|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 6.5196ms 200 application/javascript +2020-12-18 09:47:13.4344|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 48.6898ms 200 application/javascript +2020-12-18 09:47:13.5931|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/v2/swagger.json +2020-12-18 09:47:13.6227|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/favicon-32x32.png +2020-12-18 09:47:13.6234|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/favicon-32x32.png'. Physical path: 'N/A' +2020-12-18 09:47:13.6234|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1.1855ms 200 image/png +2020-12-18 09:47:15.1937|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1600.5697ms 200 application/json;charset=utf-8 +2020-12-18 09:49:01.2058|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/index.html +2020-12-18 09:49:01.2058|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 3.1039ms 200 text/html +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui.css +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui.css'. Physical path: 'N/A' +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-bundle.js +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/swagger-ui-standalone-preset.js +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1.8131ms 200 text/css +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-standalone-preset.js'. Physical path: 'N/A' +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/swagger-ui-bundle.js'. Physical path: 'N/A' +2020-12-18 09:49:01.2603|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 2.3299ms 200 application/javascript +2020-12-18 09:49:01.2671|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 5.4942ms 200 application/javascript +2020-12-18 09:49:01.7611|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/v2/swagger.json +2020-12-18 09:49:01.7770|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/favicon-32x32.png +2020-12-18 09:49:01.7770|Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware|INFO|Sending file. Request path: '/favicon-32x32.png'. Physical path: 'N/A' +2020-12-18 09:49:01.7770|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1.4089ms 200 image/png +2020-12-18 09:49:03.2900|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1528.8876ms 200 application/json;charset=utf-8 +2020-12-18 09:49:12.4573|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/v1/swagger.json +2020-12-18 09:49:20.9748|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 8517.5243ms 200 application/json;charset=utf-8 +2020-12-18 09:49:35.3671|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request starting HTTP/1.1 GET http://localhost:50829/swagger/v2/swagger.json +2020-12-18 09:49:36.8593|Microsoft.AspNetCore.Hosting.Internal.WebHost|INFO|Request finished in 1492.191ms 200 application/json;charset=utf-8 diff --git a/test/Download.zip b/test/Download.zip new file mode 100755 index 00000000..42ace2ff Binary files /dev/null and b/test/Download.zip differ diff --git a/test/new.md b/test/new.md new file mode 100755 index 00000000..e69de29b