Golang, Serwer HTTP
piątek, 15 października 2010
Opisując ostatnio język Go (Go, Golang, Go…), nie zamieściłem żadnego przykładu. Pora nadrobić tą zaległość.
Tym razem, chciałem napisać coś chociaż trochę przydatnego:
Narzędzie udostępniające dowolny katalog używając protokołu http, pomyślane jako uzupełnienie do polecenia wget.
Opcje
Na początek przydało by się mieć możliwość określenia jaki katalog chcemy udostępnić i na jakim porcie.
wshare -http=:8080 -dir=$HOME/tmp
Oczywiście wypadało by aby oba parametry były opcjonalne
Oglądając przykłady programów pisanych w Go, można przeoczyć to że w odróżnieniu od C, funkcja main() nie ma żadnych argumentów. Ponieważ nie każde środowisko posiada linię poleceń, dostęp do argumentów, został przeniesiony do bibliotek.
Biblioteka os, udostępnia tablicę Args. Jednak istnieje wygodniejszy sposób: flag oferuje mechanizm podobny do getopts, z tą różnicą że na nieco wyższym nie związanym z linią poleceń poziomie.
Definicja flag
addr := flag.String("http", ":8080", "Listen address") dir := flag.String("dir", ".", "Directory to share") help := flag.Bool("help", false, "Display help") flag.Parse()
Myślę nie wymaga to specjalnych wyjaśnień. Mamy nazwę, wartość domyślną i opis pola. Trzeba jedynie pamiętać, że wszystkie otrzymane flagi są wskaźnikami, więc odwołanie do wartości będzie się odbywało z użyciem operatora *
.
Oto przykład wykorzystania flagi *help
if *help { flag.Usage() return }
Funkcja Usage(), wyświetla krótką ściągę wygenerowaną na podstawie podanej deklaracji.
Udostępnianie
Uruchomienie serwera:
error := http.ListenAndServe(*addr, http.FileServer(*dir, ""))
To wszystko, pozostaje tylko obsługa ewentualnych błędów.
Gotowe
Kompletny przykład wraz z Makefile jest dostępny na szsz.googlecode.com. Można go sciągnąć poleceniem:
svn co -r58 http://szsz.googlecode.com/svn/trunk/go wshare
Kompilacja tradycyjnie poleceniem make, przy założeniu że SDK jest zainstalowane i dodane do ścieżki wyszukiwania.
Podsumowanie
Biblioteka http, początkowo może wydawać się bardzo rozbudowana. W rzeczywistości jest jednak bardzo prosta w użyciu. Wszystko sprowadza się do poskładania razem paru klocków.
W rezultacie, napisanie serwera jest łatwiejsze niż klienta. To dla tego że gotowy przykład znajduje się w dokumentacji, podczas gdy biblioteki klienckie giną w tłumie.
Żeby oddać sprawiedliwość. Udostępnianie katalogów z użyciem http, nie jest niczym nadzyczajnym. Opisywałem już coś podobnego przy okazji zdalnej instalacji. Również wiele współczesnych języków takich jak Python, czy Ruby posiadają wbudowane odpowiednie biblioteki. Takie podejście staje się coraz popularniejsze i wydaje się koegzystować na równi z fastcgi.
Linki
- Instalacja Go: (Go, Golang, go...)
- Dokumentacja bibliotek os, flag i http
- wget (pobieranie plików)
- wshare (udostępnianie plików)
Etykiety: go, google, linux, programowanie
Red 15:45
Prześlij komentarz