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

Etykiety: , , ,

Red 15:45

Komentarze

Prześlij komentarz

Archiwum

Subskrybuj

RSS / Atom