main.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "net/http"
  6. "net/rpc"
  7. )
  8. var (
  9. listenAddr = flag.String("http", ":8080", "http listen address")
  10. dataFile = flag.String("file", "store.gob", "data store file name")
  11. hostname = flag.String("host", "localhost:8080", "http host name")
  12. masterAddr = flag.String("master", "", "RPC master address")
  13. rpcEnabled = flag.Bool("rpc", false, "enable RPC server")
  14. )
  15. var store Store
  16. func main() {
  17. flag.Parse()
  18. if *masterAddr != "" {
  19. store = NewProxyStore(*masterAddr)
  20. } else {
  21. store = NewURLStore(*dataFile)
  22. }
  23. if *rpcEnabled { // the master is the rpc server:
  24. rpc.RegisterName("Store", store)
  25. rpc.HandleHTTP()
  26. }
  27. http.HandleFunc("/", Redirect)
  28. http.HandleFunc("/add", Add)
  29. http.ListenAndServe(*listenAddr, nil)
  30. }
  31. func Redirect(w http.ResponseWriter, r *http.Request) {
  32. key := r.URL.Path[1:]
  33. if key == "" {
  34. http.NotFound(w, r)
  35. return
  36. }
  37. var url string
  38. if err := store.Get(&key, &url); err != nil {
  39. http.Error(w, err.Error(), http.StatusInternalServerError)
  40. return
  41. }
  42. http.Redirect(w, r, url, http.StatusFound)
  43. }
  44. func Add(w http.ResponseWriter, r *http.Request) {
  45. url := r.FormValue("url")
  46. if url == "" {
  47. fmt.Fprint(w, AddForm)
  48. return
  49. }
  50. var key string
  51. if err := store.Put(&url, &key); err != nil {
  52. http.Error(w, err.Error(), http.StatusInternalServerError)
  53. return
  54. }
  55. fmt.Fprintf(w, "http://%s/%s", *hostname, key)
  56. }
  57. const AddForm = `
  58. <form method="POST" action="/add">
  59. URL: <input type="text" name="url">
  60. <input type="submit" value="Add">
  61. </form>
  62. `