Contains the Concourse pipeline definition for building a line-server container
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.5 KiB

9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
9 years ago
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io"
  6. "net/http"
  7. "os"
  8. "path"
  9. "regexp"
  10. "strings"
  11. "code.google.com/p/go-uuid/uuid"
  12. "github.com/zenazn/goji/web"
  13. )
  14. type UploadRequest struct {
  15. src io.Reader
  16. filename string
  17. expiry int
  18. randomBarename bool
  19. }
  20. type Upload struct {
  21. Filename string
  22. Size int64
  23. Expiry int
  24. }
  25. func uploadPostHandler(c web.C, w http.ResponseWriter, r *http.Request) {
  26. upReq := UploadRequest{}
  27. if r.Header.Get("Content-Type") == "application/octet-stream" {
  28. defer r.Body.Close()
  29. upReq.src = r.Body
  30. upReq.filename = r.URL.Query().Get("qqfile")
  31. } else {
  32. file, headers, err := r.FormFile("file")
  33. if err != nil {
  34. oopsHandler(c, w, r)
  35. return
  36. }
  37. defer file.Close()
  38. upReq.src = file
  39. upReq.filename = headers.Filename
  40. }
  41. upload, err := processUpload(upReq)
  42. if err != nil {
  43. oopsHandler(c, w, r)
  44. return
  45. }
  46. if strings.EqualFold("application/json", r.Header.Get("Accept")) {
  47. js, _ := json.Marshal(map[string]string{
  48. "filename": upload.Filename,
  49. "url": Config.siteURL + upload.Filename,
  50. })
  51. w.Header().Set("Content-Type", "application/json; charset=UTF-8")
  52. w.Write(js)
  53. } else {
  54. http.Redirect(w, r, "/"+upload.Filename, 301)
  55. }
  56. }
  57. func uploadPutHandler(c web.C, w http.ResponseWriter, r *http.Request) {
  58. upReq := UploadRequest{}
  59. defer r.Body.Close()
  60. upReq.filename = c.URLParams["name"]
  61. upReq.src = r.Body
  62. upload, err := processUpload(upReq)
  63. if err != nil {
  64. oopsHandler(c, w, r)
  65. return
  66. }
  67. fmt.Fprintf(w, Config.siteURL+upload.Filename)
  68. }
  69. func processUpload(upReq UploadRequest) (upload Upload, err error) {
  70. barename, extension := barePlusExt(upReq.filename)
  71. if upReq.randomBarename || len(barename) == 0 {
  72. barename = generateBarename()
  73. }
  74. if len(extension) == 0 {
  75. extension = "ext"
  76. }
  77. upload.Filename = strings.Join([]string{barename, extension}, ".")
  78. dst, err := os.Create(path.Join("files/", upload.Filename))
  79. if err != nil {
  80. return
  81. }
  82. defer dst.Close()
  83. bytes, err := io.Copy(dst, upReq.src)
  84. if err != nil {
  85. return
  86. } else if bytes == 0 {
  87. return
  88. }
  89. upload.Size = bytes
  90. return
  91. }
  92. func generateBarename() string {
  93. return uuid.New()[:8]
  94. }
  95. var barePlusRe = regexp.MustCompile(`[^A-Za-z0-9\-]`)
  96. func barePlusExt(filename string) (barename, extension string) {
  97. filename = strings.TrimSpace(filename)
  98. filename = strings.ToLower(filename)
  99. extension = path.Ext(filename)
  100. barename = filename[:len(filename)-len(extension)]
  101. extension = barePlusRe.ReplaceAllString(extension, "")
  102. barename = barePlusRe.ReplaceAllString(barename, "")
  103. return
  104. }