Skip to content

Attachments in v5 returning 404 and type application/json #2929

@henderb

Description

@henderb

This code works in v4, but when run in v5, the browser says ERR_INVALID_RESPONSE

package main

import (
	"encoding/csv"
	"errors"
	"log"
	"net/http"
	"os"
	"strconv"

	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
)

type Item struct {
	Name  string
	Price float64
	Cost  float64
}

func main() {
	e := echo.New()
	e.Use(middleware.RequestLogger())
	e.Use(middleware.Gzip())

	e.GET("/data.csv", func(c echo.Context) error {

		items := []Item{
			Item{
				Name:  "Item 1",
				Price: 10.99,
				Cost:  4.63,
			},
			Item{
				Name:  "Item 2",
				Price: 20.99,
				Cost:  12.82,
			},
		}

		f, err := os.CreateTemp("/tmp/", "data-*.csv")
		if err != nil {
			e.Logger.Error("Could not create data temp file", err)
			return c.HTML(500, "Could not create data temp file")
		}
		defer f.Close()

		ic := csv.NewWriter(f)
		ic.Write([]string{
			"Name",
			"Price",
			"Cost"})
		for _, item := range items {
			row := []string{
				item.Name,
				strconv.FormatFloat(item.Price, 'f', 2, 64),
				strconv.FormatFloat(item.Cost, 'f', 3, 64)}

			ic.Write(row)
		}
		ic.Flush()

		return c.Attachment(f.Name(), "data.csv")
	})

	if err := e.Start(":8080"); err != nil && !errors.Is(err, http.ErrServerClosed) {
		log.Fatal(err)
	}
}

v5:

package main

import (
	"encoding/csv"
	"errors"
	"log"
	"net/http"
	"os"
	"strconv"

	"github.com/labstack/echo/v5"
	"github.com/labstack/echo/v5/middleware"
)

type Item struct {
	Name  string
	Price float64
	Cost  float64
}

func main() {
	e := echo.New()
	e.Use(middleware.RequestLogger())
	e.Use(middleware.Gzip())

	e.GET("/data.csv", func(c *echo.Context) error {

		items := []Item{
			Item{
				Name:  "Item 1",
				Price: 10.99,
				Cost:  4.63,
			},
			Item{
				Name:  "Item 2",
				Price: 20.99,
				Cost:  12.82,
			},
		}

		f, err := os.CreateTemp("/tmp/", "data-*.csv")
		if err != nil {
			e.Logger.Error("Could not create data temp file", err)
			return c.HTML(500, "Could not create data temp file")
		}
		defer f.Close()

		ic := csv.NewWriter(f)
		ic.Write([]string{
			"Name",
			"Price",
			"Cost"})
		for _, item := range items {
			row := []string{
				item.Name,
				strconv.FormatFloat(item.Price, 'f', 2, 64),
				strconv.FormatFloat(item.Cost, 'f', 3, 64)}

			ic.Write(row)
		}
		ic.Flush()

		return c.Attachment(f.Name(), "data.csv")
	})

	if err := e.Start(":8080"); err != nil && !errors.Is(err, http.ErrServerClosed) {
		log.Fatal(err)
	}
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions