From 430d9127c6cb771653d713c3f7ede8c24f234953 Mon Sep 17 00:00:00 2001 From: Rick <1450685+LinuxSuRen@users.noreply.github.com> Date: Sat, 8 Feb 2025 16:42:08 +0800 Subject: [PATCH] fix: content disposition filename parsing error (#613) Co-authored-by: rick --- pkg/runner/runner.go | 4 +- pkg/runner/runner_test.go | 79 +++++++++++++++++++++++++-------------- 2 files changed, 53 insertions(+), 30 deletions(-) diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index dcd40fe..f746f73 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -55,7 +55,9 @@ type SimpleResponse struct { func (s SimpleResponse) getFileName() string { for k, v := range s.Header { if k == "Content-Disposition" { - return strings.TrimSuffix(strings.TrimPrefix(v, `attachment; filename="`), `"`) + v = strings.ReplaceAll(v, "attachment; filename=", "attachment;filename=") + v = strings.ReplaceAll(v, `filename="`, "filename=") + return strings.TrimSuffix(strings.TrimPrefix(v, `attachment;filename=`), `"`) } } return "" diff --git a/pkg/runner/runner_test.go b/pkg/runner/runner_test.go index d2839ae..98edd03 100644 --- a/pkg/runner/runner_test.go +++ b/pkg/runner/runner_test.go @@ -1,5 +1,5 @@ /* -Copyright 2023-2024 API Testing Authors. +Copyright 2023-2025 API Testing Authors. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -17,47 +17,68 @@ limitations under the License. package runner import ( - "testing" + "testing" - atest "github.com/linuxsuren/api-testing/pkg/testing" - "github.com/stretchr/testify/assert" + atest "github.com/linuxsuren/api-testing/pkg/testing" + "github.com/stretchr/testify/assert" ) func TestRunnerFactory(t *testing.T) { - runner := GetTestSuiteRunner(&atest.TestSuite{}) - assert.IsType(t, NewSimpleTestCaseRunner(), runner) + runner := GetTestSuiteRunner(&atest.TestSuite{}) + assert.IsType(t, NewSimpleTestCaseRunner(), runner) - runner = GetTestSuiteRunner(&atest.TestSuite{Spec: atest.APISpec{Kind: "grpc", RPC: &atest.RPCDesc{}}}) - assert.IsType(t, NewGRPCTestCaseRunner("", atest.RPCDesc{}), runner) + runner = GetTestSuiteRunner(&atest.TestSuite{Spec: atest.APISpec{Kind: "grpc", RPC: &atest.RPCDesc{}}}) + assert.IsType(t, NewGRPCTestCaseRunner("", atest.RPCDesc{}), runner) } func TestUnimplementedRunner(t *testing.T) { - runner := NewDefaultUnimplementedRunner() - output, err := runner.RunTestCase(&atest.TestCase{}, nil, nil) - assert.Nil(t, output) - assert.Error(t, err) + runner := NewDefaultUnimplementedRunner() + output, err := runner.RunTestCase(&atest.TestCase{}, nil, nil) + assert.Nil(t, output) + assert.Error(t, err) - runner.WithWriteLevel("debug") - runner.WithTestReporter(nil) + runner.WithWriteLevel("debug") + runner.WithTestReporter(nil) - var results []*atest.TestCase - results, err = runner.GetSuggestedAPIs(nil, "") - assert.Nil(t, results) - assert.NoError(t, err) + var results []*atest.TestCase + results, err = runner.GetSuggestedAPIs(nil, "") + assert.Nil(t, results) + assert.NoError(t, err) - runner.WithAPISuggestLimit(0) + runner.WithAPISuggestLimit(0) } func TestSimpleResponse(t *testing.T) { - t.Run("get fileName", func(t *testing.T) { - // without filename - assert.Empty(t, SimpleResponse{}.getFileName()) + t.Run("get fileName", func(t *testing.T) { + // without filename + assert.Empty(t, SimpleResponse{}.getFileName()) - // normal case - assert.Equal(t, "a.txt", SimpleResponse{ - Header: map[string]string{ - "Content-Disposition": `attachment; filename="a.txt"`, - }, - }.getFileName()) - }) + // normal case + assert.Equal(t, "a.txt", SimpleResponse{ + Header: map[string]string{ + "Content-Disposition": `attachment; filename="a.txt"`, + }, + }.getFileName()) + + // without space + assert.Equal(t, "a.txt", SimpleResponse{ + Header: map[string]string{ + "Content-Disposition": `attachment;filename="a.txt"`, + }, + }.getFileName()) + + // without quote + assert.Equal(t, "a.txt", SimpleResponse{ + Header: map[string]string{ + "Content-Disposition": `attachment; filename=a.txt`, + }, + }.getFileName()) + + // without quote and space + assert.Equal(t, "a.txt", SimpleResponse{ + Header: map[string]string{ + "Content-Disposition": `attachment;filename=a.txt`, + }, + }.getFileName()) + }) }