Commit a4de484c by lancet

command line flags

parent 2545a8e7
No preview for this file type
package main package main
/*
Реализовывать протокол HTTP с нуля не будем, маршрутизацию запросов тоже,
возьмём готовые.
Хранилище - полностью самодельное, даже реализация связанного списка.
Реализация - в чистом виде "proof-of-concept", даже контроль входных данных
отсутствует.
Есть опции командной строки, для настройки адреса и порта для простушивания,
а так же для изменения TTL записей.
Общая идея такова.
Клиенту доступно три метода: PUT (или POST, здесь эффект будет одинаковый),
GET и DELETE.
Для упрощения реализации (чтобы не городить "JSON RPC", поскольку вопрос
не в этом), ключ и значение задаются прямо в URI плейнтекстом. В случае,
когда потребуется включать пробелы или спецсимволы, моджно кодировать
в base64, например.
Таким образом, запрос вида
curl -X PUT http://localhost:8881/storage/mykey/somevalue
добавляет в хранилище ключ "mykey" со значением "somevalue", возвращает
код 200 и текст "OK".
Запрос вида
curl -X GET http://localhost:8881/storage/mykey
вернёт либо код 200 и "somevalue", либо код 400 и "FAILURE", если такого
ключа ещё/уже нет.
Запрос вида
curl -X DELETE http://localhost:8881/storage/mykey
удалит ключ "mykey" и вернёт код 200 с текстом "OK", либо вернёт код 400
с текстом "FAILURE", если такого ключа в хранилище нет.
*/
import ( import (
"flag"
"fmt" "fmt"
"net/http" "net/http"
...@@ -9,9 +47,14 @@ import ( ...@@ -9,9 +47,14 @@ import (
) )
func main() { func main() {
ttlF := flag.Uint64("ttl", 30, "time to live, seconds")
portF := flag.Uint("port", 8881, "port to listen")
hostF := flag.String("host", "0.0.0.0", "specific address to listen")
flag.Parse()
listenStr := fmt.Sprintf("%s:%d", *hostF, *portF)
router := new(web.Svc) router := new(web.Svc)
storage := new(vault.Store) storage := new(vault.Store)
storage.Init(10) storage.Init(*ttlF)
routing := []web.Route{ routing := []web.Route{
{URL: "/storage/{id}", Methods: []string{"GET"}, Handler: router.GetValue}, {URL: "/storage/{id}", Methods: []string{"GET"}, Handler: router.GetValue},
{URL: "/storage/{id}/{value}", Methods: []string{"PUT", "POST"}, Handler: router.SetValue}, {URL: "/storage/{id}/{value}", Methods: []string{"PUT", "POST"}, Handler: router.SetValue},
...@@ -19,7 +62,7 @@ func main() { ...@@ -19,7 +62,7 @@ func main() {
} }
router.InitRouter(routing, storage.Exchange) router.InitRouter(routing, storage.Exchange)
http.Handle("/", router.GetRouter()) http.Handle("/", router.GetRouter())
fmt.Println("Listening") fmt.Printf("Listening: %s\n", listenStr)
http.ListenAndServe(":8881", nil) http.ListenAndServe(listenStr, nil)
return return
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment