'Parse Content Disposition header in GO

I am trying to retrieve the filename from this http writer for testing purposes. On the server I have:

func servefile(w http.ResponseWriter, r *http.Request ) {
...
// file.Name() is randomized with os.CreateTemp(dir, temp+"*"+ext) above
    w.Header().Set("Content-Disposition", "attachment; filename="+file.Name())
    w.Header().Set("Content-Type", "application/octet-stream")
    http.ServeFile(w, r, file.Name()+".xyz") // serve file to user to download
...
}

*I put .xyz as a place holder for this demonstration

I am testing this function programatically with Go and I want to access the filename to able to save it in a variable in the client code.

I have looked at this post How can I parse the Content-Disposition header to retrieve the filename property? , but I have not gotten it to work. I have no clue what the filename is on the client side so I don't know how to reference it specifically. I know my code on the server side works, because when I send a request (through the browser) to this endpoint/function, the "Downloads" popup shows the file download progress with the name of the file.

EDIT** This is the client code I am calling it from:

func TestGetFile(t *testing.T) {
...
    cid := "some string"
    // requestfile() creates, executes, and returns an httptest.ResponseRecorder to the requestFile endpoint
    reqfileRespRecorder := requestfile()

    // createTmpFile creates a new file out of the contents recieved in requestfile()
    filePath := "/tmp/temp.xyz"
    file := createTmpFile(reqfileRespRecorder , filePath)

    // CreateWriter() - writes file contents to body of multipart.Writer
    w, body := createWriter(file)

    // Create request to postRecord endpoint
    req, err := http.NewRequest("POST", "/PostRecord?CID="+cid, body)
    check(err)
    req.Header.Add("Content-Type", w.FormDataContentType())

    // execute request to PostRecord endpoint. returns an httptest.ResponseRecorder
    respRecorder := executeRequest(PostRecord, req)

    disposition, params, err := mime.ParseMediaType(`Content-Disposition`)
...
}


Solution 1:[1]

Based on @BaytaDarrell's comment. It dawned on me that I could print out the responses. That helped me realize that I was trying to find the content-disposition after the wrong request/response. The linked post still didn't help, but I got my code working like this:

func TestGetFile(t *testing.T) {
...
    cid := "some string"
    // requestfile() creates, executes, and returns an httptest.ResponseRecorder to the requestFile endpoint
    reqfileRespRecorder := requestfile()

    disp := reqfileRespRecorder.Header().Get("Content-Disposition")
    line := strings.Split(disp, "=")
    filename := line[1]
    fmt.Println("filename: ", filename)

    // createTmpFile creates a new file out of the contents recieved in requestfile()
    filePath := "/tmp/temp.xyz"
    file := createTmpFile(reqfileRespRecorder , filePath)

    // CreateWriter() - writes file contents to body of multipart.Writer
    w, body := createWriter(file)
...
}

Their comment realized I should re-look at the httptest package documentation. Here I found the Header() function and that I can use it to look at the header with Get().

This line reqfileRespRecorder.Header().Get("Content-Disposition") returns attachment; filename=temp37bf73gd.xyz and to store the filename in a variable I split on =.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marco R.