PowerShell httplistener: запрос усекается - PullRequest
0 голосов
/ 27 февраля 2019

Я использовал очень простой скрипт веб-сервера, который я изменил, чтобы действовать как прокси.Тем не менее, при создании пост-запроса (выгрузка файла) он кажется неудачным для больших файлов.Небольшие файлы (пробованные с кучей файлов размером 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()
}
...