vbscriptasp-classicserverxmlhttp

Using variables with setRequestHeader, why won't they work?


Edit: Problem is solved. For some reason the Base64Encode function was putting a line break in the output string, something I didn't notice until I response.write the output and looked at the source code of the page instead of the compiled page.


I'm trying to send JSON to a remote server in order to get back a JSON response (Basically I send them data, they perform calculations based on my data and send back different data). However instead of getting data back the server tells me the request failed authentication.

The Authentication involves sending a base64 encoded string, username, and password combined. These values can change so I'm using variables to pass the information on. This does not work, however if I enter the fully encoded value as a string it does work.

Function GetAPdataPost(sSendHTML, sURL)
  dim apHTTP
  dim sHTTPResponse
  dim API_KEY
  dim API_PWD
  dim auth

  API_KEY     = "fred"
  API_PWD     = "barney"
  auth = Base64Encode(API_KEY & ":" & API_PWD)
  Set apHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
  apHTTP.Open "POST", sURL, false
  apHTTP.setRequestHeader "Content-Type", "application/json; charset=UTF-8" 
  apHTTP.setRequestHeader "Authorization","Basic ZnJlZDpiYXJuZXk=" '<-- works
  apHTTP.setRequestHeader "Authorization", "Basic " & auth '<-- doesn't work
  apHTTP.setRequestHeader "Content-Length", len(sSendHTML)
  apHTTP.setRequestHeader "Accept", "*/*"
  apHTTP.setRequestHeader "Account-Number", "00000004"
  apHTTP.setRequestHeader "Cache-Control", "no-cache"
  apHTTP.setRequestHeader "Connection", "close"

  On Error Resume Next
  apHTTP.send sSendHTML

  sHTTPResponse = apHTTP.responseText

  If Err.Number = 0 Then
    GetAPdataPost = sHTTPResponse
  Else
    GetAPdataPost = "Something went wrong: " & Err.Number
  End If
  On Error Goto 0

  Set apHTTP = Nothing
End Function

Using the first line result in a proper response form the server, a valid JSON string with all the required data. The second line results in a JSON string saying "The request failed authentication".

So aside from typing out the Base64 encoded string how do I get a variable to be recognised as a valid string?

I should just note that I have tried surrounding auth with double quotes ("") and Chr(34) to no avail.

Edit: Base64 Encode function.

Function Base64Encode(sText)
    Dim oXML, oNode

    Set oXML = CreateObject("Msxml2.DOMDocument.3.0")
    Set oNode = oXML.CreateElement("base64")
    oNode.dataType = "bin.base64"
    oNode.nodeTypedValue =Stream_StringToBinary(sText)
    Base64Encode = oNode.text
    Set oNode = Nothing
    Set oXML = Nothing
End Function

Function Stream_StringToBinary(Text)
  Const adTypeText = 2
  Const adTypeBinary = 1

  'Create Stream object
  Dim BinaryStream 'As New Stream
  Set BinaryStream = CreateObject("ADODB.Stream")

  'Specify stream type - we want To save text/string data.
  BinaryStream.Type = adTypeText

  'Specify charset For the source text (unicode) data.
  BinaryStream.CharSet = "us-ascii"

  'Open the stream And write text/string data To the object
  BinaryStream.Open
  BinaryStream.WriteText Text

  'Change stream type To binary
  BinaryStream.Position = 0
  BinaryStream.Type = adTypeBinary

  'Ignore first two bytes - sign of
  BinaryStream.Position = 0

  'Open the stream And get binary data from the object
  Stream_StringToBinary = BinaryStream.Read

  Set BinaryStream = Nothing
End Function

Solution

  • The Base64Encode function was putting a line break in the output string, something I didn't notice until I response.write the output and looked at the source code of the page instead of the compiled page.

    Always remember to look at the raw data, not just the displayed data (i.e. not like me)