2

I have a path parameter in the format of a distinguished name, and this contains backslash characters.

CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\+nFSkqy1xBrYUTbxGpzLEcg=

I have the path pattern in go-chi server setup like: router.Get("/companies/{companyId}", handlers.GetCompanyByID)

If I make the API call with this path value uri-encoded in postman,

GET https://localhost:8080/v1/companies/CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D

I get 404 Not Found, meaning it's not looking in the right place/calling the expected handler. If I use a uuid in the same path param (or even the same DN String with no backslash), it is calling the handler properly.

I need to have this DN string value inside my handler, Is there a regex pattern that will match the path string or Is there any other solution to handle this?. TIA.

Arun
  • 57
  • 4
  • Your encoded url contains `%5C%5C`, i.e. *two* backslashes, where the DN contains one. So the problem appears to be on the encoding side. – hobbs Aug 24 '23 at 02:36
  • That's a typo (edited it). Thanks for pointing it out. either way it's not working. – Arun Aug 24 '23 at 02:46

1 Answers1

1

Looks like the route works correctly.

See this demo:

package main

import (
    "fmt"
    "net/http"

    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
)

func main() {
    r := chi.NewRouter()
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)

    r.Get("/v1/companies/{companyId}", func(w http.ResponseWriter, r *http.Request) {
        companyID := chi.URLParam(r, "companyId")
        fmt.Println("companyId:", companyID)
        _, _ = w.Write([]byte(companyID))
    })

    http.ListenAndServe(":8080", r)
}

Sending request with cURL:

$ curl -i 'http://localhost:8080/v1/companies/CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D' 
HTTP/1.1 200 OK
Date: Thu, 24 Aug 2023 03:44:33 GMT
Content-Length: 107
Content-Type: text/plain; charset=utf-8

CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbxGpzLEcg%3D

BTW, please note that the value is used in a path, not in a query. If you encode the value in JavaScript, you should use encodeURI instead of encodeURIComponent. The snippet below shows the difference:

console.log(encodeURI('CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\\+nFSkqy1xBrYUTbxGpzLEcg='));
// CN=CS.Test%20Company%20Hello,OU=World,O=Hello,dnQualifier=m1Ws%5C+nFSkqy1xBrYUTbxGpzLEcg=

console.log(encodeURIComponent('CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\\+nFSkqy1xBrYUTbxGpzLEcg='));
// CN%3DCS.Test%20Company%20Hello%2COU%3DWorld%2CO%3DHello%2CdnQualifier%3Dm1Ws%5C%2BnFSkqy1xBrYUTbx

And use the value returned from encodeURI:

$ curl -i 'http://localhost:8080/v1/companies/CN=CS.Test%20Company%20Hello,OU=World,O=Hello,dnQualifier=m1Ws%5C+nFSkqy1xBrYUTbxGpzLEcg='
HTTP/1.1 200 OK
Date: Thu, 24 Aug 2023 03:54:59 GMT
Content-Length: 83
Content-Type: text/plain; charset=utf-8

CN=CS.Test Company Hello,OU=World,O=Hello,dnQualifier=m1Ws\+nFSkqy1xBrYUTbxGpzLEcg=
Zeke Lu
  • 6,349
  • 1
  • 17
  • 23
  • I was using EncodeURIComponent in postman which was equivalent to encodeURIComponent of javascript. EncodeURI equivalent encoding worked. – Arun Aug 24 '23 at 07:51
  • According to my test, use the value returned from `encodeURIComponent` hits the handler too. Can you provide a minimal reproducer so that we can find out why it does not hit the handler in your project? – Zeke Lu Aug 24 '23 at 08:16
  • In Postman, the backslash in path is converted to a forward slash in backend somehow and hence the route pattern did not match in my case. manually encoding did it. – Arun Aug 24 '23 at 09:22
  • Understood. Thanks for the information! – Zeke Lu Aug 24 '23 at 09:45