Compare commits
3 commits
d724154635
...
745e465034
Author | SHA1 | Date | |
---|---|---|---|
745e465034 | |||
b9a275b0d5 | |||
4394883200 |
3 changed files with 15 additions and 10 deletions
|
@ -7,4 +7,5 @@
|
||||||
Environmental variables:
|
Environmental variables:
|
||||||
- `SHORTEN_HOST` - hostname
|
- `SHORTEN_HOST` - hostname
|
||||||
- `SHORTEN_BIND` - bind address (default: `127.0.0.1:4488`)
|
- `SHORTEN_BIND` - bind address (default: `127.0.0.1:4488`)
|
||||||
|
- `SHORTEN_MAIL` - optional email for support/abuse reports
|
||||||
- `POSTGRES_URI` - lib/pq connection string (see [here](https://pkg.go.dev/github.com/lib/pq#section-documentation))
|
- `POSTGRES_URI` - lib/pq connection string (see [here](https://pkg.go.dev/github.com/lib/pq#section-documentation))
|
11
index.html
11
index.html
|
@ -10,6 +10,7 @@
|
||||||
height: calc(100vh - 32px);
|
height: calc(100vh - 32px);
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
font-family: sans-serif;
|
||||||
}
|
}
|
||||||
form {
|
form {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -31,10 +32,15 @@
|
||||||
font-size: 30px;
|
font-size: 30px;
|
||||||
}
|
}
|
||||||
a {
|
a {
|
||||||
font-family: sans-serif;
|
|
||||||
color: #dddddd;
|
color: #dddddd;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
footer {
|
||||||
|
width: 100vw;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 10px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
@ -45,5 +51,8 @@
|
||||||
<input type="text" {{ with .error }}placeholder="{{ . }}"{{ end }} name="url" autocomplete="off" autocapitalize="off">
|
<input type="text" {{ with .error }}placeholder="{{ . }}"{{ end }} name="url" autocomplete="off" autocapitalize="off">
|
||||||
</form>
|
</form>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
{{ if .mail }}
|
||||||
|
<footer>support, takedown, abuse reports: {{ .mail }}</footer>
|
||||||
|
{{ end }}
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
11
main.go
11
main.go
|
@ -96,8 +96,6 @@ func (h *Handler) ServeHTTP(wr http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) HomepageHandler(wr http.ResponseWriter, req *http.Request) {
|
func (h *Handler) HomepageHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
log.Println("HomepageHandler")
|
|
||||||
|
|
||||||
url := req.URL.Query().Get("url")
|
url := req.URL.Query().Get("url")
|
||||||
if url != "" {
|
if url != "" {
|
||||||
code, err := h.GetCode(url, req.RemoteAddr)
|
code, err := h.GetCode(url, req.RemoteAddr)
|
||||||
|
@ -113,8 +111,6 @@ func (h *Handler) HomepageHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) CreateHandler(wr http.ResponseWriter, req *http.Request) {
|
func (h *Handler) CreateHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
log.Println("CreateHandler")
|
|
||||||
|
|
||||||
ip := req.RemoteAddr
|
ip := req.RemoteAddr
|
||||||
if strings.HasPrefix(ip, "127.0.0.1") {
|
if strings.HasPrefix(ip, "127.0.0.1") {
|
||||||
proxyIp := strings.Split(req.Header.Get("X-Forwarded-For"), ",")[0]
|
proxyIp := strings.Split(req.Header.Get("X-Forwarded-For"), ",")[0]
|
||||||
|
@ -133,8 +129,6 @@ func (h *Handler) CreateHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) RedirectHandler(wr http.ResponseWriter, req *http.Request) {
|
func (h *Handler) RedirectHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
log.Println("RedirectHandler")
|
|
||||||
|
|
||||||
code := req.URL.Path[1:]
|
code := req.URL.Path[1:]
|
||||||
var url string
|
var url string
|
||||||
var hits uint64
|
var hits uint64
|
||||||
|
@ -143,7 +137,7 @@ func (h *Handler) RedirectHandler(wr http.ResponseWriter, req *http.Request) {
|
||||||
log.Println("hits query error:", err)
|
log.Println("hits query error:", err)
|
||||||
}
|
}
|
||||||
wr.Header().Set("Location", "/")
|
wr.Header().Set("Location", "/")
|
||||||
wr.WriteHeader(http.StatusMovedPermanently)
|
wr.WriteHeader(http.StatusFound)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,7 +163,6 @@ func (h *Handler) CodeExists(code string) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *Handler) GetCode(url string, ip string) (string, error) {
|
func (h *Handler) GetCode(url string, ip string) (string, error) {
|
||||||
log.Printf("url: %#v\n", url)
|
|
||||||
if !strings.HasPrefix(url, "http") || !govalidator.IsURL(url) {
|
if !strings.HasPrefix(url, "http") || !govalidator.IsURL(url) {
|
||||||
return "", fmt.Errorf("invalid URL")
|
return "", fmt.Errorf("invalid URL")
|
||||||
}
|
}
|
||||||
|
@ -180,6 +173,7 @@ func (h *Handler) GetCode(url string, ip string) (string, error) {
|
||||||
return code, nil
|
return code, nil
|
||||||
}
|
}
|
||||||
if err != sql.ErrNoRows {
|
if err != sql.ErrNoRows {
|
||||||
|
log.Println("sql error:", err)
|
||||||
return "", fmt.Errorf("query: %w", err)
|
return "", fmt.Errorf("query: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,6 +195,7 @@ func (h *Handler) GetCode(url string, ip string) (string, error) {
|
||||||
func Render(wr http.ResponseWriter, data map[string]string) {
|
func Render(wr http.ResponseWriter, data map[string]string) {
|
||||||
wr.Header().Set("Content-Type", "text/html")
|
wr.Header().Set("Content-Type", "text/html")
|
||||||
data["host"] = os.Getenv("SHORTEN_HOST")
|
data["host"] = os.Getenv("SHORTEN_HOST")
|
||||||
|
data["mail"] = os.Getenv("SHORTEN_MAIL")
|
||||||
err := tmpl.Execute(wr, data)
|
err := tmpl.Execute(wr, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("error writing template:", err)
|
log.Println("error writing template:", err)
|
||||||
|
|
Loading…
Reference in a new issue