First working version without redirect

master
kreativmonkey 7 years ago
parent d46a70bf59
commit aac46dea60

@ -0,0 +1,77 @@
package shrt
import (
//"github.com/asaskevich/govalidator"
"fmt"
"crypto/sha256"
"errors"
"io"
"bytes"
)
type Storage struct {
Token map[string]string `json: tokens`
Url map[string]shrt `json: urls`
}
type shrt struct {
URL string
Token string
count int
}
var (
ErrNotFound = errors.New("Url not Found")
ErrCreateToken = errors.New("There are some problems while creating Token")
)
func Open() (*Storage, error){
// Open db ore create if not exist!
s := Storage{Token: make(map[string]string), Url: make(map[string]shrt)}
return &s, nil
}
func StreamToByte(stream io.Reader) []byte {
buf := new(bytes.Buffer)
buf.ReadFrom(stream)
return buf.Bytes()
}
func (s *Storage) Add(URL string) (string, error) {
// if the URL a valid URL?
/*if !govalidator.IsURL(URL) {
return "", errors.New("invalid url")
} */
// Create a sha256 Hash from the URL
hash := fmt.Sprintf("%x", sha256.Sum256([]byte(URL)))
// Test if the URL alraedy exist and return the key
if val, ok := s.Url[hash]; ok {
return val.Token, nil
}
// Iterate to the length of hash to get the shortest output
for hashShortestLen := 1; hashShortestLen <= 32; hashShortestLen++ {
// Test if the Token not exist and return the new generated token
if _, ok := s.Token[hash[:hashShortestLen]]; !ok {
token := hash[:hashShortestLen]
s.Token[token] = hash
s.Url[hash] = shrt{URL: URL, Token: token}
return token, nil
}
}
return "", ErrCreateToken
}
func (s *Storage) Remove(URL string) error {
return nil
}
// Get returns the URL for the given token
func (s *Storage) Get(token string) (string, error) {
if val, ok := s.Token[token]; ok {
return s.Url[val].URL, nil
}
return "", ErrNotFound
}

@ -0,0 +1,65 @@
package main
import (
"net/http"
"fmt"
"log"
"html/template"
"github.com/kreativmonkey/shrt/lib"
)
type Page struct {
Url string
Token string
Count int
}
var (
short *shrt.Storage
)
func init() {
var err error
short, err = shrt.Open()
if err != nil {
panic(err)
}
}
func index(w http.ResponseWriter, r *http.Request) {
fmt.Println("method:", r.Method) //get request method
switch r.Method {
case "GET":
t, _ := template.ParseFiles("template/index.gohtml")
t.Execute(w, nil)
case "POST":
r.ParseForm()
token, err := short.Add(ToString(r.Form["url"]))
if err != nil {
panic(err)
}
P := Page{Url: ToString(r.Form["url"]), Token: token}
t, _ := template.ParseFiles("template/index.gohtml")
t.Execute(w, P)
fmt.Println("url:", P)
}
}
func handelPost(w http.ResponseWriter, r *http.Request){
}
func main() {
http.HandleFunc("/", index) // setting router rule
err := http.ListenAndServe(":9090", nil) // setting listening port
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
// ToString convert the input to a string.
func ToString(obj interface{}) string {
res := fmt.Sprintf("%s", obj)
return string(res)
}

@ -1,48 +0,0 @@
package shrt
type Storage struct {
Shrt []shrt
}
type shrt struct{
URL string
key string
count int
}
type Site struct {
Host string
db *Bolt.db
}
func New(URL string) (string, error) {
// if the URL a valid URL?
if !govalidator.IsURL(URL) {
return "", errors.New("invalid url")
}
// Create a md5 Hash from the URL
hash := fmt.Sprintf("%x", md5.Sum([]byte(url)))
// Open up the Bold.db
db, err := bolt.Open("my.db", 0600, nil)
if err != nil {
return "", err
}
defer db.Close()
// check if the URL exist in the DB and return the Key
// Iterate to the length of hash to get the shortest output
for hashShortestLen := 1; hashShortestLen <= 32; hashShortestLen++ {
}
if shortest == "" {
return "", errors.New("url shortening failed")
}
add := shrt{ URL: URL, key; key count: 0 }
db.Shrt := appand{db.Shrt, add}
return key, nil
}

@ -0,0 +1,16 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form id="shorten" action="./" method="post">
<input type="text" name="url" placeholder="Url to shorten!" required="">
<button class="button" type="submit" name="submit" value="short">Kürzen</button>
</form>
<p>Current URL: {{.}}</p>
</body>
</html>
Loading…
Cancel
Save