wtorek,
PowerShell: Serwer HTTP
PowerShell sam w sobie nie ma wbudowanego serwera HTTP, ale można go łatwo utworzyć za pomocą różnych metod. Jedną z popularnych metod jest użycie w tym celu .NET Framework lub .NET Core. Prezentowany przykład korzysta z .NET Framework i jest bardzo prosty. Wszystkie zależności wymagane przez ten skrypt są spełnione w domyślnej instalacji Windows 11. W zależności od konfiguracji systemu i zasad zabezpieczeń może być konieczne wykonanie dodatkowych kroków, takich jak uruchomienie skryptu z uprawnieniami administratora lub konfiguracja zapory sieciowej.
Pamiętaj, że podczas tworzenia produkcyjnego serwera HTTP, szczególnie dostępnego publicznie, ważne jest, aby zwrócić uwagę na aspekty bezpieczeństwa, takie jak uwierzytelnianie, szyfrowanie i ochrona przed atakami. Istnieją również inne narzędzia i moduły, które można zainstalować i używać w PowerShellu do tworzenia serwerów HTTP, takie jak Pode
czy Polaris
. Oferują one bardziej zaawansowane funkcje i są łatwiejsze w obsłudze niż bezpośrednie korzystanie z klasy HttpListener.
Przykład
HttpListener to klasa w .NET, która umożliwia prostą obsługę żądań HTTP. Możesz napisać skrypt PowerShell, który wykorzystuje tę klasę do stworzenia podstawowego serwera HTTP.
$listener = New-Object System.Net.HttpListener
$listener.Prefixes.Add("http://localhost:8080/")
$listener.Start()
Write-Host "Listening..."
while ($listener.IsListening) {
$context = $listener.GetContext()
$response = $context.Response
$responseString = "<HTML><BODY> Hello world!</BODY></HTML>"
$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseString)
$response.ContentLength64 = $buffer.Length
$output = $response.OutputStream
$output.Write($buffer, 0, $buffer.Length)
$output.Close()
}
$listener.Stop()
Ten skrypt uruchomi serwer, który nasłuchuje na porcie 8080 i odpowiada na wszystkie żądania wiadomością "Hello world!".
Omówienie przykładu
Prezentowany skrypt jest prostym przykładem tego, jak można użyć PowerShell i .NET Framework do stworzenia serwera HTTP. Może być użyteczny do celów testowych lub edukacyjnych, ale nie jest przeznaczony do zastosowań produkcyjnych ze względu na ograniczoną funkcjonalność i brak funkcji bezpieczeństwa.
Tworzenie obiektu HttpListener
$listener = New-Object System.Net.HttpListener
Ta linia tworzy nową instancję klasy HttpListener
. HttpListener
to klasa w .NET Framework, która umożliwia programowi nasłuchiwanie żądań HTTP i udzielanie na nie odpowiedzi.
Dodawanie prefiksu adresu URL
$listener.Prefixes.Add("http://localhost:8080/")
Dodanie do nasłuchiwanych przez serwer adresów URL prefiksu http://localhost:8080/
. Oznacza to, że serwer będzie nasłuchiwał żądań HTTP wysyłanych na adres localhost (czyli komputer, na którym działa skrypt) na porcie 8080.
Uruchomienie nasłuchiwania
$listener.Start() Write-Host "Listening..."
Uruchomienie nasłuchiwania na skonfigurowanych adresach URL i wypisanie informacji, że nasłuch jest aktywny.
Obsługa żądań
Do obsługi przychodzących żądań jest używana pętla while
:
while ($listener.IsListening) {
...
}
W każdej iteracji pętli skrypt czeka na nowe żądanie, a następnie je przetwarza.
Pobieranie kontekstu żądania
$context = $listener.GetContext()
Ta linia pobiera kontekst żądania HTTP, który zawiera informacje o żądaniu i odpowiedzi.
Tworzenie i wysyłanie odpowiedzi
Skrypt tworzy prostą odpowiedź HTML i wysyła ją do klienta:
$response = $context.Response
$responseString = "<HTML><BODY> Hello world!</BODY></HTML>"
$buffer = [System.Text.Encoding]::UTF8.GetBytes($responseString)
$response.ContentLength64 = $buffer.Length
$output = $response.OutputStream
$output.Write($buffer, 0, $buffer.Length)
$output.Close()
Tutaj odpowiedź ("Hello world!"
) jest konwertowana na bajty, a następnie wysyłana do klienta za pomocą strumienia wyjściowego (OutputStream
) obiektu odpowiedzi.
Zakończenie nasłuchiwania
Po wyjściu z pętli (np. przez przerwanie skryptu) serwer przestaje nasłuchiwać:
$listener.Stop()
To zatrzymuje serwer i zwalnia zasoby.