main.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "image"
  4. "image/jpeg"
  5. "log"
  6. "net/http"
  7. "os"
  8. "path"
  9. "plugin"
  10. )
  11. func loadPlugin(path string) (func(image.Image) image.Image, error) {
  12. p, err := plugin.Open(path)
  13. if err != nil {
  14. return nil, err
  15. }
  16. transform, err := p.Lookup("Transform")
  17. if err != nil {
  18. return nil, err
  19. }
  20. return transform.(func(image.Image) image.Image), nil
  21. }
  22. func getPlugins(pluginDir string) ([]func(image.Image) image.Image, error) {
  23. pDir, err := os.Open(pluginDir)
  24. if err != nil {
  25. return nil, err
  26. }
  27. pFiles, err := pDir.Readdir(0)
  28. if err != nil {
  29. return nil, err
  30. }
  31. var ret []func(image.Image) image.Image
  32. for _, pFile := range pFiles {
  33. if pFile.IsDir() {
  34. continue
  35. }
  36. p, err := loadPlugin(path.Join(pluginDir, pFile.Name()))
  37. if err != nil {
  38. log.Printf("Failed to load pluging %s", p)
  39. } else {
  40. ret = append(ret, p)
  41. }
  42. }
  43. return ret, nil
  44. }
  45. func handler(w http.ResponseWriter, r *http.Request) {
  46. fi, _ := os.Open("lca.jpg")
  47. i, _ := jpeg.Decode(fi)
  48. plugins, err := getPlugins(pluginDir)
  49. if err != nil {
  50. panic(err)
  51. }
  52. for _, p := range plugins {
  53. i = p(i)
  54. }
  55. jpeg.Encode(w, i, nil)
  56. }
  57. var pluginDir string
  58. func main() {
  59. pluginDir = os.Args[1]
  60. http.HandleFunc("/a.jpg", handler)
  61. http.ListenAndServe(":8080", nil)
  62. }