Skip to content

fix(client): correctly marshal text/plain requests #1975

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

jamietanna
Copy link
Member

@jamietanna jamietanna commented May 10, 2025

As noted in #1914, there are cases where trying to interact with a
text/plain endpoint that requires input, for instance when receiving a
UUID, may not render correctly.

We should first check if the type is a Stringer, aka has a String()
method, and use that - otherwise use fmt.Sprintf("%v", ...) to
generate a string type.

Via 0, we can make sure that we wrap the generated type in an empty
interface, so we can perform the type assertion.

This also adds a test case to validate the functionality for:

  • a UUID, which has a String() method
  • a float32, which is a primitive datatype that needs to use
    fmt.Sprintf

Co-authored-by: claude-sonnet:3.7-thinking

Closes #1914.

As noted in #1914, there are cases where trying to interact with a
`text/plain` endpoint that requires input, for instance when receiving a
UUID, may not render correctly.

We should first check if the type is a `Stringer`, aka has a `String()`
method, and use that - otherwise use `fmt.Sprintf("%v", ...)` to
generate a string type.

Via [0], we can make sure that we wrap the generated type in an empty
`interface`, so we can perform the type assertion.

This also adds a test case to validate the functionality for:

- a UUID, which has a `String()` method
- a `float32`, which is a primitive datatype that needs to use
  `fmt.Sprintf`

Co-authored-by: claude-sonnet:3.7-thinking <github-copilot@jamietanna.co.uk>

Closes #1914.

[0]: https://www.jvt.me/posts/2025/05/10/go-type-assertion-concrete/
if stringer, ok := interface{}(body).(fmt.Stringer); ok {
bodyReader = strings.NewReader(stringer.String())
} else {
bodyReader = strings.NewReader(fmt.Sprintf("%v", body))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
bodyReader = strings.NewReader(fmt.Sprintf("%v", body))
bodyReader = strings.NewReader(fmt.Sprint(body))

@jamietanna jamietanna modified the milestones: v2.5.0, v2.6.0 Jul 15, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working client
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Cannot convert text/plain uuid in requestBody to string
2 participants