Need you opinion on a hack

Welcome Forums General PowerShell Q&A Need you opinion on a hack

This topic contains 3 replies, has 2 voices, and was last updated by

4 years, 7 months ago.

  • Author
  • #13526

    Points: 0
    Rank: Member

    Hi all,

    I am working on a module for administering RabbitMQ servers. All communication with the server is through REST API, so I'm using Invoke-RestMethod extensively. Unfortunately, some methods require passing forward slash (/) in the url in it's encoded form: %2f. As it turns out, in .NET Framework versions earlier than 4.5, the Invoke-RestMethod will automatically un-escape the forward slash back to /. After some research I found a way to hack that behaviour. It requires bit of reflection to modify internal flag on UriParser class, but the problem is that this will affect whole PowerShell session. I came with following way to tackle the problem:

    • on module registration – detect if hack is needed, print warning to the user
    • before invoking rest method which requires hack – modify internal flag
    • after invoking rest method, in finally block – restore state before applying hack
    • add verbose output whenever hack is applied
    • add extra information in module's help explaining the problem

    Can anyone think about what else I could do to minimise impact of the hack. What could be done in a better way, or perhaps there is better approach?

    I wrote an article explaining how to prevent unescaping in url's at
    the modules code is on GitHub:
    Files related to the problem are: PreventUnEscapeDotsAndSlashesOnUri.ps1 and AddExchange.ps1.

    I much appreciate any input.

    Thanks a lot, Mariusz

  • #13536

    Points: 0
    Rank: Member

    Assuming there's no other way of getting around this (perhaps by double-escaping the slashes or something), I'd probably write a proxy function for Invoke-RestMethod which temporarily sets that flag, then sets it back when finished. That would limit the impact to the single pipeline where Invoke-RestMethod is called. Basically the same thing you've described, except the person calling Invoke-RestMethod doesn't have to do the work; they can just call the function the same way they would call the cmdlet.

  • #13546

    Points: 0
    Rank: Member

    Brilliant idea Dave. That will much simplify the code in functions. I am thinking about adding new parameter to Invoke-RestMethod cmdlet called -AllowEscapedDotsAndSlashes, which when set will apply the hack to make call possible.

    Thanks a lot for the suggestion, very much appreciated. And I have learned something new again 🙂

  • #13611

    Points: 0
    Rank: Member

    For anyone interested, the proxy function over Invoke-RestMethod which allows for escaped dots and slashes:

    Thanks again, Dave

The topic ‘Need you opinion on a hack’ is closed to new replies.