| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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, pkmn)
- }
|