Я использовал очень простой скрипт веб-сервера, который я изменил, чтобы действовать как прокси.Тем не менее, при создании пост-запроса (выгрузка файла) он кажется неудачным для больших файлов.Небольшие файлы (пробованные с кучей файлов размером 100 КБ) не являются проблемой, но больший файл (6 МБ) не работает и, похоже, обрезается.
Если я проверяю запрос в Fiddler, я замечаю, что частьтела просто не хватает.
Похоже, что $request
не завершено или преобразование из $request
в $data
(с извлечением функции) завершилось неудачей.
IПодозреваю, что после прочтения данных у меня также возникнут проблемы с их записью, но я подозреваю, что решение будет таким же.
Код:
function get-route($pattern) {
if ($pattern -like "*GET*") {
$page = (Invoke-WebRequest -Uri ($baseURL+$request.Url.LocalPath) -UseBasicParsing -WebSession $webSession ).Content
return $page
}
if ($pattern -like "*POST*") {
$data = extract $request
$page = (Invoke-WebRequest -Uri ($baseURL+$request.Url.LocalPath) -UseBasicParsing -Method Post -Body $data -ContentType $request.ContentType -WebSession $webSession -MaximumRedirection 10)
$page = $page.Content
return $page
}
}
# get post data from the input stream.
function extract($request) {
$length = $request.ContentLength64
$buffer = New-Object "Byte[]" $length
# option 1
[void]$request.InputStream.Read($buffer, 0, $length)
# # also tried this, but the result is the same
# # option 2
# $recvdBytes = 0
# $currOffset = 0
# $currLength = $length
# $currRead = 0
# while ($recvdBytes -lt $length) {
# $currRead = $request.InputStream.Read($buffer, $currOffset, $currLength)
# $recvdBytes += $currRead
# $currOffset += $currRead
# $currLength -= $curRead
# }
$body = [System.Text.Encoding]::GetEncoding("iso-8859-1").GetString($buffer)
return $body
}
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add($url)
$listener.Start()
while ($listener.IsListening) {
$context = $listener.GetContext()
$request = $context.Request
$response = $context.Response
$pattern = "{0} {1}" -f $request.HttpMethod, $request.Url.LocalPath
$route = get-route $pattern
$request.Url.OriginalString
#$route
if ($route -eq $null) {
$response.StatusCode = 404
} else {
$content = $route
$buffer = [System.Text.Encoding]::UTF8.GetBytes($content)
$response.ContentLength64 = $buffer.Length
$response.OutputStream.Write($buffer, 0, $buffer.Length)
}
$response.close()
}