Projekt służy wprowadzeniu w język golang, od strony pisania mikroserwisow z API http. Zaimplementowane zostały dwa proste endppointy http, służące dodawaniu danych pod wskazany klucz oraz pobieraniu danych z ponadanego klucza.
W celu ćwiczenia należy zaimplementować kolejne funkcjonalności z sekcji TODO, opisać błedy jakie program posiada (jeśli).
Serwer przechowuje w pamięci dane klucz-wartość.
Klucz obiektu może być dowolną wartością alfa-numeryczną (regexp: [a-zA-Z0-9]+
) o maksymalnie 100 znakach.
Dane obiektu mogą być dowolnymi danymi o maksymalnym rozmiarze 1 MB.
Ze strony: https://golang.org/dl/
$ tar xf go1.5.2.linux-amd64.tar.gz
$ mv go ~/goroot
$ mkdir ~/gopath
$ export GOPATH=${HOME}/gopath
$ export GOROOT=${HOME}/goroot
$ export PATH=${GOPATH}/bin:${GOROOT}/bin:${PATH}
$ go get github.com/truszkowski/gomemo
$ cd ~/gopath/src/github.com/truszkowski/gomemo
Pobranie zależności:
$ go get -v -d -t ./...
# lub
$ make deps
Zbudowanie i instalacja (instaluje do katalogu ${GOPATH}):
$ go build -v ./...
$ go install -v ./...
# lub
$ make build install
# uruchomienie:
$ gomemo
...
Testy:
$ go test -v ./...
# lub
$ make test
Poniżej opis aktualnie zaimplementowanych endpointow HTTP oraz ich krótki opis z przykładami.
Dodawanie danych pod klucz <object_id>.
$ curl -si 127.0.0.1:1234/v1/objects/abc -XPUT -d 'przykladowe dane'
HTTP/1.1 201 Created
$ curl -si 127.0.0.1:1234/v1/objects/niepoprawny_klucz -XPUT -d 'przykladowe dane'
HTTP/1.1 400 Bad Request
$ curl -si 127.0.0.1:1234/v1/objects/abc -XPUT -d 'ponad 1 MB danych...'
HTTP/1.1 413 Request Entity Too Large
Pobieranie danych spod klucza <object_id>
.
$ curl -si 127.0.0.1:1234/v1/objects/abc
HTTP/1.1 200 Ok
$ curl -si 127.0.0.1:1234/v1/objects/abc--
HTTP/1.1 400 Bad Request
$ curl -si 127.0.0.1:1234/v1/objects/niema
HTTP/1.1 404 Not Found
Zadania do zrobienia.
Zdefiniowanie odpowiednich limitów i ograniczeń kiedy serwer powinien zwracać odpowiednie błędy.
Np, co gdy będziemy chcieli dodać plik o rozmiarze 100 GB?
Dodanie endpointu HTTP listującego dostępne w pamięci obiekty
$ curl -s 127.0.0.1:1234/v1/objects/a1 -XPUT -d 'v1'
$ curl -s 127.0.0.1:1234/v1/objects/a2 -XPUT -d 'v2'
...
$ curl -s 127.0.0.1:1234/v1/objects/a9 -XPUT -d 'v9'
$ curl -s 127.0.0.1:1235/v1/objects
a1
a2
...
a9
Dodanie endpointu HTTP usuwającego wskazany obiekt.
$ curl -s 127.0.0.1:1234/v1/objects/a1 -XPUT -d 'v1'
$ curl -s 127.0.0.1:1234/v1/objects/a1
v1
$ curl -s 127.0.0.1:1234/v1/objects/a1 -XDELETE
$ curl -s 127.0.0.1:1234/v1/objects/a1 -i
HTTP/1.1 404 Not Found
W main_test.go
dopisać test sprawdzający poprawne zachowanie serwera w przypadku podania niepoprawnych danych dla endpointu PUT ...
.
Serwer powinien czyścić z pamięci obiekty dodane lub pobrane po minucie.
$ curl -s 127.0.0.1:1234/v1/objects/a1 -XPUT -d 'v1'
(po 40 sekundach)
$ curl -s 127.0.0.1:1234/v1/objects/a1
v1
(po 40 sekundach)
$ curl -s 127.0.0.1:1234/v1/objects/a1
v1
(po 61 sekundach)
$ curl -s 127.0.0.1:1234/v1/objcets/a1 -i
HTTP/1.1 404 Not Found
Jeśli program otrzyma któryś z sygnałów, powinien zamknąć socket nasłuchujący oraz zakończyć pracę.
Dodanie obslugi typu danych według MIME, czyli tego co jest podawane w nagłówku "Content-Type: text/html"
.
Klient dodając dane, np typu text/html, przy ich odczycie powinien dostać w odpowiedzi HTTP również taki nagłówek.
Np:
$ curl -s 127.0.0.1:1234/v1/objects/plik.html -XPUT -H'Content-Type: text/html' --data-binary @plik.html
HTTP/1.1 201 Created
$ curl -si 127.0.0.1:1234/v1/objects/plik.html
HTTP/1.1 200 Ok
Content-Type: text/html
...
Serwer powinien zapisywać dane nie w pamięci, lecz na dysku aby po zrestartowaniu serwera dane były nadal dostępne.
Umożliwienie zapisów tylko z wybranych adresów/klas IP IP. Dla pozostałych adresów na próby PUT
powinniśmy zwracać kod 403 Forbidden
.