Preserving special characters when reading Go POST request body

91 views
Skip to first unread message

Hugh Myrie

unread,
Jul 1, 2024, 3:03:39 PM (yesterday) Jul 1
to golang-nuts
I am trying to preserve special characters (group separators and field separators) when reading the request body from a POST request.

When I do a dumpRequest I am able to see the special characters (Hex Format, for example: \x1c or \x03). I am sending the data from the client as text/plain.

I have tried sending the data as JSON and using the decoder in Go. I have also tried using Base64 and decoding in go accordingly. I have tried json.unmarshal to decode the incoming JSON data. However, in every instance the special characters are removed.

I need the special characters to be preserved so I can send the data for further processing. I need the special characters not the hexadecimal representation.

I am able to see the actual data being sent to the Go server. I also tried encoding the data from the client side.

Your help would be greatly appreciated.

Ian Lance Taylor

unread,
Jul 1, 2024, 9:04:05 PM (yesterday) Jul 1
to Hugh Myrie, golang-nuts
Can you provide a reasonably small, but complete, example that
demonstrates the problem?

Ian

Dan Kortschak

unread,
8:33 AM (13 hours ago) 8:33 AM
to golan...@googlegroups.com
This looks to be working as expected. https://go.dev/play/p/fqLPbsMKaOm

How are you seeing the bytes being missing?


Hugh Myrie

unread,
9:28 AM (12 hours ago) 9:28 AM
to Dan Kortschak, golan...@googlegroups.com
Copying the result to notepad confirms the missing special characters.. 

I'll try your suggestion.

Thanks.

Virus-free.www.avg.com

--
You received this message because you are subscribed to a topic in the Google Groups "golang-nuts" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/golang-nuts/8cLWTdxHQCI/unsubscribe.
To unsubscribe from this group and all its topics, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/9cf1e4d31b68f7601839a450e1a9aa572458e756.camel%40kortschak.io.


--

Hugh Myrie

unread,
6:39 PM (3 hours ago) 6:39 PM
to golang-nuts
The original Go function is shown below. Initially, a JSON-encoded string is sent from the client. The first print function is used to view the output after decoding.


func SendClaim(w http.ResponseWriter, r *http.Request) {
    //  strEcho := "Halo"
    servAddr := tcpAddress

    type Resp struct {
        Status string `json:"status"`
        Reply  string `json:"reply"`
    }
    type Claim struct {
        ClaimInfo string `json:"claiminfo"`
    }

    var params Claim

    erx := json.NewDecoder(r.Body).Decode(&params)
    if erx != nil {
        http.Error(w, erx.Error(), http.StatusBadRequest)
        fmt.Println("Error occurs here")
        log.Printf(erx.Error())
        return
    }
    fmt.Printf("Claims: %s \n", params)
    //  policy := params.CardNo //r.FormValue("cardno")
    //  log.Println("policy # ", policy)

    tcpAddr, err := net.ResolveTCPAddr("tcp", servAddr)
    if err != nil {
        println("ResolveTCPAddr failed:", err.Error())
        respondWithError(w, http.StatusBadRequest, err.Error())
        return
    }

    data := params.ClaimInfo
    //  printr := r.FormValue("printer")

    fmt.Println(data)
    conn, err := net.DialTCP("tcp", nil, tcpAddr)
    if err != nil {
        println("Dial failed:", err.Error())
        respondWithError(w, http.StatusBadRequest, err.Error())
        return
    }

    _, err = conn.Write([]byte(data))
    if err != nil {
        println("Write to server failed:", err.Error())
        respondWithError(w, http.StatusBadRequest, err.Error())
        return
    }

    reply := make([]byte, 1024)

    _, err = conn.Read(reply)
    if err != nil {
        println("Write to server failed:", err.Error())
        respondWithError(w, http.StatusBadRequest, err.Error())
        return
    }

    resp := Resp{}
    println("reply from server=", string(reply))
    resp.Status = "response"
    resp.Reply = string(reply)

    respondWithJSON(w, http.StatusOK, resp)

    conn.Close()
}


Ian Lance Taylor

unread,
7:15 PM (2 hours ago) 7:15 PM
to Hugh Myrie, golang-nuts
1) Please send Go code as plain text, not as an image.  Anybody can read plain text.  Images are hard to read.  Thanks.

2) What do you see if you change the %s to %q in the fmt.Printf call?

Ian

You received this message because you are subscribed to the Google Groups "golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/6fd2520e-a7e3-43ed-89d5-dc96419d8a89n%40googlegroups.com.

Hugh Myrie

unread,
8:28 PM (1 hour ago) 8:28 PM
to golang-nuts
When I change the %s to %q in the print function I see the special characters in their Hexadecimal representations.

See below:

0011020240702\x1d02017580000001030085245467021.00Y00000000000050072     2024070200000000000000000\x1cDG\x1cDI00\x1cE700000000\x1cG1200       \x1cG2X \x1cG310\x1cG4E79   \x03


I am using the original code (JSON).

How do I then change them back to the actual characters?

Hugh Myrie

unread,
9:04 PM (22 minutes ago) 9:04 PM
to golang-nuts
Go code as plain text below:

unc SendClaim(w http.ResponseWriter, r *http.Request) {
//  strEcho := "Halo"
servAddr := tcpAddress

type Resp struct {
Status string `json:"status"`
Reply  string `json:"reply"`
}
type Claim struct {
ClaimInfo string `json:"claiminfo"`
}

var params Claim

erx := json.NewDecoder(r.Body).Decode(&params)
if erx != nil {
http.Error(w, erx.Error(), http.StatusBadRequest)
fmt.Println("Error occurs here")
log.Printf(erx.Error())
return
}
fmt.Printf("Claims: %s", params)
Reply all
Reply to author
Forward
0 new messages