diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 100 |
1 files changed, 100 insertions, 0 deletions
@@ -0,0 +1,100 @@ +package main + +import ( + "fmt" + "net/http" + "crypto/sha256" + "log" + "path/filepath" + "os" + "time" + "io/ioutil" +) + + +func handle_get_paste(w http.ResponseWriter, r *http.Request){ + + var paste_name, orig_name string + var err error + + orig_name = filepath.Clean(r.URL.Path) + paste_name = "./pastes/" + orig_name + + fmt.Printf("orig_name: '%s'\npaste_name: '%s'\n", orig_name, paste_name) + + // The default is to serve index.html + if (orig_name == "/" ) || ( orig_name == "/index.html" ) { + http.ServeFile(w, r, "index.html") + } else { + // otherwise, if the requested paste exists, we serve it... + if _, err = os.Stat(paste_name); err == nil && orig_name != "./" { + http.ServeFile(w, r, paste_name) + } else { + // otherwise, we give say we didn't find it + fmt.Fprintf(w, "Paste '%s' not found\n", orig_name) + return + } + } +} + + + +func handle_put_paste(w http.ResponseWriter, r *http.Request){ + + + fmt.Printf("We are inside handle_put_paste\n"); + + if err := r.ParseForm(); err != nil{ + // Invalid POST -- let's serve the default file + http.ServeFile(w, r, "index.html") + } else { + h := sha256.New() + req_body := r.PostForm + // get title, body, and time + title := req_body.Get("title") + paste := req_body.Get("paste") + now := time.Now().String() + // format content + content := fmt.Sprintf("# Title: %s\n# Pasted: %s\n------------\n%s", title, now, paste) + + // ccompute the sha256 hash using title, body, and time + h.Write([]byte (content)) + + paste_hash := fmt.Sprintf("%x", h.Sum(nil)) + fmt.Printf("hash: %s fname: %s\n", paste_hash, paste_hash[:16]) + paste_dir := "./pastes/" + + // Now we save the file + for i := 0; i < len(paste_hash) - 16; i ++ { + + if _, err := os.Stat(paste_dir + paste_hash[i:i+16]); os.IsNotExist(err) { + // The file does not exist, so we can create it + if err := ioutil.WriteFile(paste_dir + paste_hash[i:i+16], []byte (content), 0644); err == nil{ + // and then we return the URL: + fmt.Fprintf(w, "<html><body>Link: <a href='%s'>%s</a></body></html>", + paste_hash[i:i+16], paste_hash[i:i+16]) + return + } else { + fmt.Fprintf(w, "Cannot create the paste!!!\n") + } + } + } + } +} + +func req_handler(w http.ResponseWriter, r *http.Request){ + + switch r.Method { + case "GET": + handle_get_paste(w, r) + case "POST": + handle_put_paste(w, r) + default: + http.NotFound(w, r) + } +} + +func main(){ + http.HandleFunc("/", req_handler) + log.Fatal(http.ListenAndServe("localhost:8000", nil)) +} |