diff --git a/web/api_handler.go b/web/api_handler.go index f635f2d..3b6940a 100644 --- a/web/api_handler.go +++ b/web/api_handler.go @@ -25,7 +25,7 @@ func (h *APIHandler) Shorten(c *routing.Context) error { return h.respondWithError(c, err) } - r := makeURLResponse(c, uid, url) + r := makeResponse(c, uid, url) return h.respond(c, &r) } @@ -37,11 +37,11 @@ func (h *APIHandler) Lookup(c *routing.Context) error { return h.respondWithError(c, err) } - r := makeURLResponse(c, uid, url) + r := makeResponse(c, uid, url) return h.respond(c, &r) } -func (h *APIHandler) respond(c *routing.Context, r *URLResponse) error { +func (h *APIHandler) respond(c *routing.Context, r *Response) error { resp, err := json.Marshal(r) if err != nil { return err @@ -53,10 +53,7 @@ func (h *APIHandler) respond(c *routing.Context, r *URLResponse) error { } func (h *APIHandler) respondWithError(c *routing.Context, err error) error { - r := ErrorResponse{ - Error: err.Error(), - } - + r := Response{Error: err.Error()} resp, err := json.Marshal(r) if err != nil { return err diff --git a/web/bindata.go b/web/bindata.go index 908c5d9..e77f0f6 100644 --- a/web/bindata.go +++ b/web/bindata.go @@ -1,5 +1,6 @@ // Code generated by go-bindata. // sources: +// static/furtive.min.css // static/main.css // templates/_foot.html // templates/_head.html @@ -72,7 +73,27 @@ func (fi bindataFileInfo) Sys() interface{} { return nil } -var _staticMainCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x4a\xca\x4f\xa9\x54\xa8\xe6\x52\x50\x48\xcb\xcf\x2b\xd1\x4d\x4b\xcc\xcd\xcc\xa9\xb4\x52\x50\xf2\x48\xcd\x29\x4b\x2d\xc9\x4c\x4e\x54\xf0\x4b\x2d\x4d\x55\xd2\x51\x80\x0b\xe8\x28\x28\x05\xa7\xa6\xe7\xa7\x2a\x84\x7a\x02\x85\x1d\x8b\x32\x13\x73\x74\x14\xd2\x8a\x52\x53\x8b\x13\xf3\x8a\x75\x14\x40\xa4\x6e\x71\x6a\x51\x66\x1a\x50\xa1\x63\x41\x41\x4e\xaa\x82\x73\x7e\x4e\x7e\x91\x82\x6b\x6e\x7e\x56\xa6\x12\x92\x6e\x2c\x22\xc1\x95\xb9\x49\xf9\x39\x4a\xd6\x5c\xb5\x5c\x80\x00\x00\x00\xff\xff\x3e\xe1\x83\x30\x98\x00\x00\x00") +var _staticFurtiveMinCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x5a\xdd\x8e\xa4\xba\x11\x7e\x95\xd6\x1c\xad\xb4\x1b\x01\x02\xfa\x77\x68\x25\x4a\x74\x6e\x72\x71\x92\x17\x58\xed\x85\xc1\xa6\x71\x86\x3f\x19\xf7\x4c\xf7\x41\xbc\x7b\xca\x3f\x80\x4d\xbb\x67\x27\x9a\xcc\xec\x6e\xf7\x34\x94\xcb\x5f\x95\xcb\xe5\x72\xe1\x22\x6d\xf0\xb5\xaf\x10\x3b\xd1\x3a\x09\x07\xd4\x51\x4c\x3c\x4c\x38\xa2\x65\xe7\x55\x88\xd6\x5e\x77\xae\xa0\xf9\xda\x63\xda\xb5\x25\xba\x26\x69\xd9\x64\x4f\x03\x27\x15\xdc\x71\x32\x91\xeb\xa6\x26\x03\x4a\x50\xc6\xe9\x33\xf1\x50\x52\x34\xcf\x84\xf5\xcd\x99\x97\xb4\x26\x02\x39\x4d\xd9\x77\x4e\x79\x49\x7e\xf4\x69\xc3\x30\x61\x7e\xda\x70\xde\x54\x49\xd4\x5e\x56\x18\x2e\x09\x1e\x52\xaf\xe3\xac\xa9\x4f\x7d\xde\xd4\xdc\x7f\x21\xf4\x54\xf0\x64\x1f\x86\x03\xce\x6b\x45\xeb\xf8\xb5\x24\x09\xe5\xa8\xa4\xd9\xd0\x9d\xa1\xc3\xb9\xd5\x2d\xf4\x4f\x92\xec\xb7\x5f\x8e\x42\xa0\x5f\xa8\xbe\xe1\xb1\x6d\x3a\xca\x69\x53\x27\x8c\x80\xbe\xa0\xdb\x11\xf4\xe2\x34\x43\xa5\x0f\x18\xa7\x3a\x49\x51\x47\x44\x97\x41\x20\xf1\xa6\x4d\xfc\x60\x4b\x2a\x81\xdd\x6b\x05\xfd\x20\x96\x94\xe7\x13\x8c\x92\x7f\x4d\x58\xd3\xf0\x6f\xbd\x18\x5f\x5e\x36\x2f\x49\x41\x31\x26\xf5\x90\xd3\xd3\x99\x91\xd1\x94\x11\xa9\x56\x9b\xb0\xbd\x0c\x05\x03\x98\x8b\xd0\x8e\xd6\xa7\x24\x03\x4d\x09\x28\x0b\xa4\xe3\xa8\xe2\xd0\x42\xb7\x09\x0d\x9d\x79\x33\x64\x0d\xcc\xc2\x53\x8a\x3d\x68\xf2\x3a\x54\xe9\x21\xe6\xa8\xa2\xe5\x35\xa9\x9a\xba\xe9\x5a\x94\x11\x6f\xba\x3a\xce\x26\x00\xc9\x43\x7a\x06\xc5\x6b\x8f\xd6\xed\x99\x7b\x4d\xcb\x4f\xac\x39\xb7\x1e\x8c\x93\x64\xdc\xe3\xe4\xc2\x11\x23\xa8\xcf\x9a\xb2\x61\x09\xad\x0b\xc2\x28\x97\x08\xd3\xcd\xe4\x10\x0a\x69\x56\xef\x99\x76\x34\x2d\xc9\x28\x41\x41\xf6\x02\xd2\xe7\x0c\xd5\x5d\xde\xb0\x4a\xf9\x82\xe6\x28\x78\x55\xae\xa4\x22\xdf\xf9\xb5\x25\x7f\x55\xe4\x1f\x9e\x41\x62\xa4\x23\xdc\xa2\x80\xf1\x2b\xca\x7f\xf4\xe0\x02\xe9\x13\xe5\x3e\x6a\x5b\x82\x00\x3e\x23\x89\xea\x7f\xcc\xce\xac\x03\xe5\xdb\x86\x82\x41\x99\x16\xf6\x1d\x9c\x11\x81\x76\xf8\x87\x29\x76\x22\xf6\xba\x13\x26\x39\x3a\x97\x5c\x77\x4a\x12\xbf\x6a\xfe\xf4\xf3\x26\x3b\x77\x3e\xad\x6b\xc2\x94\x26\xb7\x74\xed\xb7\xc2\xa9\x10\xc6\x62\x3a\xc3\x41\xb2\xf6\xa6\xcb\xd5\x60\x01\x54\x0e\xc6\x68\xea\x73\x95\x12\xf6\x03\x00\xf5\x70\x24\x9a\xdf\xb5\xb4\xf6\xcd\x99\xba\xc3\x0d\x6b\xc8\xe6\xee\xb5\x24\xe9\x2a\xa6\xd5\xc0\x46\x59\xe1\xb4\x9a\x98\xa0\x9c\x92\x12\x1f\xdd\xce\xe8\x80\x99\x15\x50\x04\x3f\x13\x48\xa5\x43\xe3\x7b\x1d\x30\xc9\x1a\x86\xc4\xe2\x73\xa9\x24\x9d\x44\xea\x04\xb3\x3f\x9a\x56\xc4\x82\xae\x29\x29\x5e\x75\xb4\x04\x9f\x9b\x1c\x71\x15\xb7\x97\xc9\xec\xc1\x1a\xd6\xe3\x2a\xd8\xc5\xf2\x67\x2f\x16\x67\x49\x4e\xa4\xc6\xae\x19\x9a\xdc\xdd\x5e\x62\xe3\xaa\xb8\x09\x35\x5c\x38\xcb\x18\xa2\x60\x89\x94\xa8\xed\x48\x32\x5e\x1c\x75\x83\x58\x75\x1a\x1f\x7b\xbc\xe8\x67\x79\xc1\x89\xe1\xf1\xd6\x2f\x49\xce\x93\x88\x91\x6a\x54\xc8\x67\x52\x90\x20\x49\x4e\x9f\x35\x2f\x66\x80\x98\x42\xe3\xe5\x38\x46\xd6\xd1\x76\x79\x49\x0c\x62\xd5\x49\x82\xc9\x28\x19\x4c\x6e\x1f\x53\x06\xcb\x53\x46\xbf\xe6\xe5\x38\xf6\x59\x90\x5d\x9c\x26\xc8\x0b\x43\x6d\x22\xfe\xcc\x00\x33\x69\x71\x5b\x21\xb8\xa3\x98\x17\x49\x14\x86\x5f\xa6\x11\x0a\x3b\xfa\x91\xbf\xeb\x8d\xf6\x5d\xb0\x83\x7f\xfb\x2f\xb6\x30\x88\xc6\xb4\x33\x1b\x47\x91\x10\x09\x73\xc2\x18\xc1\x3a\xca\x4d\x1c\xae\x6e\xb6\xe0\xd8\x12\xbc\x5e\x07\x6b\xf1\xcf\x29\xd8\x68\xbc\x23\x78\xe6\x70\x75\xb3\x05\xaf\x2d\xc1\xdb\xd0\x29\x52\x92\xef\x08\x13\x6d\x36\xab\x2d\x60\x63\x09\xd8\xbd\x66\xd2\xdd\x4f\x4d\xba\x73\x99\x74\xe7\x36\xe9\xd6\x12\x7c\x78\xcd\xa4\x87\x9f\x9a\xf4\xe0\x32\xe9\xc1\x6d\x52\xcb\x85\x42\xb7\x45\x15\xfd\x9e\xe3\x84\xb6\x4d\x9d\x7e\xea\x2d\x09\xbe\x5f\x9e\x1c\xc4\x0a\x3b\x88\x5d\xe5\x2d\xdd\xef\x86\x70\x8b\x17\xbb\xf0\x62\x17\xde\x7a\x89\xb7\x76\xe1\xad\x5d\x78\x6b\x17\xde\x66\x89\xb7\x71\xe1\x6d\x5c\x78\x1b\x17\xde\x76\x89\xb7\x75\xe1\x6d\x5d\x78\x5b\x17\xde\x02\xcd\x81\xe5\x40\x92\x38\xbd\xe9\x1c\x49\x34\xf9\x04\x5c\x8e\x14\x77\xb4\x04\x84\x73\x55\xbb\x02\xa6\x6e\x71\x53\x9d\x71\xfc\xc6\xb9\xde\xe9\x4b\xef\x74\x9d\x77\x7a\xca\x3b\x1d\xe3\x5d\x7e\xf0\x3f\x4c\xfc\x47\x04\x89\xbf\x57\x04\x53\xb4\xea\x32\x46\x48\xbd\x42\x35\x5e\x7d\xad\x20\x27\xd3\xbb\x4a\x0c\x3b\xfa\xb7\xde\x35\x83\xbf\x6c\xd3\x5b\x08\xff\xdc\x8d\x6f\x21\xfc\x63\x36\xbf\x85\x90\xcf\xdd\x00\x17\xc2\x3f\x73\x13\xfc\x30\x1f\x7f\xdd\xc9\x37\x87\x3b\x4e\x5e\xe1\x5f\xe8\xe4\x96\xf0\xcf\x76\x72\x4b\xf8\x47\x39\xb9\x25\xe4\xb3\x9d\xdc\x12\xfe\xb9\x4e\x6e\xbb\xd5\x27\x39\xf9\x6e\x73\xc7\xc9\xcb\xd3\x2f\x74\x72\x4b\xf8\x67\x3b\xb9\x25\xfc\xa3\x9c\xdc\x12\xf2\xd9\x4e\x6e\x09\xff\x5c\x27\xb7\xdd\xea\xff\xe7\xe4\x7f\xf1\x92\x04\xe5\x9c\x30\xf8\x4d\x49\xde\x30\xe2\x3e\x67\x18\x82\x8a\xa0\x4e\x1d\x5d\x5e\xcc\x40\x3f\x9f\xbd\xc8\x03\x93\xf1\xbc\xf0\xb7\xf5\xe6\xf1\x80\x53\xf3\xac\x57\x9e\x91\x4d\x67\xbe\x9a\x2d\x8e\xf6\x38\x4d\x87\x20\x3d\xf9\x3e\xa8\xda\xa7\x28\x7b\x12\x27\x2e\x35\xf6\x35\x07\xd9\x6f\xb2\x75\xa6\x38\x1a\x86\xea\x13\x71\x30\xe5\xeb\xc7\x2c\x8a\x15\x53\x5a\x9e\x5d\x2c\x5a\x21\xc9\x72\x12\x4b\xda\xc1\x13\x6f\x53\x74\xd8\x28\x9e\x97\x82\x72\xa7\xa8\x3c\x57\x0c\xa5\x38\xa3\x01\x28\x74\xbd\xe5\x62\xa7\x14\x7d\x8d\xa3\x9d\x37\x7e\x83\xc7\xc7\x6f\xaa\x5b\x45\xf1\x6b\x9d\xa2\xcd\xc6\x1b\xbf\x73\x27\x8c\xd8\xd3\x6b\xbd\xf6\xb1\xa7\x3e\x73\x97\x26\xcf\xef\x8d\x41\x69\xb7\x0d\xbd\xf1\xab\x7a\xe5\x35\x57\x93\xb0\xb0\xbc\xa4\x6b\xd3\x2f\xec\x2d\x9b\xa4\xc1\x17\x56\x96\x0d\xca\xcc\x0b\xdb\xca\x16\xa5\x98\x69\x51\x49\x36\x4c\xfa\xaa\x1d\x25\xf3\x64\xc8\x57\xad\x27\x59\x67\xf3\xdd\xb7\x99\x1a\xe5\x64\xb4\x57\x2d\x55\x85\x73\x31\x24\xa8\x2e\xe3\x9d\x3a\xc8\x0b\xf5\x92\xd0\x87\x78\x82\xe3\x3a\x71\x88\xd2\xc1\xc4\xa0\x2b\x07\x82\x23\x9a\x4a\x02\xf2\xcc\xaf\xba\x44\x16\x66\x34\xaf\x34\xeb\x6c\xb0\xba\x46\x26\xb2\xc9\x36\xd6\x4d\x14\x5f\x3c\xe2\xc7\x1a\x3f\xb6\xf0\xe3\x1b\x7c\xcd\x77\x8d\x4d\xfc\xf8\x16\x5f\xf1\xb5\xa1\x79\xb6\xd9\x5e\x42\xfb\x6c\x33\x5c\x1c\x6c\x0a\x9e\xeb\xcc\xa3\x8c\x32\xde\xcd\x56\x69\xa3\x09\x55\x0d\xa3\xbd\x44\x6f\x3c\x34\x6d\xaf\x91\x05\x6f\x31\x5a\xa6\x69\xe3\x49\x88\x1e\xcb\x25\xb6\x85\xc4\xb7\x42\x34\xe7\x35\xb6\x84\xc4\x0e\x21\x92\x53\xd4\x19\x8c\xfa\x53\x14\xb7\x97\xb7\x3c\x28\x6a\xaa\x1d\x70\xbf\xf5\x4b\xb4\x2d\xa0\xbd\x29\x25\x5f\x76\xdc\x89\x8e\xb2\xb4\x67\x16\x8e\xfe\x49\xca\x67\x22\x6a\x5f\xff\x26\x67\xe2\xff\x21\xc6\xeb\x3d\x4c\xc4\x95\xa0\xae\x24\xf5\x61\x49\x7e\xf0\xa6\x7b\xef\x1f\x8c\xa2\xd2\xeb\x50\xdd\xf9\x1d\x61\x34\x3f\x9a\x27\xe8\x9b\x30\xb4\x0a\x70\x51\x70\xd8\x1e\xc7\x08\xb2\x5e\x83\x65\x3d\xb3\x5e\xe7\x72\xeb\x60\x2d\xa7\xa0\x88\xbc\xa0\x80\x25\x5c\xac\xe1\xbb\xf1\xe0\x16\xee\xe0\xa6\xd8\x4c\x0b\x2a\xd8\x44\x22\x59\x5b\x85\xab\x60\x2b\x80\x4c\x45\xc6\x4a\x96\xad\xcc\x26\x96\xc0\x45\x64\xaf\xda\x59\xa1\x35\x84\x81\x83\x92\x0f\xd2\x62\x43\xd5\x38\x38\xc4\x7b\xd5\x02\x4a\xac\xcd\x41\x40\x9f\x47\xd5\xb2\x11\xea\x99\x2d\x4a\x43\x68\xd9\x7a\xf0\x91\xb5\x85\x15\x2f\x2c\x96\x28\x56\xee\x5a\xec\xbc\x62\x67\xb4\x04\x07\xa5\x48\xca\x6b\x78\xde\xf3\x82\xae\x42\x25\xd8\x5d\xfc\x35\xb9\xf6\xe1\x1e\xb8\x64\xc5\x50\x14\x12\xcd\xf9\xfe\x57\x53\xa3\xac\xf1\x1e\xfe\x38\x67\x14\xa3\xd5\xef\x4d\xdd\x35\x25\xcc\xe5\xef\xcd\x99\x51\x48\x0c\xa6\xf2\xe1\x10\xa8\x8a\xaa\xa3\xc6\x1a\xf0\x82\xd6\x56\x91\x04\xd2\x0b\x50\xaa\x29\xf1\x4d\xe9\x24\xc8\x50\xdb\x2d\x06\xf9\x8c\xc0\x5d\x6a\x9e\x48\xbd\x7d\xc1\x30\x04\xff\x39\x77\x9c\xe6\x57\x55\x36\x54\x55\x58\x4d\x1a\x02\x52\x96\xb4\x85\x2c\x46\x35\x4e\x35\x9b\x91\x7c\x94\x31\x5c\x96\x5f\x44\x09\x49\x16\x1d\x96\x95\xd8\xa0\x3a\x73\xd8\xeb\x1a\x51\xa2\xe1\x57\xb0\x10\x28\x56\x12\xc4\x72\x7a\x51\x19\x51\xaf\x2b\x5f\xc9\xc3\xc3\x54\x3c\x91\x5a\x1f\x25\x1f\x24\x47\xbc\x80\x6d\xa3\x14\xfb\x16\x84\x89\x1e\xc0\x11\x4f\xc4\xa5\xa6\xca\x50\xa1\xc9\xf2\x5a\xd3\x45\x4d\x4b\x93\x65\x79\x2b\xc8\x88\x28\x4f\x8e\x0e\x2b\xf3\xa8\x80\xc3\xb8\x7c\xdd\x60\x58\x40\x51\x74\xb3\x12\x60\xb4\x6a\x29\xb2\x51\x28\x32\x5b\xd9\x60\x52\x1a\x36\xc2\x16\xfe\x15\x7c\x26\x63\x0d\xf8\xca\x68\x1e\xff\x9a\x28\xca\x10\xbc\xc0\x1c\x7a\xf2\x2f\x70\xf5\x46\xea\x69\x17\xf9\xdf\x74\xe2\x65\xa3\x88\x21\x4e\x28\xb4\x96\xab\x4f\x81\x0d\x19\xaa\x9f\x51\xe7\xd1\x9c\xa1\x8a\x78\xb4\x3a\x8d\x05\xe9\xee\xf9\x34\x15\xa5\xbd\x67\x8a\x49\xd3\x2f\xeb\x48\x29\xc3\x0c\xac\x22\x32\x1d\x82\x3d\xb1\x24\x3c\xb5\x2e\x44\x86\xa2\x2f\x45\x16\x30\x5d\x82\xc2\xfa\x1a\x54\x78\xd2\x97\x32\x0d\x55\x89\x2f\x43\x98\x9e\xe1\xa9\x07\xe2\xa4\x06\x37\x93\x3e\x55\x45\x14\x9e\xaf\xab\x91\xf7\xb2\x3e\xd9\x73\xce\xfb\xdc\xfd\x1c\x89\x9f\xec\x67\xa4\x7e\xee\x8e\xcb\xdc\x4f\xf6\x32\xb2\xbf\x3b\x6a\xde\x24\x35\xef\x30\xd7\x54\x72\x15\x01\x76\x25\xc3\xb5\x16\x1b\x4f\xa5\xda\xdf\xb2\x2c\x33\x62\xfc\x51\x7a\xe4\x5c\xfc\x95\x4b\xe1\xe8\xf0\x74\x10\x32\x3e\x43\xc8\x6b\xf5\x18\x21\x2f\xd5\x93\x84\x3b\xbd\x0d\x3d\xf1\x3f\x08\xb7\xdf\x46\xa1\xa1\x8c\x48\xa3\xf6\x46\xed\x16\x1a\xe5\x5b\x09\x2d\xb8\x56\xcd\x8f\xcb\xe7\x85\xb1\xc7\x3d\x71\x8e\xbe\x11\xde\xe5\x68\x3b\xcc\xd6\xb4\xa5\xfd\x16\xef\x1f\x63\xfc\x78\xbc\xf7\x90\x72\xb4\x1e\x35\x46\x0c\xd3\x0a\x9a\x32\xdb\x42\x13\xac\x67\x2b\xe8\xee\x10\x31\x3d\x71\x4d\x73\xba\x54\x2e\x46\x8f\xfb\xbd\xab\xa7\xcc\xe0\x6f\x95\x93\x20\xb6\x76\x8a\x64\xaa\xa7\x28\x6f\xd0\x2f\xc2\x87\x7c\xb7\x1d\x66\xf7\xb3\xd5\x93\x93\xbb\x7d\xf4\xd4\x47\x78\xee\x2d\xc6\xed\xb2\x70\x29\x0d\xa1\x67\xa1\xb3\xa8\x8e\x5b\x2a\x03\xe1\xe7\x1a\x4b\x69\x9b\x9d\xa7\x3e\xd3\x5a\xb2\x02\xc9\xf8\x44\xb5\x59\x6f\xe3\xad\x63\xd0\xea\x51\xeb\x56\x4b\x80\xb0\x95\x14\x04\x53\x47\x71\xff\x06\xa3\xe2\x5d\x8c\x22\x34\x66\x09\xf6\x7a\x1d\x82\x92\x76\xb0\x61\x9c\x6b\xb9\xa5\xe3\x5e\xde\xca\x6b\x5f\xbc\xb9\xa1\x36\x29\xf5\x96\xd0\xf4\x9a\x84\x85\xb0\xc8\xcd\x14\xcd\xda\x24\x8e\xc6\xee\x21\xcf\x17\x0a\x84\x61\x2b\x96\x6b\xfe\xad\x71\xd4\xf1\xe6\x8f\x91\x9e\x41\x06\xa9\x9e\x58\xc4\x66\xd4\xbf\xef\xad\x08\x19\x80\x7c\x08\x9e\x55\x27\x1b\xc0\x18\x88\xf1\xf9\x64\x45\x05\x28\x45\x74\xf3\x6a\x3d\x56\xea\xc7\xb7\xde\xfa\x1a\x9f\x53\x26\x6d\x47\x2e\x99\x89\xdb\xc5\x48\x48\x5a\x43\xa3\x20\x29\x6f\xe7\x4b\xf5\x16\xca\xdf\x78\x41\x10\x5e\xbc\x2e\xf7\xd3\x70\xaf\x33\x03\x3c\xa7\x08\xd3\x94\xc6\x72\xfe\x5e\x00\x4f\xbd\xb3\xa1\xde\x55\xb2\x73\xe4\xe1\xbf\x01\x00\x00\xff\xff\xe5\x79\x61\x74\x12\x28\x00\x00") + +func staticFurtiveMinCssBytes() ([]byte, error) { + return bindataRead( + _staticFurtiveMinCss, + "static/furtive.min.css", + ) +} + +func staticFurtiveMinCss() (*asset, error) { + bytes, err := staticFurtiveMinCssBytes() + if err != nil { + return nil, err + } + + info := bindataFileInfo{name: "static/furtive.min.css", size: 10258, mode: os.FileMode(420), modTime: time.Unix(1468778746, 0)} + a := &asset{bytes: bytes, info: info} + return a, nil +} + +var _staticMainCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\x54\x4d\x6f\x13\x31\x10\xbd\xe7\x57\x8c\x8a\x90\xa0\xc4\x69\x36\x69\xd2\xb2\x3d\x01\x2a\x02\x21\xc4\x81\x03\x67\xaf\x77\xbc\xb1\xea\xf5\x58\xb6\x43\xd2\x56\xfc\x77\x6c\x67\xf3\xd5\xa6\x34\x12\x88\x4b\x94\xb5\xdf\xbc\x79\xf3\x66\xc6\x15\xd5\xb7\x70\xdf\x03\x90\x64\x02\x93\xbc\x55\xfa\xb6\x84\x93\x6f\x16\x0d\x7c\xe7\xc6\x9f\xf4\xe1\x13\xea\x9f\x18\x94\xe0\x7d\x78\xe7\x14\xd7\x7d\xf0\xf1\x82\x79\x74\x4a\x5e\xad\x23\x17\xa8\x9a\x59\x28\xc1\x90\x6b\xb9\x4e\xc7\x5a\x19\x64\xb3\xee\xb8\x18\x4c\xae\x7a\xbf\x7a\xbd\xc1\x82\x9c\xae\x73\x42\x4b\x5e\x05\x45\xa6\x04\xa9\x96\x58\xa7\x90\x40\xb6\x84\xa1\x5d\xe6\xff\xb8\x0c\x8c\x6b\xd5\x44\x80\x40\x13\xd0\xa5\xd3\x8a\x42\xa0\x76\x03\x5a\xa8\x3a\xcc\x22\xfb\x70\xf8\x72\x97\x7e\x20\xa2\xa4\x18\x93\xf3\x74\x98\xc9\xe5\xf9\x2a\x66\x9b\x97\x57\x9e\xf4\x3c\xe0\x26\xf5\x24\xd1\x44\xe5\x28\xc3\xe6\x83\xb5\x74\xc7\x82\x8b\x15\xcb\x58\x5a\x09\xf9\xaf\xe6\x01\x5f\xb1\x88\xe8\x43\xfa\x7d\x9d\x81\x74\x1c\xac\xf5\xc7\xe1\x16\x58\xdd\xa8\x70\x14\xf6\x79\x4c\xf2\x46\x53\x43\x6c\xe1\xb8\xb5\xe8\xfe\xd4\x72\xf8\x40\xa6\x46\xe3\xb1\x7e\xb6\xf9\x6b\xda\x2d\x9d\x57\x77\x58\xc2\xb4\xf3\x7a\xdd\xfe\x8b\xae\x5f\x2d\x77\x8d\x32\x2c\x9b\xcd\x46\x93\x74\x98\x28\x7c\xe4\xe0\xe6\x21\x49\xb1\xb9\x6f\xd1\x7b\xde\x60\x06\xec\x52\x8c\x86\x0f\x10\x03\x74\x8e\x56\xc5\x09\xd2\xe4\x4a\x78\x81\x17\xe7\x62\x2c\xf6\x79\x94\xb1\xf3\xd5\x70\x54\x5c\xdc\x34\x8e\xe6\xa6\x66\x5d\x40\x36\xd0\x72\x17\xc7\x67\x35\x70\xae\x46\x97\xe6\xda\xe4\x39\x59\xd3\x8e\xc7\xe3\xab\xbf\xdf\x9a\x55\xa1\xa3\x62\xe5\xce\x13\x8b\x64\x79\x5d\x2b\xd3\xc4\xa1\xdf\x5a\xd8\x7d\x1c\x5a\x92\xdd\x42\x07\xca\x48\xda\xb3\x63\x3a\x9d\x6e\xb3\x87\x5b\x1d\xd3\xab\x10\x19\xc4\x03\x4d\xc5\x68\x6d\x6d\x9a\xab\x47\xce\x17\xc3\xbd\xeb\xad\xa1\xff\xc3\x90\x47\x5b\xbf\xd5\x50\x4a\x12\x73\x0f\xf7\x40\xf3\x90\x1e\xa0\xae\x71\xb0\x41\x55\xf3\xf8\x80\x98\x3d\x4b\xa4\x94\xff\xac\x95\xc5\xe5\x01\xe5\x15\xe9\x3a\x0b\x2d\xcb\xf5\x56\x67\xb1\xcc\x6a\x2e\x70\x16\x6f\xd3\x42\xc2\xd9\x29\xfc\xc0\xea\x8b\x0a\x7d\x78\x1f\xb5\xdf\xf4\xe1\xba\x8e\x3d\x3c\x3d\xdb\xd1\x2a\x44\x1e\xe5\x32\xbf\x4a\x8f\xc2\xbf\xd2\x9d\xd2\x9a\xc3\x47\xe5\x50\xd2\x12\xce\xe3\xb3\x16\x25\x1d\xa0\x00\x20\xcb\x85\x0a\xb1\x54\x28\x32\xe3\x91\x94\xc5\xdb\x37\x47\xd1\xa5\x67\xee\x89\x22\x3f\xa7\x39\x35\x18\xe0\x7a\x69\x23\x47\x3c\x2e\x86\xac\x28\x0e\x16\xfa\x3b\x00\x00\xff\xff\xb9\x1d\xa4\x50\x9f\x06\x00\x00") func staticMainCssBytes() ([]byte, error) { return bindataRead( @@ -87,7 +108,7 @@ func staticMainCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "static/main.css", size: 152, mode: os.FileMode(420), modTime: time.Unix(1468518898, 0)} + info := bindataFileInfo{name: "static/main.css", size: 1695, mode: os.FileMode(420), modTime: time.Unix(1468801300, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -112,7 +133,7 @@ func templates_footHtml() (*asset, error) { return a, nil } -var _templates_headHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x64\x90\xc1\x6a\xf3\x30\x10\x84\xef\x79\x8a\xfd\x75\xfe\x15\xd3\x5b\x0f\x56\x20\x24\x39\x14\x0a\x2d\x6d\x03\xed\x51\x91\x27\xd5\x12\x59\x72\xa5\x75\x42\xfa\xf4\x75\x62\x02\x2e\x3d\x69\x06\xe9\xd3\xcc\x6e\xfd\x6f\xfd\xb4\x7a\xfb\x78\xde\x90\x97\x36\x2c\x66\xf5\x78\x10\xd5\x1e\xb6\xb9\x88\x41\xb6\x10\x4b\xce\xdb\x5c\x20\x46\xf5\xb2\xd7\xf7\x6a\x7a\xe5\x45\x3a\x8d\xaf\x9e\x8f\x46\xbd\xeb\xed\x52\xaf\x52\xdb\x59\xe1\x5d\x80\x22\x97\xa2\x20\x0e\xdc\xc3\xc6\xa0\xf9\xc4\x2f\x32\xda\x16\x46\x1d\x19\xa7\x2e\x65\x99\x3c\x3e\x71\x23\xde\x34\x38\xb2\x83\xbe\x9a\xff\xc4\x91\x85\x6d\xd0\xc5\xd9\x00\x73\x77\xfb\x48\x58\x02\x16\xe9\xbb\x9f\x73\xaa\xab\xd1\xfd\x89\x68\x50\x5c\xe6\x4e\x38\xc5\x49\xca\x08\x91\xa6\x25\xad\x73\x1f\x0f\x88\xb4\x7d\x79\xa4\x57\x3f\x94\x41\x44\xbe\x45\x04\x8e\x07\xca\x08\x46\x15\x39\x07\x14\x0f\x0c\x65\x7d\xc6\xde\xa8\xaa\xc8\x30\xaa\xab\x5a\xcb\x71\xee\x4a\xb9\x32\x75\x35\xae\xef\x22\x77\xa9\x39\x2f\x66\x3f\x01\x00\x00\xff\xff\x55\xce\x24\xf7\x69\x01\x00\x00") +var _templates_headHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x92\x4b\x6f\x13\x31\x10\xc7\xef\xfd\x14\x66\xaf\x8d\xd7\x41\x54\x80\xaa\x75\x50\x95\xf6\x80\x84\x54\x44\xa9\x04\x47\xc7\x9e\x8d\x47\xf5\x0b\xcf\x6c\xd2\x20\x3e\x3c\x4e\x43\x51\x2a\x2e\xe1\xe4\xff\x3c\x7e\xfe\x8f\x1f\xc3\xab\xeb\xdb\xe5\xd7\xef\x9f\x6f\x84\xe7\x18\x16\x67\xc3\x61\x11\x62\xf0\x60\xdc\x5e\x34\x19\x81\x8d\xb0\xde\x54\x02\xd6\xdd\xc4\xa3\x7c\xdf\x1d\x97\x3c\x73\x91\xf0\x63\xc2\x8d\xee\xbe\xc9\xfb\x2b\xb9\xcc\xb1\x18\xc6\x55\x80\x4e\xd8\x9c\x18\x52\xe3\x3e\xde\x68\x70\x6b\x78\x41\x26\x13\x41\x77\x1b\x84\x6d\xc9\x95\x8f\x9a\xb7\xe8\xd8\x6b\x07\x1b\xb4\x20\x9f\x82\x99\xc0\x84\x8c\x26\x48\xb2\x26\x80\x7e\xfd\xbc\x11\x23\x07\x58\xe4\x9f\x53\x8f\x79\x50\x87\xe8\x1f\x0b\x07\x64\x2b\x16\xc6\x9c\x8e\x5c\x0e\x90\x90\xe2\x4a\x5c\xd7\x29\x3d\x40\x12\xf7\x5f\x3e\x89\x3b\xdf\x86\x81\x04\xf5\xd9\x22\x60\x7a\x10\x15\x82\xee\x88\x77\x01\xc8\x03\xb4\x61\x7d\x85\x51\x77\x4a\x45\xf3\x68\x5d\xea\x57\x39\x33\x71\x35\x65\x1f\xd8\x1c\xd5\xd8\x6c\xa4\xd9\x02\xe5\x08\xea\xa2\x7f\xdb\xbf\x51\x96\xe8\x45\xba\x8f\xd8\x7a\x89\x4e\x33\xda\x93\xd4\xaf\x73\x5e\x07\x30\x05\xe9\xc9\xa5\xd1\x1f\x46\x13\x31\xec\xf4\x6d\x81\x74\x7e\x67\x12\x9d\x2f\x73\x72\x90\x08\xdc\xe5\xbb\xf9\xfc\xd7\xdf\xfc\xe5\xc5\x7c\x8e\x6c\x02\xda\x59\x53\xb3\x56\xeb\x04\xef\x4a\xbb\x1f\x86\x47\x56\xa7\x0e\x42\xdc\x1e\xd7\xaa\x71\xaa\x8c\x9b\xff\x3b\xc3\x1f\x34\x9a\x23\x66\x50\x87\xbf\xb6\x97\xab\xec\x76\x8b\xb3\xdf\x01\x00\x00\xff\xff\xf7\x58\x69\x35\x96\x02\x00\x00") func templates_headHtmlBytes() ([]byte, error) { return bindataRead( @@ -127,12 +148,12 @@ func templates_headHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/_head.html", size: 361, mode: os.FileMode(420), modTime: time.Unix(1468764427, 0)} + info := bindataFileInfo{name: "templates/_head.html", size: 662, mode: os.FileMode(420), modTime: time.Unix(1468801417, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _templatesIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xaa\xae\x2e\x49\xcd\x2d\xc8\x49\x2c\x49\x55\x50\x8a\xcf\x48\x4d\x4c\xd1\xcb\x28\xc9\xcd\x51\xaa\xad\xe5\x52\x00\x82\xf0\xd4\x9c\xe4\xfc\xdc\x54\x85\x92\x7c\x85\xfc\xaa\x52\xbd\xcc\x7c\x1d\x85\x44\x85\x94\xa2\xd2\xbc\xec\xd4\x3c\x85\xd0\x20\x1f\x85\xe2\x8c\xfc\xa2\x92\xd4\xbc\xd4\x22\x3d\x2e\x14\x93\xd2\xf2\xf3\x4b\xe0\x26\x01\x02\x00\x00\xff\xff\x93\x8b\x7b\xb5\x64\x00\x00\x00") +var _templatesIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x53\x3b\x93\x9b\x30\x10\xee\xef\x57\xec\xa8\x39\xbb\x00\xfa\x04\x5f\x91\x99\x2b\x32\x93\x2a\x8f\x3a\xb3\x46\x8b\x51\x22\x24\x46\x5a\xec\x38\xe4\xfe\x7b\x16\x90\x81\x1b\x5f\x52\xb1\x68\x1f\xdf\x63\xa5\x61\x60\x6a\x3b\x8b\x4c\xa0\xbe\x37\x84\x3a\x6f\xb8\xb5\xea\xe5\xe5\xa1\xd4\xe6\x0c\x95\xc5\x18\x0f\xea\xe2\x83\xd5\xea\xe9\x01\x60\x7b\x5a\x79\xc7\xe4\x78\x3a\x7f\x9d\xb1\xfe\xe4\xb3\x4b\xc0\xae\xa3\x90\xd2\xf7\x05\xea\xc9\xff\xee\x73\xe3\xcb\x42\x12\x6f\x15\x45\xa9\x42\xa7\x9e\x10\x74\xe8\xdd\x4f\x72\xf0\xed\xf3\x27\x88\x8d\x0f\x02\x4b\x61\xd3\xb7\x09\x87\xc1\xd4\x90\x4b\xa1\x48\x98\x52\xb1\x0a\xa6\x63\xe0\x6b\x47\x07\xc5\xf4\x8b\x8b\x1f\x78\xc6\xf9\x74\xe1\x76\x31\x4e\xfb\x4b\xee\x9d\xf5\xa8\xe1\x00\x75\xef\x2a\x36\xde\xed\xf6\x43\xaa\x00\xd0\xbe\xea\x5b\xd1\x9b\x9f\x88\x9f\x2d\x8d\xe1\x87\xeb\x47\xbd\x7b\x9c\x18\x09\xe2\xe3\x3e\xaf\xa5\x26\xee\xf6\xef\x53\x53\xa2\x50\xcc\x68\xf7\x3e\xb5\x14\x23\x9e\x68\xb5\xc8\xb8\xae\x67\x30\x5a\xc4\xa7\xa1\x0a\xbc\x9b\xa6\x0a\xf9\xc6\xc4\x3c\x92\xa5\x8a\x77\x7b\x05\x41\xb6\x25\x84\xaf\x07\x75\x8b\x14\x9c\xd1\xf6\x22\x73\x18\x66\x07\xde\xf4\xde\xc8\xbc\x25\x01\x60\xe2\x6c\x29\xd4\x3e\x40\x89\xd0\x04\xaa\xa7\x09\x5f\x31\x88\x52\xf8\x03\xe3\x8d\x18\x67\x6d\xcf\x58\x36\x52\x8d\xb7\xe6\x96\x2e\x0b\x5c\xc0\xfe\xb1\x18\x72\x3a\x2d\x65\x5e\xd2\x73\x08\x3e\xdc\xd6\x74\xef\x0a\xd0\x98\x5f\x98\x0a\xfa\xd4\xb0\x20\xfe\x0f\x60\x3b\x4e\x74\xb5\xab\x11\xe3\xdf\x2a\x3e\x19\xbe\x5e\x0e\x05\x0e\x5b\x89\xfb\x60\x15\xc8\xbb\xa8\xa8\xf1\x56\x53\x38\xa8\x86\xb9\x7b\x57\x14\x1b\xe7\xca\x63\xcf\xec\x5d\xea\x8e\xfd\xb1\x35\xd2\x9f\x50\x8f\xec\xb2\xec\x28\xdb\xd8\x34\x00\x7c\x99\x2f\xaf\xe0\x2e\xec\x10\x6a\xcc\x50\x94\x5d\xb2\x60\x4e\x8d\x4c\xc0\x60\x30\x6b\x8c\xd6\xe4\x84\x54\x18\x47\x94\x85\xd9\xe0\x16\x33\xf0\xea\xf7\x2a\x6a\xf1\x23\x05\xe9\xf3\xea\x99\xd7\xde\xf3\xf2\xcc\xff\x06\x00\x00\xff\xff\x4e\x97\x9b\xac\x01\x04\x00\x00") func templatesIndexHtmlBytes() ([]byte, error) { return bindataRead( @@ -147,7 +168,7 @@ func templatesIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "templates/index.html", size: 100, mode: os.FileMode(420), modTime: time.Unix(1468764414, 0)} + info := bindataFileInfo{name: "templates/index.html", size: 1025, mode: os.FileMode(420), modTime: time.Unix(1468801046, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -224,6 +245,7 @@ func AssetNames() []string { // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ + "static/furtive.min.css": staticFurtiveMinCss, "static/main.css": staticMainCss, "templates/_foot.html": templates_footHtml, "templates/_head.html": templates_headHtml, @@ -272,6 +294,7 @@ type bintree struct { } var _bintree = &bintree{nil, map[string]*bintree{ "static": &bintree{nil, map[string]*bintree{ + "furtive.min.css": &bintree{staticFurtiveMinCss, map[string]*bintree{}}, "main.css": &bintree{staticMainCss, map[string]*bintree{}}, }}, "templates": &bintree{nil, map[string]*bintree{ diff --git a/web/handler.go b/web/handler.go index ff24ceb..0480f4b 100644 --- a/web/handler.go +++ b/web/handler.go @@ -22,6 +22,20 @@ func NewHandler(s shortener.Shortener) *Handler { func newHandlerTemplate() *template.Template { t := template.New("base") + funcMap := template.FuncMap{ + "truncate": func(s string) string { + var numRunes = 0 + for index := range s { + numRunes++ + if numRunes > 50 { + return s[:index] + "..." + } + } + return s + }, + } + t.Funcs(funcMap) + files, err := AssetDir("templates") if err != nil { panic(err) @@ -45,26 +59,37 @@ type Handler struct { template *template.Template } -// Index handles requests for root. -func (h *Handler) Index(c *routing.Context) error { - h.respond(c, "index.html", nil) - return nil -} - // NotFound returns a 404 error page. func (h *Handler) NotFound(c *routing.Context) error { c.NotFound() return nil } +// Index handles requests for root. +func (h *Handler) Index(c *routing.Context) error { + template := "index.html" + rawURL := c.FormValue("url") + + if len(rawURL) > 0 { + uid, url, err := h.shortener.Shorten(rawURL) + if err != nil { + return h.respond(c, template, makeErrResponse(err)) + } + + r := makeResponse(c, uid, url) + return h.respond(c, template, r) + } + + return h.respond(c, template, nil) +} + // Static returns assets serialized via go-bindata func (h *Handler) Static(c *routing.Context) error { p := string(c.Path())[1:] data, err := Asset(p) if err != nil { - h.NotFound(c) - return nil + return h.NotFound(c) } info, _ := AssetInfo(p) @@ -83,11 +108,10 @@ func (h *Handler) LookupAndRedirect(c *routing.Context) error { url, err := h.shortener.Lookup(uid) if err != nil { - h.NotFound(c) - return nil + return h.NotFound(c) } - r := makeURLResponse(c, uid, url) + r := makeResponse(c, uid, url) c.Response.Header.Set("Pragma", "no-cache") c.Response.Header.Set("Expires", "Mon, 01 Jan 1990 00:00:00 GMT") @@ -101,11 +125,11 @@ func (h *Handler) LookupAndRedirect(c *routing.Context) error { c.Response.Header.Set("X-Frame-Options", "SAMEORIGIN") c.Response.Header.Set("Vary", "Accept-Encoding") - h.respond(c, "redirect.html", r) - return nil + return h.respond(c, "redirect.html", r) } -func (h *Handler) respond(c *routing.Context, name string, data interface{}) { +func (h *Handler) respond(c *routing.Context, name string, data interface{}) error { c.SetContentType("text/html; charset=UTF-8") h.template.ExecuteTemplate(c, name, data) + return nil } diff --git a/web/handler_helpers.go b/web/handler_helpers.go index 41c0018..e1a7198 100644 --- a/web/handler_helpers.go +++ b/web/handler_helpers.go @@ -6,14 +6,18 @@ import ( "github.com/qiangxue/fasthttp-routing" ) -func makeURLResponse(c *routing.Context, uid []byte, url []byte) URLResponse { - return URLResponse{ +func makeResponse(c *routing.Context, uid []byte, url []byte) Response { + return Response{ UID: string(uid), URL: makeShortURL(c, uid), Target: string(url), } } +func makeErrResponse(err error) Response { + return Response{Error: err.Error()} +} + func makeShortURL(c *routing.Context, uid []byte) string { shortURL := &url.URL{ Scheme: "http", diff --git a/web/response.go b/web/response.go new file mode 100644 index 0000000..0f3d672 --- /dev/null +++ b/web/response.go @@ -0,0 +1,11 @@ +package web + +//go:generate easyjson -all response.go + +// Response contains shortened URL info. +type Response struct { + UID string `json:"uid"` + URL string `json:"url"` + Target string `json:"target"` + Error string `json:"error"` +} diff --git a/web/response_easyjson.go b/web/response_easyjson.go new file mode 100644 index 0000000..0adde16 --- /dev/null +++ b/web/response_easyjson.go @@ -0,0 +1,88 @@ +// AUTOGENERATED FILE: easyjson marshaller/unmarshallers. + +package web + +import ( + json "encoding/json" + jlexer "github.com/mailru/easyjson/jlexer" + jwriter "github.com/mailru/easyjson/jwriter" +) + +var _ = json.RawMessage{} // suppress unused package warning + +func easyjson_6ff3ac1d_decode_github_com_jimeh_ozu_io_web_Response(in *jlexer.Lexer, out *Response) { + if in.IsNull() { + in.Skip() + return + } + in.Delim('{') + for !in.IsDelim('}') { + key := in.UnsafeString() + in.WantColon() + if in.IsNull() { + in.Skip() + in.WantComma() + continue + } + switch key { + case "uid": + out.UID = string(in.String()) + case "url": + out.URL = string(in.String()) + case "target": + out.Target = string(in.String()) + case "error": + out.Error = string(in.String()) + default: + in.SkipRecursive() + } + in.WantComma() + } + in.Delim('}') +} +func easyjson_6ff3ac1d_encode_github_com_jimeh_ozu_io_web_Response(out *jwriter.Writer, in Response) { + out.RawByte('{') + first := true + _ = first + if !first { + out.RawByte(',') + } + first = false + out.RawString("\"uid\":") + out.String(string(in.UID)) + if !first { + out.RawByte(',') + } + first = false + out.RawString("\"url\":") + out.String(string(in.URL)) + if !first { + out.RawByte(',') + } + first = false + out.RawString("\"target\":") + out.String(string(in.Target)) + if !first { + out.RawByte(',') + } + first = false + out.RawString("\"error\":") + out.String(string(in.Error)) + out.RawByte('}') +} +func (v Response) MarshalJSON() ([]byte, error) { + w := jwriter.Writer{} + easyjson_6ff3ac1d_encode_github_com_jimeh_ozu_io_web_Response(&w, v) + return w.Buffer.BuildBytes(), w.Error +} +func (v Response) MarshalEasyJSON(w *jwriter.Writer) { + easyjson_6ff3ac1d_encode_github_com_jimeh_ozu_io_web_Response(w, v) +} +func (v *Response) UnmarshalJSON(data []byte) error { + r := jlexer.Lexer{Data: data} + easyjson_6ff3ac1d_decode_github_com_jimeh_ozu_io_web_Response(&r, v) + return r.Error() +} +func (v *Response) UnmarshalEasyJSON(l *jlexer.Lexer) { + easyjson_6ff3ac1d_decode_github_com_jimeh_ozu_io_web_Response(l, v) +} diff --git a/web/responses.go b/web/responses.go deleted file mode 100644 index 6182e33..0000000 --- a/web/responses.go +++ /dev/null @@ -1,15 +0,0 @@ -package web - -//go:generate easyjson -all responses.go - -// URLResponse contains shortened URL info. -type URLResponse struct { - UID string `json:"uid"` - URL string `json:"url"` - Target string `json:"target"` -} - -// ErrorResponse contains error info. -type ErrorResponse struct { - Error string `json:"error"` -} diff --git a/web/responses_easyjson.go b/web/responses_easyjson.go deleted file mode 100644 index e5d4678..0000000 --- a/web/responses_easyjson.go +++ /dev/null @@ -1,132 +0,0 @@ -// AUTOGENERATED FILE: easyjson marshaller/unmarshallers. - -package web - -import ( - json "encoding/json" - jlexer "github.com/mailru/easyjson/jlexer" - jwriter "github.com/mailru/easyjson/jwriter" -) - -var _ = json.RawMessage{} // suppress unused package warning - -func easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_ErrorResponse(in *jlexer.Lexer, out *ErrorResponse) { - if in.IsNull() { - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeString() - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "error": - out.Error = string(in.String()) - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') -} -func easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_ErrorResponse(out *jwriter.Writer, in ErrorResponse) { - out.RawByte('{') - first := true - _ = first - if !first { - out.RawByte(',') - } - first = false - out.RawString("\"error\":") - out.String(string(in.Error)) - out.RawByte('}') -} -func (v ErrorResponse) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_ErrorResponse(&w, v) - return w.Buffer.BuildBytes(), w.Error -} -func (v ErrorResponse) MarshalEasyJSON(w *jwriter.Writer) { - easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_ErrorResponse(w, v) -} -func (v *ErrorResponse) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_ErrorResponse(&r, v) - return r.Error() -} -func (v *ErrorResponse) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_ErrorResponse(l, v) -} -func easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_URLResponse(in *jlexer.Lexer, out *URLResponse) { - if in.IsNull() { - in.Skip() - return - } - in.Delim('{') - for !in.IsDelim('}') { - key := in.UnsafeString() - in.WantColon() - if in.IsNull() { - in.Skip() - in.WantComma() - continue - } - switch key { - case "uid": - out.UID = string(in.String()) - case "url": - out.URL = string(in.String()) - case "target": - out.Target = string(in.String()) - default: - in.SkipRecursive() - } - in.WantComma() - } - in.Delim('}') -} -func easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_URLResponse(out *jwriter.Writer, in URLResponse) { - out.RawByte('{') - first := true - _ = first - if !first { - out.RawByte(',') - } - first = false - out.RawString("\"uid\":") - out.String(string(in.UID)) - if !first { - out.RawByte(',') - } - first = false - out.RawString("\"url\":") - out.String(string(in.URL)) - if !first { - out.RawByte(',') - } - first = false - out.RawString("\"target\":") - out.String(string(in.Target)) - out.RawByte('}') -} -func (v URLResponse) MarshalJSON() ([]byte, error) { - w := jwriter.Writer{} - easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_URLResponse(&w, v) - return w.Buffer.BuildBytes(), w.Error -} -func (v URLResponse) MarshalEasyJSON(w *jwriter.Writer) { - easyjson_559270ae_encode_github_com_jimeh_ozu_io_web_URLResponse(w, v) -} -func (v *URLResponse) UnmarshalJSON(data []byte) error { - r := jlexer.Lexer{Data: data} - easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_URLResponse(&r, v) - return r.Error() -} -func (v *URLResponse) UnmarshalEasyJSON(l *jlexer.Lexer) { - easyjson_559270ae_decode_github_com_jimeh_ozu_io_web_URLResponse(l, v) -} diff --git a/web/static/furtive.min.css b/web/static/furtive.min.css new file mode 100644 index 0000000..f152198 --- /dev/null +++ b/web/static/furtive.min.css @@ -0,0 +1 @@ +body{margin:0}aside,details,main,summary{display:block}template{display:none}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}.grd{padding-left:1rem;padding-right:1rem}.grd-row{box-sizing:border-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:100%}.grd-row-col-1-6{max-width:16.66667%;-webkit-flex-basis:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.grd-row-col-2-6{max-width:33.33333%;-webkit-flex-basis:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.grd-row-col-3-6{max-width:50%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.grd-row-col-4-6{max-width:66.66667%;-webkit-flex-basis:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.grd-row-col-5-6{max-width:83.33333%;-webkit-flex-basis:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.grd-row-col-6{max-width:100%;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}.grd-row-col-1-6,.grd-row-col-1-6--lg,.grd-row-col-1-6--md,.grd-row-col-1-6--sm,.grd-row-col-2-6,.grd-row-col-2-6--lg,.grd-row-col-2-6--md,.grd-row-col-2-6--sm,.grd-row-col-3-6,.grd-row-col-3-6--lg,.grd-row-col-3-6--md,.grd-row-col-3-6--sm,.grd-row-col-4-6,.grd-row-col-4-6--lg,.grd-row-col-4-6--md,.grd-row-col-4-6--sm,.grd-row-col-5-6,.grd-row-col-5-6--lg,.grd-row-col-5-6--md,.grd-row-col-5-6--sm,.grd-row-col-6,.grd-row-col-6--lg,.grd-row-col-6--md,.grd-row-col-6--sm{-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;box-sizing:border-box}.grd-row-col-1-6--lg,.grd-row-col-1-6--md,.grd-row-col-1-6--sm,.grd-row-col-2-6--lg,.grd-row-col-2-6--md,.grd-row-col-2-6--sm,.grd-row-col-3-6--lg,.grd-row-col-3-6--md,.grd-row-col-3-6--sm,.grd-row-col-4-6--lg,.grd-row-col-4-6--md,.grd-row-col-4-6--sm,.grd-row-col-5-6--lg,.grd-row-col-5-6--md,.grd-row-col-5-6--sm,.grd-row-col-6--lg,.grd-row-col-6--md,.grd-row-col-6--sm{max-width:100%;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}@media screen and (min-width:32rem){.grd-row-col-1-6--sm{max-width:16.66667%;-webkit-flex-basis:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.grd-row-col-2-6--sm{max-width:33.33333%;-webkit-flex-basis:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.grd-row-col-3-6--sm{max-width:50%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.grd-row-col-4-6--sm{max-width:66.66667%;-webkit-flex-basis:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.grd-row-col-5-6--sm{max-width:83.33333%;-webkit-flex-basis:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.grd-row-col-6--sm{max-width:100%;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media screen and (min-width:48rem){.grd-row-col-1-6--md{max-width:16.66667%;-webkit-flex-basis:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.grd-row-col-2-6--md{max-width:33.33333%;-webkit-flex-basis:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.grd-row-col-3-6--md{max-width:50%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.grd-row-col-4-6--md{max-width:66.66667%;-webkit-flex-basis:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.grd-row-col-5-6--md{max-width:83.33333%;-webkit-flex-basis:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.grd-row-col-6--md{max-width:100%;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}@media screen and (min-width:64rem){.grd-row-col-1-6--lg{max-width:16.66667%;-webkit-flex-basis:16.66667%;-ms-flex-preferred-size:16.66667%;flex-basis:16.66667%}.grd-row-col-2-6--lg{max-width:33.33333%;-webkit-flex-basis:33.33333%;-ms-flex-preferred-size:33.33333%;flex-basis:33.33333%}.grd-row-col-3-6--lg{max-width:50%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%}.grd-row-col-4-6--lg{max-width:66.66667%;-webkit-flex-basis:66.66667%;-ms-flex-preferred-size:66.66667%;flex-basis:66.66667%}.grd-row-col-5-6--lg{max-width:83.33333%;-webkit-flex-basis:83.33333%;-ms-flex-preferred-size:83.33333%;flex-basis:83.33333%}.grd-row-col-6--lg{max-width:100%;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}*,::after,::before{box-sizing:border-box}.measure{max-width:48rem;margin:0 auto}a{color:#3498db}a:active,a:focus,a:hover{color:#217dbb}.bg--red{background-color:#e74c3c}.bg--orange{background-color:#f39c12}.bg--blue{background-color:#3498db}.bg--green{background-color:#25ba84}.bg--white{background-color:#fff}.bg--light-gray{background-color:rgba(216,216,216,.99)}.bg--mid-gray{background-color:rgba(144,144,144,.99)}.bg--dark-gray{background-color:rgba(72,72,72,.99)}.bg--off-white{background-color:rgba(250,250,250,.99)}.fnt--red{color:#e74c3c}.fnt--orange{color:#f39c12}.fnt--blue{color:#3498db}.fnt--green{color:#25ba84}.fnt--white{color:#fff}.fnt--light-gray{color:rgba(216,216,216,.99)}.fnt--mid-gray{color:rgba(144,144,144,.99)}.fnt--dark-gray{color:rgba(72,72,72,.99)}.fnt--off-white{color:rgba(250,250,250,.99)}.m0{margin:0}.mx0{margin-left:0;margin-right:0}.my0{margin-top:0;margin-bottom:0}.m1{margin:1rem}.mx1{margin-left:1rem;margin-right:1rem}.my1{margin-top:1rem;margin-bottom:1rem}.m2{margin:2rem}.mx2{margin-left:2rem;margin-right:2rem}.my2{margin-top:2rem;margin-bottom:2rem}.p0{padding:0}.px0{padding-left:0;padding-right:0}.py0{padding-top:0;padding-bottom:0}.p1{padding:1rem}.px1{padding-left:1rem;padding-right:1rem}.py1{padding-top:1rem;padding-bottom:1rem}.p2{padding:2rem}.px2{padding-left:2rem;padding-right:2rem}.py2{padding-top:2rem;padding-bottom:2rem}html{font-size:12px}@media screen and (min-width:32rem) and (max-width:48rem){html{font-size:15px}}@media screen and (min-width:48rem){html{font-size:16px}}body{font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.85;color:#333}.p,p{font-size:1rem;margin-bottom:1.3rem}.h1,.h2,.h3,.h4,h1,h2,h3,h4{margin:1.414rem 0 .5rem;font-weight:inherit;line-height:1.42}.h1,h1{margin-top:0;font-size:3.998rem}.h2,h2{font-size:2.827rem}.h3,h3{font-size:1.999rem}.h4,h4{font-size:1.414rem}.h5,h5,table th{font-size:1.121rem}.h6,h6{font-size:.88rem}.btn--s,.small,small{font-size:.707em}code,pre{font-family:Monaco,"Lucida Console",Courier,monospace}.italic{font-style:italic}.thin{font-weight:100}.bold{font-weight:700}.caps,table th{font-variant:small-caps}.justify{text-align:justify}.ellipsis{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.muted{opacity:.7}.clearfix:after{content:"";display:table;clear:both}.flt--left{float:left}.flt--right{float:right}.flt--none{float:none}.center{margin:auto}.txt--center{text-align:center}.txt--right{text-align:right}.txt--left,table th{text-align:left}.oflow-y--scroll{overflow-y:scroll}.w100,.w100--s{width:100%;display:block}@media screen and (min-width:32rem){.w100--s{width:auto;display:inline-block}}canvas,iframe,img,select,svg,textarea,video{max-width:100%}.brdr--rounded,.btn,.btn--blue,.btn--gray,.btn--green,.btn--link,.btn--red{border-radius:3px}.brdr--light-gray{border:thin solid rgba(216,216,216,.99)}.brdr--mid-gray{border:thin solid rgba(144,144,144,.99)}.brdr--dark-gray{border:thin solid rgba(72,72,72,.99)}.brdr--off-white{border:thin solid rgba(250,250,250,.99)}.btn,.btn--blue,.btn--gray,.btn--green,.btn--link,.btn--red{padding:.5rem 1rem;border:2px solid #ccc;color:#333;text-decoration:none;text-align:center}.btn:active,.btn:focus,.btn:hover{background-color:rgba(0,0,0,.05);color:#000}.btn--link{border-color:transparent;color:#3498db}.btn--link:hover{background-color:transparent;color:#1d6fa5}.btn--blue{border-color:#2792d9;background-color:#3498db;color:#fff}.btn--blue:active,.btn--blue:focus,.btn--blue:hover{color:#fff;background-color:#217dbb}.btn--green{border-color:#22a977;background-color:#25ba84;color:#fff}.btn--green:active,.btn--green:focus,.btn--green:hover{color:#fff;background-color:#1d8f65}.btn--gray{border-color:rgba(59,59,59,.99);background-color:rgba(72,72,72,.99);color:#fff}.btn--gray:active,.btn--gray:focus,.btn--gray:hover{color:#fff;background-color:rgba(46,46,46,.99)}.btn--red{border-color:#e43525;background-color:#e74c3c;color:#fff}.btn--red:active,.btn--red:focus,.btn--red:hover{color:#fff;background-color:#d62a1a}.btn--s{padding:.5rem}.list--unstyled{list-style-type:none}input,textarea{padding:.5rem;margin-bottom:.5rem;display:block;width:100%;box-shadow:none;border:thin solid rgba(216,216,216,.99)}input[type=submit]{margin-top:.85rem}.media{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.media .media-figure{margin-right:1em}.media .media-body{-webkit-flex:1 0 0;-ms-flex:1 0 0;flex:1 0 0}table>thead{border-bottom:thin solid rgba(250,250,250,.99)}table td,table th{padding:.25rem;word-wrap:normal;line-height:1} \ No newline at end of file diff --git a/web/static/main.css b/web/static/main.css index 2ae8aab..2e78f38 100644 --- a/web/static/main.css +++ b/web/static/main.css @@ -1,3 +1,100 @@ body { - font-family: "Helvetica Neue", Helvetica, "Segoe UI", Arial, freesans, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-weight: normal; + line-height: 1.5; +} + +.world { + position: fixed; + top: 0px; + text-align: center; + bottom: 0px; + width: 100%; +} + +.world .content { + width: 584px; + position: absolute; + top: 50%; + left: 50%; + -moz-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.logo-wrapper { + font-family: "Open Sans Condensed", Helvetica, Arial, sans-serif; +} + +.logo { + font-size: 64px; + height: 70px; + margin-top: -25px; +} + +.slogan { + font-size: 15px; +} + +.message { + margin-top: 20px; +} + +.message.error { + color: #e74c3c; +} + +.message input { + background-color: transparent; + border: none; + color: #333; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 21px; + font-weight: normal; + padding: 0; + margin: 0; + text-align: center; +} + +.message .info { + color: #666; + font-style: italic; + font-size: 12px; +} + +.form { + margin-top: 10px; +} + +.form input { + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 21px; + font-weight: normal; + width: 100%; +} + +.form input:focus { outline: none; } + +.form button { + color: #fff; + font-family: "Open Sans", Helvetica, Arial, sans-serif; + font-size: 18px; + font-weight: bold; +} + +::-webkit-input-placeholder { /* WebKit, Blink, Edge */ + color: #ccc; +} +:-moz-placeholder { /* Mozilla Firefox 4 to 18 */ + color: #ccc; + opacity: 1; +} +::-moz-placeholder { /* Mozilla Firefox 19+ */ + color: #ccc; + opacity: 1; +} +:-ms-input-placeholder { /* Internet Explorer 10-11 */ + color: #ccc; } diff --git a/web/templates/_head.html b/web/templates/_head.html index f2d97ef..4947f76 100644 --- a/web/templates/_head.html +++ b/web/templates/_head.html @@ -6,6 +6,9 @@ ozu.io + + + diff --git a/web/templates/index.html b/web/templates/index.html index c6aa07a..d1d588c 100644 --- a/web/templates/index.html +++ b/web/templates/index.html @@ -1,3 +1,36 @@ {{template "_head.html"}} - Welcome to ozu.io, a drunken URL shortener. +
+
+
+ +
a drunken URL shortener
+
+ {{if .URL}} + +
+ + +
+ {{end}} + {{if .Error}} +
+ {{.Error | html}} +
+ {{end}} +
+
+ + +
+
+
+
{{template "_foot.html"}}