abegosum
abegosum

Reputation: 637

Can ServiceStack routes not handle special characters in their values?

I'm developing an API for our business.

Requests should require authTokens that require a POST http verb to retrieve. The flow should work like this-

  1. User's client POSTS username and password (ssl protected) to the GetAuthToken service. Service returns auth token.
  2. User's client can use token in any other request, no longer requiring POST.

I've written a convenience rest function, CheckAuthToken, to allow users to debug whether their working auth token is correct. It requires the email address of the user and the auth token to check. This works fine in SOAP and via POST, but the route doesn't seem to work via GET.

Here's the DTO:

[Route("/auth/CheckAuthToken/{EmailAddress}/{AuthToken}")]
public class CheckAuthToken
{
    public string EmailAddress { get; set; }
    public string AuthToken { get; set; }
}

If I request, for example (note the %2E, at the recommendation of this post: ServiceStack Handler Not Found When Periods Present in Path):

GET /auth/CheckAuthToken/aaron%40meemailsite%2Ecom/Hnot0real0auth0token4mzSBhKwFXY6xQcgX6XqsE%3D HTTP/1.1\r\n

I still get a 404. It seems like the period is being decoded before handing off to ServiceStack.

I recognize that I could use query string variables instead, making my request this:

GET /auth/CheckAuthToken?EmailAddress=aaronb%40bluebookinc%2Ecom&AuthToken=HwjQoKiHD2HSngFeeCH1k4mzSBhKwFXY6xQcgX6XqsE%3D HTTP/1.1\r\n

But, I was hoping to be more flexible than that, especially in my business layer REST services, which will also require user identification via email on certain functions.

Any ideas?

Upvotes: 1

Views: 441

Answers (1)

kampsj
kampsj

Reputation: 3149

What version of ServiceStack are you running?

This is a passing test in the latest version (3.9.55). I also tested with a simple API with your endpoints and was having no problems passing those values in the url.

[Route("/auth/CheckAuthToken/{EmailAddress}/{AuthToken}")]
public class CheckAuthToken : IReturn
{
    public string EmailAddress { get; set; }
    public string AuthToken { get; set; }
}

[Test]
public void Test()
{
    var url = new CheckAuthToken() { 
        EmailAddress = "[email protected]", 
        AuthToken = "fake" 
    }.ToUrl("GET");

    Assert.That(url, Is.EqualTo("/auth/CheckAuthToken/me%40test.com/fake"));
}

Upvotes: 1

Related Questions