package web import ( "bytes" "io" "mime/multipart" "net/http" p "github.com/ajswis/go-pkparse-server/pokemon" "github.com/ajswis/go-pkparse-server/pokemon-parsing" "github.com/gin-gonic/gin" ) /* curl -X POST http://localhost:8080/parse \ -F "pkmn=@/path/to/test/file1" \ -F "pkmn=@/path/to/test/file2" \ -H "Content-Type: multipart/form-data" */ // parse grabs multipart file uploads under the key `pkmn`, aggregates them, and // delegates work to the parser. // NOTE: This can probably be improved by 1) parallelizing upload reads, or 2) // not accepting file uploads, preferring to service binary data as encoded // strings func (s *Server) parse(c *gin.Context) { form, err := c.MultipartForm() if err != nil { render(c, http.StatusInternalServerError, gin.H{"error": err.Error()}) return } var rawPokemon []p.RawPokemon var files []*multipart.FileHeader = form.File["pkmn"] for _, file := range files { var err error var src multipart.File src, err = file.Open() if err != nil { render(c, http.StatusInternalServerError, gin.H{"error": err.Error()}) return } defer src.Close() buf := bytes.NewBuffer(nil) if _, err = io.Copy(buf, src); err != nil { render(c, http.StatusInternalServerError, gin.H{"error": err.Error()}) return } rawPokemon = append(rawPokemon, buf.Bytes()) } pkmn, err := pokemonparsing.ParseAll(rawPokemon) if err != nil { render(c, http.StatusUnprocessableEntity, gin.H{"error": err.Error()}) return } render(c, http.StatusOK, gin.H{"pkmn": pkmn}) }