commit
4e7d63be3f
@ -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)) |
||||||
|
} |
Loading…
Reference in new issue