.net UrlEncode - lowercase problem

后端 未结 7 979
梦如初夏
梦如初夏 2020-11-27 19:56

I\'m working on a data transfer for a gateway which requires me to send data in UrlEncoded form. However, .net\'s UrlEncode creates lowercase tags, and it breaks the transfe

相关标签:
7条回答
  • 2020-11-27 20:45

    Here's my VB.NET conversion of the public OAuth.OAuthBase version of UrlEncode (for .NET 2.0/3.5):

    ' MEH: Made this ReadOnly because the range of unreserved characters is specified in the OAuth spec. Inheritors ought not change it.
    Protected Shared ReadOnly unreservedChars As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"
    ' MEH: Added. These are the other characters HttpUtility.UrlEncode does not convert to percent encoding itself.
    Protected Shared ReadOnly reservedChars As String = " !'()*" ' If this moves to .NET 4+ ' can be removed.
    
    
    ''' <summary>
    ''' This is a different Url Encode implementation since the default .NET one outputs the percent encoding in lower case.
    ''' While this is not a problem with the percent encoding spec, it is used in upper case throughout OAuth.
    ''' Also the OAuth spec explicitly requires some characters to be unencoded.
    ''' </summary>
    ''' <param name="Value">The value to Url encode</param>
    ''' <returns>Returns a Url encoded string</returns>
    ''' <revisionhistory>
    '''   140313 MEH Fixed to correctly cater for any characters between %80 and %ff, and the O(n^2) IndexOf call.
    ''' </revisionhistory>
    Public Shared Function UrlEncode(ByVal Value As String) As String
        Dim result, buffer As New StringBuilder()
    
        For Each symbol As Char In Value
            If unreservedChars.IndexOf(symbol) <> -1 Then
                UrlEncodeAppendClear(result, buffer).Append(symbol)
            ElseIf reservedChars.IndexOf(symbol) = -1 Then
                'some symbols produce 2 or more octets in UTF8 so the system urlencoder must be used to get the correct data
                ' but this is best done over a full sequence of characters, so just store this one in a buffer.
                buffer.Append(symbol)
            Else ' These characters are not converted to percent encoding by UrlEncode.
                UrlEncodeAppendClear(result, buffer).AppendFormat(Globalization.CultureInfo.InvariantCulture, "%{0:X2}", AscW(symbol))
            End If
        Next
        UrlEncodeAppendClear(result, buffer)
        Return result.ToString()
    End Function
    
    
    Private Shared percentHex As New RegularExpressions.Regex("(%[0-9a-f][0-9a-f])", RegularExpressions.RegexOptions.Compiled)
    
    ''' <summary>
    '''  Actually performs the UrlEncode on any buffered characters, ensuring the resulting percents are uppercased and clears the buffer.
    ''' </summary>
    ''' 
    ''' <param name="Result">The result of the UrlEncode is appended here.</param>
    ''' <param name="Buffer">The current buffer of characters to be encoded. Cleared on return.</param>
    ''' 
    ''' <returns>The <paramref name="Result">Result</paramref>, as passed in, with the UrlEncoding of the <paramref name="Buffer">buffer of characters</paramref> appended.</returns>
    ''' 
    ''' <remarks>Would like to be an extension method.</remarks>
    ''' 
    ''' <revisionhistory>
    '''   140313 MEH Created.
    ''' </revisionhistory>
    Private Shared Function UrlEncodeAppendClear(ByVal Result As StringBuilder, ByVal Buffer As StringBuilder) As StringBuilder
        If Buffer.Length > 0 Then
            Result.Append(percentHex.Replace(HttpUtility.UrlEncode(Buffer.ToString), Function(c) c.Value.ToUpperInvariant()))
            Buffer.Length = 0
        End If
        Return Result
    End Function
    
    0 讨论(0)
提交回复
热议问题