Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
lancet
/
kvcache
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
a4de484c
authored
Aug 26, 2019
by
lancet
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
command line flags
parent
2545a8e7
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
46 additions
and
3 deletions
+46
-3
kvcache
+0
-0
main.go
+46
-3
No files found.
kvcache
View file @
a4de484c
No preview for this file type
main.go
View file @
a4de484c
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
(
"flag"
"fmt"
"net/http"
...
...
@@ -9,9 +47,14 @@ import (
)
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
)
storage
:=
new
(
vault
.
Store
)
storage
.
Init
(
10
)
storage
.
Init
(
*
ttlF
)
routing
:=
[]
web
.
Route
{
{
URL
:
"/storage/{id}"
,
Methods
:
[]
string
{
"GET"
},
Handler
:
router
.
GetValue
},
{
URL
:
"/storage/{id}/{value}"
,
Methods
:
[]
string
{
"PUT"
,
"POST"
},
Handler
:
router
.
SetValue
},
...
...
@@ -19,7 +62,7 @@ func main() {
}
router
.
InitRouter
(
routing
,
storage
.
Exchange
)
http
.
Handle
(
"/"
,
router
.
GetRouter
())
fmt
.
Print
ln
(
"Listening"
)
http
.
ListenAndServe
(
":8881"
,
nil
)
fmt
.
Print
f
(
"Listening: %s
\n
"
,
listenStr
)
http
.
ListenAndServe
(
listenStr
,
nil
)
return
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment