1*eeb7e5b3SAdam Hornáček' The MIT License (MIT) 2*eeb7e5b3SAdam Hornáček' 3*eeb7e5b3SAdam Hornáček' Copyright (c) 2016 Tim Hall 4*eeb7e5b3SAdam Hornáček' 5*eeb7e5b3SAdam Hornáček' Permission is hereby granted, free of charge, to any person obtaining a copy 6*eeb7e5b3SAdam Hornáček' of this software and associated documentation files (the "Software"), to deal 7*eeb7e5b3SAdam Hornáček' in the Software without restriction, including without limitation the rights 8*eeb7e5b3SAdam Hornáček' to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9*eeb7e5b3SAdam Hornáček' copies of the Software, and to permit persons to whom the Software is 10*eeb7e5b3SAdam Hornáček' furnished to do so, subject to the following conditions: 11*eeb7e5b3SAdam Hornáček' 12*eeb7e5b3SAdam Hornáček' The above copyright notice and this permission notice shall be included in all 13*eeb7e5b3SAdam Hornáček' copies or substantial portions of the Software. 14*eeb7e5b3SAdam Hornáček' 15*eeb7e5b3SAdam Hornáček' THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*eeb7e5b3SAdam Hornáček' IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*eeb7e5b3SAdam Hornáček' FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18*eeb7e5b3SAdam Hornáček' AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*eeb7e5b3SAdam Hornáček' LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20*eeb7e5b3SAdam Hornáček' OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21*eeb7e5b3SAdam Hornáček' SOFTWARE. 22*eeb7e5b3SAdam Hornáček 23*eeb7e5b3SAdam HornáčekVERSION 1.0 CLASS 24*eeb7e5b3SAdam HornáčekBEGIN 25*eeb7e5b3SAdam Hornáček MultiUse = -1 'True 26*eeb7e5b3SAdam HornáčekEND 27*eeb7e5b3SAdam HornáčekAttribute VB_Name = "WebResponse" 28*eeb7e5b3SAdam HornáčekAttribute VB_GlobalNameSpace = False 29*eeb7e5b3SAdam HornáčekAttribute VB_Creatable = False 30*eeb7e5b3SAdam HornáčekAttribute VB_PredeclaredId = False 31*eeb7e5b3SAdam HornáčekAttribute VB_Exposed = True 32*eeb7e5b3SAdam Hornáček'' 33*eeb7e5b3SAdam Hornáček' WebResponse v4.1.3 34*eeb7e5b3SAdam Hornáček' (c) Tim Hall - https://github.com/VBA-tools/VBA-Web 35*eeb7e5b3SAdam Hornáček' 36*eeb7e5b3SAdam Hornáček' Wrapper for http/cURL responses that includes parsed Data based on WebRequest.ResponseFormat. 37*eeb7e5b3SAdam Hornáček' 38*eeb7e5b3SAdam Hornáček' Usage: 39*eeb7e5b3SAdam Hornáček' ```VB.net 40*eeb7e5b3SAdam Hornáček' Dim Response As WebResponse 41*eeb7e5b3SAdam Hornáček' Set Response = Client.Execute(Request) 42*eeb7e5b3SAdam Hornáček' 43*eeb7e5b3SAdam Hornáček' If Response.StatusCode = WebStatusCode.Ok Then 44*eeb7e5b3SAdam Hornáček' ' Response.Headers, Response.Cookies 45*eeb7e5b3SAdam Hornáček' ' Response.Data -> Parsed Response.Content based on Request.ResponseFormat 46*eeb7e5b3SAdam Hornáček' ' Response.Body -> Raw response bytes 47*eeb7e5b3SAdam Hornáček' Else 48*eeb7e5b3SAdam Hornáček' Debug.Print "Error: " & Response.StatusCode & " - " & Response.Content 49*eeb7e5b3SAdam Hornáček' End If 50*eeb7e5b3SAdam Hornáček' ``` 51*eeb7e5b3SAdam Hornáček' 52*eeb7e5b3SAdam Hornáček' Errors: 53*eeb7e5b3SAdam Hornáček' 11030 / 80042b16 / -2147210474 - Error creating from http 54*eeb7e5b3SAdam Hornáček' 11031 / 80042b17 / -2147210473 - Error creating from cURL 55*eeb7e5b3SAdam Hornáček' 11032 / 80042b18 / -2147210472 - Error extracting headers 56*eeb7e5b3SAdam Hornáček' 57*eeb7e5b3SAdam Hornáček' @class WebResponse 58*eeb7e5b3SAdam Hornáček' @author tim.hall.engr@gmail.com 59*eeb7e5b3SAdam Hornáček' @license MIT (http://www.opensource.org/licenses/mit-license.php) 60*eeb7e5b3SAdam Hornáček'' ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' 61*eeb7e5b3SAdam HornáčekOption Explicit 62*eeb7e5b3SAdam Hornáček 63*eeb7e5b3SAdam HornáčekPrivate web_CrLf As String 64*eeb7e5b3SAdam Hornáček 65*eeb7e5b3SAdam Hornáček' --------------------------------------------- ' 66*eeb7e5b3SAdam Hornáček' Properties 67*eeb7e5b3SAdam Hornáček' --------------------------------------------- ' 68*eeb7e5b3SAdam Hornáček 69*eeb7e5b3SAdam Hornáček'' 70*eeb7e5b3SAdam Hornáček' Status code that the server returned (e.g. 200). 71*eeb7e5b3SAdam Hornáček' 72*eeb7e5b3SAdam Hornáček' @property StatusCode 73*eeb7e5b3SAdam Hornáček' @type WebStatusCode 74*eeb7e5b3SAdam Hornáček'' 75*eeb7e5b3SAdam HornáčekPublic StatusCode As WebStatusCode 76*eeb7e5b3SAdam Hornáček 77*eeb7e5b3SAdam Hornáček'' 78*eeb7e5b3SAdam Hornáček' Status string that the server returned (e.g. `404 -> "Not Found"`) 79*eeb7e5b3SAdam Hornáček' 80*eeb7e5b3SAdam Hornáček' @property StatusDescription 81*eeb7e5b3SAdam Hornáček' @type String 82*eeb7e5b3SAdam Hornáček'' 83*eeb7e5b3SAdam HornáčekPublic StatusDescription As String 84*eeb7e5b3SAdam Hornáček 85*eeb7e5b3SAdam Hornáček'' 86*eeb7e5b3SAdam Hornáček' Content string that the server returned. 87*eeb7e5b3SAdam Hornáček' 88*eeb7e5b3SAdam Hornáček' @property Content 89*eeb7e5b3SAdam Hornáček' @type String 90*eeb7e5b3SAdam Hornáček'' 91*eeb7e5b3SAdam HornáčekPublic Content As String 92*eeb7e5b3SAdam Hornáček 93*eeb7e5b3SAdam Hornáček'' 94*eeb7e5b3SAdam Hornáček' Raw bytes for the response. 95*eeb7e5b3SAdam Hornáček' 96*eeb7e5b3SAdam Hornáček' @property Body 97*eeb7e5b3SAdam Hornáček' @type Byte() 98*eeb7e5b3SAdam Hornáček'' 99*eeb7e5b3SAdam HornáčekPublic Body As Variant 100*eeb7e5b3SAdam Hornáček 101*eeb7e5b3SAdam Hornáček'' 102*eeb7e5b3SAdam Hornáček' Parsed `Content` or `Body` based on the `WebRequest.ResponseFormat`. 103*eeb7e5b3SAdam Hornáček' 104*eeb7e5b3SAdam Hornáček' @property Data 105*eeb7e5b3SAdam Hornáček' @type Dictionary|Collection 106*eeb7e5b3SAdam Hornáček'' 107*eeb7e5b3SAdam HornáčekPublic Data As Object 108*eeb7e5b3SAdam Hornáček 109*eeb7e5b3SAdam Hornáček'' 110*eeb7e5b3SAdam Hornáček' Headers that were included with the response. 111*eeb7e5b3SAdam Hornáček' (`Collection` of `KeyValue`) 112*eeb7e5b3SAdam Hornáček' 113*eeb7e5b3SAdam Hornáček' @property Headers 114*eeb7e5b3SAdam Hornáček' @type Collection 115*eeb7e5b3SAdam Hornáček'' 116*eeb7e5b3SAdam HornáčekPublic Headers As Collection 117*eeb7e5b3SAdam Hornáček 118*eeb7e5b3SAdam Hornáček'' 119*eeb7e5b3SAdam Hornáček' Cookies that were included with the response. 120*eeb7e5b3SAdam Hornáček' (`Collection` of `KeyValue`) 121*eeb7e5b3SAdam Hornáček' 122*eeb7e5b3SAdam Hornáček' @property Cookies 123*eeb7e5b3SAdam Hornáček' @type Collection 124*eeb7e5b3SAdam Hornáček'' 125*eeb7e5b3SAdam HornáčekPublic Cookies As Collection 126*eeb7e5b3SAdam Hornáček 127*eeb7e5b3SAdam Hornáček' ============================================= ' 128*eeb7e5b3SAdam Hornáček' Public Methods 129*eeb7e5b3SAdam Hornáček' ============================================= ' 130*eeb7e5b3SAdam Hornáček 131*eeb7e5b3SAdam Hornáček'' 132*eeb7e5b3SAdam Hornáček' Helper for updating the response with the given updated response values. 133*eeb7e5b3SAdam Hornáček' Useful for `ByRef` cases to update response in place. 134*eeb7e5b3SAdam Hornáček' 135*eeb7e5b3SAdam Hornáček' @method Update 136*eeb7e5b3SAdam Hornáček' @param Updated {WebResponse} Updated `WebResponse` to pull updated values from 137*eeb7e5b3SAdam Hornáček'' 138*eeb7e5b3SAdam HornáčekPublic Sub Update(Updated As WebResponse) 139*eeb7e5b3SAdam Hornáček Me.StatusCode = Updated.StatusCode 140*eeb7e5b3SAdam Hornáček Me.StatusDescription = Updated.StatusDescription 141*eeb7e5b3SAdam Hornáček Me.Content = Updated.Content 142*eeb7e5b3SAdam Hornáček Me.Body = Updated.Body 143*eeb7e5b3SAdam Hornáček Set Me.Headers = Updated.Headers 144*eeb7e5b3SAdam Hornáček Set Me.Cookies = Updated.Cookies 145*eeb7e5b3SAdam Hornáček Set Me.Data = Updated.Data 146*eeb7e5b3SAdam HornáčekEnd Sub 147*eeb7e5b3SAdam Hornáček 148*eeb7e5b3SAdam Hornáček'' 149*eeb7e5b3SAdam Hornáček' Create response from http 150*eeb7e5b3SAdam Hornáček' 151*eeb7e5b3SAdam Hornáček' @internal 152*eeb7e5b3SAdam Hornáček' @method CreateFromHttp 153*eeb7e5b3SAdam Hornáček' @param {WebClient} Client 154*eeb7e5b3SAdam Hornáček' @param {WebRequest} Request 155*eeb7e5b3SAdam Hornáček' @param {WinHttpRequest} Http 156*eeb7e5b3SAdam Hornáček' @throws 11030 / 80042b16 / -2147210474 - Error creating from http 157*eeb7e5b3SAdam Hornáček'' 158*eeb7e5b3SAdam HornáčekPublic Sub CreateFromHttp(Client As WebClient, Request As WebRequest, Http As Object) 159*eeb7e5b3SAdam Hornáček On Error GoTo web_ErrorHandling 160*eeb7e5b3SAdam Hornáček 161*eeb7e5b3SAdam Hornáček Me.StatusCode = Http.Status 162*eeb7e5b3SAdam Hornáček Me.StatusDescription = Http.StatusText 163*eeb7e5b3SAdam Hornáček Me.Content = Http.ResponseText 164*eeb7e5b3SAdam Hornáček Me.Body = Http.ResponseBody 165*eeb7e5b3SAdam Hornáček 166*eeb7e5b3SAdam Hornáček web_LoadValues Http.GetAllResponseHeaders, Me.Content, Me.Body, Request 167*eeb7e5b3SAdam Hornáček 168*eeb7e5b3SAdam Hornáček Exit Sub 169*eeb7e5b3SAdam Hornáček 170*eeb7e5b3SAdam Hornáčekweb_ErrorHandling: 171*eeb7e5b3SAdam Hornáček 172*eeb7e5b3SAdam Hornáček Dim web_ErrorDescription As String 173*eeb7e5b3SAdam Hornáček web_ErrorDescription = "An error occurred while creating response from http" & vbNewLine & _ 174*eeb7e5b3SAdam Hornáček Err.Number & VBA.IIf(Err.Number < 0, " (" & VBA.LCase$(VBA.Hex$(Err.Number)) & ")", "") & ": " & Err.Description 175*eeb7e5b3SAdam Hornáček 176*eeb7e5b3SAdam Hornáček WebHelpers.LogError web_ErrorDescription, "WebResponse.CreateFromHttp", 11030 + vbObjectError 177*eeb7e5b3SAdam Hornáček Err.Raise 11030 + vbObjectError, "WebResponse.CreateFromHttp", web_ErrorDescription 178*eeb7e5b3SAdam HornáčekEnd Sub 179*eeb7e5b3SAdam Hornáček 180*eeb7e5b3SAdam Hornáček'' 181*eeb7e5b3SAdam Hornáček' Create response from cURL 182*eeb7e5b3SAdam Hornáček' 183*eeb7e5b3SAdam Hornáček' @internal 184*eeb7e5b3SAdam Hornáček' @method CreateFromCurl 185*eeb7e5b3SAdam Hornáček' @param {WebClient} Client 186*eeb7e5b3SAdam Hornáček' @param {WebRequest} Request 187*eeb7e5b3SAdam Hornáček' @param {String} Result 188*eeb7e5b3SAdam Hornáček' @throws 11031 / 80042b17 / -2147210473 - Error creating from cURL 189*eeb7e5b3SAdam Hornáček'' 190*eeb7e5b3SAdam HornáčekPublic Sub CreateFromCurl(Client As WebClient, Request As WebRequest, Result As String) 191*eeb7e5b3SAdam Hornáček On Error GoTo web_ErrorHandling 192*eeb7e5b3SAdam Hornáček 193*eeb7e5b3SAdam Hornáček Dim web_Lines() As String 194*eeb7e5b3SAdam Hornáček 195*eeb7e5b3SAdam Hornáček web_Lines = VBA.Split(Result, web_CrLf) 196*eeb7e5b3SAdam Hornáček 197*eeb7e5b3SAdam Hornáček Me.StatusCode = web_ExtractStatusFromCurlResponse(web_Lines) 198*eeb7e5b3SAdam Hornáček Me.StatusDescription = web_ExtractStatusTextFromCurlResponse(web_Lines) 199*eeb7e5b3SAdam Hornáček Me.Content = web_ExtractResponseTextFromCurlResponse(web_Lines) 200*eeb7e5b3SAdam Hornáček Me.Body = WebHelpers.StringToAnsiBytes(Me.Content) 201*eeb7e5b3SAdam Hornáček 202*eeb7e5b3SAdam Hornáček web_LoadValues web_ExtractHeadersFromCurlResponse(web_Lines), Me.Content, Me.Body, Request 203*eeb7e5b3SAdam Hornáček 204*eeb7e5b3SAdam Hornáček Exit Sub 205*eeb7e5b3SAdam Hornáček 206*eeb7e5b3SAdam Hornáčekweb_ErrorHandling: 207*eeb7e5b3SAdam Hornáček 208*eeb7e5b3SAdam Hornáček Dim web_ErrorDescription As String 209*eeb7e5b3SAdam Hornáček web_ErrorDescription = "An error occurred while creating response from cURL" & vbNewLine & _ 210*eeb7e5b3SAdam Hornáček Err.Number & VBA.IIf(Err.Number < 0, " (" & VBA.LCase$(VBA.Hex$(Err.Number)) & ")", "") & ": " & Err.Description 211*eeb7e5b3SAdam Hornáček 212*eeb7e5b3SAdam Hornáček WebHelpers.LogError web_ErrorDescription, "WebResponse.CreateFromCurl", 11031 + vbObjectError 213*eeb7e5b3SAdam Hornáček Err.Raise 11031 + vbObjectError, "WebResponse.CreateFromCurl", web_ErrorDescription 214*eeb7e5b3SAdam HornáčekEnd Sub 215*eeb7e5b3SAdam Hornáček 216*eeb7e5b3SAdam Hornáček'' 217*eeb7e5b3SAdam Hornáček' Extract headers from response headers 218*eeb7e5b3SAdam Hornáček' 219*eeb7e5b3SAdam Hornáček' @internal 220*eeb7e5b3SAdam Hornáček' @method ExtractHeaders 221*eeb7e5b3SAdam Hornáček' @param {String} ResponseHeaders 222*eeb7e5b3SAdam Hornáček' @return {Collection} Headers 223*eeb7e5b3SAdam Hornáček' @throws 11032 / 80042b18 / -2147210472 - Error extracting headers 224*eeb7e5b3SAdam Hornáček'' 225*eeb7e5b3SAdam HornáčekPublic Function ExtractHeaders(ResponseHeaders As String) As Collection 226*eeb7e5b3SAdam Hornáček On Error GoTo web_ErrorHandling 227*eeb7e5b3SAdam Hornáček 228*eeb7e5b3SAdam Hornáček Dim web_Lines As Variant 229*eeb7e5b3SAdam Hornáček Dim web_i As Integer 230*eeb7e5b3SAdam Hornáček Dim web_Headers As New Collection 231*eeb7e5b3SAdam Hornáček Dim web_Header As Dictionary 232*eeb7e5b3SAdam Hornáček Dim web_ColonPosition As Long 233*eeb7e5b3SAdam Hornáček Dim web_Multiline As Boolean 234*eeb7e5b3SAdam Hornáček 235*eeb7e5b3SAdam Hornáček web_Lines = VBA.Split(ResponseHeaders, web_CrLf) 236*eeb7e5b3SAdam Hornáček 237*eeb7e5b3SAdam Hornáček For web_i = LBound(web_Lines) To (UBound(web_Lines) + 1) 238*eeb7e5b3SAdam Hornáček If web_i > UBound(web_Lines) Then 239*eeb7e5b3SAdam Hornáček web_Headers.Add web_Header 240*eeb7e5b3SAdam Hornáček ElseIf web_Lines(web_i) <> "" Then 241*eeb7e5b3SAdam Hornáček web_ColonPosition = VBA.InStr(1, web_Lines(web_i), ":") 242*eeb7e5b3SAdam Hornáček If web_ColonPosition = 0 And Not web_Header Is Nothing Then 243*eeb7e5b3SAdam Hornáček ' Assume part of multi-line header 244*eeb7e5b3SAdam Hornáček web_Multiline = True 245*eeb7e5b3SAdam Hornáček ElseIf web_Multiline Then 246*eeb7e5b3SAdam Hornáček ' Close out multi-line string 247*eeb7e5b3SAdam Hornáček web_Multiline = False 248*eeb7e5b3SAdam Hornáček web_Headers.Add web_Header 249*eeb7e5b3SAdam Hornáček ElseIf Not web_Header Is Nothing Then 250*eeb7e5b3SAdam Hornáček ' Add previous header 251*eeb7e5b3SAdam Hornáček web_Headers.Add web_Header 252*eeb7e5b3SAdam Hornáček End If 253*eeb7e5b3SAdam Hornáček 254*eeb7e5b3SAdam Hornáček If Not web_Multiline Then 255*eeb7e5b3SAdam Hornáček Set web_Header = WebHelpers.CreateKeyValue( _ 256*eeb7e5b3SAdam Hornáček Key:=VBA.Trim(VBA.Mid$(web_Lines(web_i), 1, web_ColonPosition - 1)), _ 257*eeb7e5b3SAdam Hornáček Value:=VBA.Trim(VBA.Mid$(web_Lines(web_i), web_ColonPosition + 1, VBA.Len(web_Lines(web_i)))) _ 258*eeb7e5b3SAdam Hornáček ) 259*eeb7e5b3SAdam Hornáček Else 260*eeb7e5b3SAdam Hornáček web_Header("Value") = web_Header("Value") & web_CrLf & web_Lines(web_i) 261*eeb7e5b3SAdam Hornáček End If 262*eeb7e5b3SAdam Hornáček End If 263*eeb7e5b3SAdam Hornáček Next web_i 264*eeb7e5b3SAdam Hornáček 265*eeb7e5b3SAdam Hornáček Set ExtractHeaders = web_Headers 266*eeb7e5b3SAdam Hornáček Exit Function 267*eeb7e5b3SAdam Hornáček 268*eeb7e5b3SAdam Hornáčekweb_ErrorHandling: 269*eeb7e5b3SAdam Hornáček 270*eeb7e5b3SAdam Hornáček Dim web_ErrorDescription As String 271*eeb7e5b3SAdam Hornáček web_ErrorDescription = "An error occurred while extracting headers" & vbNewLine & _ 272*eeb7e5b3SAdam Hornáček Err.Number & VBA.IIf(Err.Number < 0, " (" & VBA.LCase$(VBA.Hex$(Err.Number)) & ")", "") & ": " & Err.Description 273*eeb7e5b3SAdam Hornáček 274*eeb7e5b3SAdam Hornáček WebHelpers.LogError web_ErrorDescription, "WebResponse.CreateFromCurl", 11032 + vbObjectError 275*eeb7e5b3SAdam Hornáček Err.Raise 11032 + vbObjectError, "WebResponse.CreateFromCurl", web_ErrorDescription 276*eeb7e5b3SAdam HornáčekEnd Function 277*eeb7e5b3SAdam Hornáček 278*eeb7e5b3SAdam Hornáček'' 279*eeb7e5b3SAdam Hornáček' Extract cookies from response headers 280*eeb7e5b3SAdam Hornáček' 281*eeb7e5b3SAdam Hornáček' @internal 282*eeb7e5b3SAdam Hornáček' @method ExtractCookies 283*eeb7e5b3SAdam Hornáček' @param {Collection} Headers 284*eeb7e5b3SAdam Hornáček' @return {Collection} Cookies 285*eeb7e5b3SAdam Hornáček'' 286*eeb7e5b3SAdam HornáčekPublic Function ExtractCookies(Headers As Collection) As Collection 287*eeb7e5b3SAdam Hornáček Dim web_Header As Dictionary 288*eeb7e5b3SAdam Hornáček Dim web_Cookie As String 289*eeb7e5b3SAdam Hornáček Dim web_Key As String 290*eeb7e5b3SAdam Hornáček Dim web_Value As String 291*eeb7e5b3SAdam Hornáček Dim web_Cookies As New Collection 292*eeb7e5b3SAdam Hornáček 293*eeb7e5b3SAdam Hornáček For Each web_Header In Headers 294*eeb7e5b3SAdam Hornáček If web_Header("Key") = "Set-Cookie" Then 295*eeb7e5b3SAdam Hornáček web_Cookie = web_Header("Value") 296*eeb7e5b3SAdam Hornáček If VBA.InStr(1, web_Cookie, "=") > 0 Then 297*eeb7e5b3SAdam Hornáček web_Key = VBA.Mid$(web_Cookie, 1, VBA.InStr(1, web_Cookie, "=") - 1) 298*eeb7e5b3SAdam Hornáček web_Value = VBA.Mid$(web_Cookie, VBA.InStr(1, web_Cookie, "=") + 1, VBA.Len(web_Cookie)) 299*eeb7e5b3SAdam Hornáček 300*eeb7e5b3SAdam Hornáček ' Ignore text after semi-colon 301*eeb7e5b3SAdam Hornáček If VBA.InStr(1, web_Value, ";") > 0 Then 302*eeb7e5b3SAdam Hornáček web_Value = VBA.Mid$(web_Value, 1, VBA.InStr(1, web_Value, ";") - 1) 303*eeb7e5b3SAdam Hornáček End If 304*eeb7e5b3SAdam Hornáček 305*eeb7e5b3SAdam Hornáček ' Ignore surrounding quotes 306*eeb7e5b3SAdam Hornáček If VBA.Left$(web_Value, 1) = """" Then 307*eeb7e5b3SAdam Hornáček web_Value = VBA.Mid$(web_Value, 2, VBA.Len(web_Value) - 2) 308*eeb7e5b3SAdam Hornáček End If 309*eeb7e5b3SAdam Hornáček 310*eeb7e5b3SAdam Hornáček web_Cookies.Add WebHelpers.CreateKeyValue(web_Key, WebHelpers.UrlDecode(web_Value, PlusAsSpace:=False, EncodingMode:=UrlEncodingMode.CookieUrlEncoding)) 311*eeb7e5b3SAdam Hornáček Else 312*eeb7e5b3SAdam Hornáček WebHelpers.LogWarning _ 313*eeb7e5b3SAdam Hornáček "Unrecognized cookie format: " & web_Cookie, "WebResponse.ExtractCookies" 314*eeb7e5b3SAdam Hornáček End If 315*eeb7e5b3SAdam Hornáček End If 316*eeb7e5b3SAdam Hornáček Next web_Header 317*eeb7e5b3SAdam Hornáček 318*eeb7e5b3SAdam Hornáček Set ExtractCookies = web_Cookies 319*eeb7e5b3SAdam HornáčekEnd Function 320*eeb7e5b3SAdam Hornáček 321*eeb7e5b3SAdam Hornáček' ============================================= ' 322*eeb7e5b3SAdam Hornáček' Private Functions 323*eeb7e5b3SAdam Hornáček' ============================================= ' 324*eeb7e5b3SAdam Hornáček 325*eeb7e5b3SAdam HornáčekPrivate Sub web_LoadValues(web_Headers As String, web_Content As String, web_Body As Variant, web_Request As WebRequest) 326*eeb7e5b3SAdam Hornáček ' Convert content to data by format 327*eeb7e5b3SAdam Hornáček If web_Request.ResponseFormat <> WebFormat.PlainText Then 328*eeb7e5b3SAdam Hornáček On Error Resume Next 329*eeb7e5b3SAdam Hornáček Set Me.Data = _ 330*eeb7e5b3SAdam Hornáček WebHelpers.ParseByFormat(web_Content, web_Request.ResponseFormat, web_Request.CustomResponseFormat, web_Body) 331*eeb7e5b3SAdam Hornáček 332*eeb7e5b3SAdam Hornáček If Err.Number <> 0 Then 333*eeb7e5b3SAdam Hornáček WebHelpers.LogError Err.Description, Err.Source, Err.Number 334*eeb7e5b3SAdam Hornáček Err.Clear 335*eeb7e5b3SAdam Hornáček End If 336*eeb7e5b3SAdam Hornáček On Error GoTo 0 337*eeb7e5b3SAdam Hornáček End If 338*eeb7e5b3SAdam Hornáček 339*eeb7e5b3SAdam Hornáček ' Extract headers 340*eeb7e5b3SAdam Hornáček Set Me.Headers = ExtractHeaders(web_Headers) 341*eeb7e5b3SAdam Hornáček 342*eeb7e5b3SAdam Hornáček ' Extract cookies 343*eeb7e5b3SAdam Hornáček Set Me.Cookies = ExtractCookies(Me.Headers) 344*eeb7e5b3SAdam HornáčekEnd Sub 345*eeb7e5b3SAdam Hornáček 346*eeb7e5b3SAdam HornáčekPrivate Function web_ExtractStatusFromCurlResponse(web_CurlResponseLines() As String) As Long 347*eeb7e5b3SAdam Hornáček Dim web_StatusLineParts() As String 348*eeb7e5b3SAdam Hornáček 349*eeb7e5b3SAdam Hornáček web_StatusLineParts = VBA.Split(web_CurlResponseLines(web_FindStatusLine(web_CurlResponseLines)), " ") 350*eeb7e5b3SAdam Hornáček web_ExtractStatusFromCurlResponse = VBA.CLng(web_StatusLineParts(1)) 351*eeb7e5b3SAdam HornáčekEnd Function 352*eeb7e5b3SAdam Hornáček 353*eeb7e5b3SAdam HornáčekPrivate Function web_ExtractStatusTextFromCurlResponse(web_CurlResponseLines() As String) As String 354*eeb7e5b3SAdam Hornáček Dim web_StatusLineParts() As String 355*eeb7e5b3SAdam Hornáček Dim web_i As Long 356*eeb7e5b3SAdam Hornáček Dim web_StatusText As String 357*eeb7e5b3SAdam Hornáček 358*eeb7e5b3SAdam Hornáček web_StatusLineParts = VBA.Split(web_CurlResponseLines(web_FindStatusLine(web_CurlResponseLines)), " ", 3) 359*eeb7e5b3SAdam Hornáček web_ExtractStatusTextFromCurlResponse = web_StatusLineParts(2) 360*eeb7e5b3SAdam HornáčekEnd Function 361*eeb7e5b3SAdam Hornáček 362*eeb7e5b3SAdam HornáčekPrivate Function web_ExtractHeadersFromCurlResponse(web_CurlResponseLines() As String) As String 363*eeb7e5b3SAdam Hornáček Dim web_StatusLineIndex As Long 364*eeb7e5b3SAdam Hornáček Dim web_BlankLineIndex As Long 365*eeb7e5b3SAdam Hornáček Dim web_HeaderLines() As String 366*eeb7e5b3SAdam Hornáček Dim web_WriteIndex As Long 367*eeb7e5b3SAdam Hornáček Dim web_ReadIndex As Long 368*eeb7e5b3SAdam Hornáček 369*eeb7e5b3SAdam Hornáček ' Find status line and blank line before body 370*eeb7e5b3SAdam Hornáček web_StatusLineIndex = web_FindStatusLine(web_CurlResponseLines) 371*eeb7e5b3SAdam Hornáček web_BlankLineIndex = web_FindBlankLine(web_CurlResponseLines) 372*eeb7e5b3SAdam Hornáček 373*eeb7e5b3SAdam Hornáček ' Extract headers string 374*eeb7e5b3SAdam Hornáček ReDim web_HeaderLines(0 To web_BlankLineIndex - 2 - web_StatusLineIndex) 375*eeb7e5b3SAdam Hornáček 376*eeb7e5b3SAdam Hornáček web_WriteIndex = 0 377*eeb7e5b3SAdam Hornáček For web_ReadIndex = (web_StatusLineIndex + 1) To web_BlankLineIndex - 1 378*eeb7e5b3SAdam Hornáček web_HeaderLines(web_WriteIndex) = web_CurlResponseLines(web_ReadIndex) 379*eeb7e5b3SAdam Hornáček web_WriteIndex = web_WriteIndex + 1 380*eeb7e5b3SAdam Hornáček Next web_ReadIndex 381*eeb7e5b3SAdam Hornáček 382*eeb7e5b3SAdam Hornáček web_ExtractHeadersFromCurlResponse = VBA.Join$(web_HeaderLines, web_CrLf) 383*eeb7e5b3SAdam HornáčekEnd Function 384*eeb7e5b3SAdam Hornáček 385*eeb7e5b3SAdam HornáčekPrivate Function web_ExtractResponseTextFromCurlResponse(web_CurlResponseLines() As String) As String 386*eeb7e5b3SAdam Hornáček Dim web_BlankLineIndex As Long 387*eeb7e5b3SAdam Hornáček Dim web_BodyLines() As String 388*eeb7e5b3SAdam Hornáček Dim web_WriteIndex As Long 389*eeb7e5b3SAdam Hornáček Dim web_ReadIndex As Long 390*eeb7e5b3SAdam Hornáček 391*eeb7e5b3SAdam Hornáček ' Find blank line before body 392*eeb7e5b3SAdam Hornáček web_BlankLineIndex = web_FindBlankLine(web_CurlResponseLines) 393*eeb7e5b3SAdam Hornáček 394*eeb7e5b3SAdam Hornáček ' Extract body string 395*eeb7e5b3SAdam Hornáček ReDim web_BodyLines(0 To UBound(web_CurlResponseLines) - web_BlankLineIndex - 1) 396*eeb7e5b3SAdam Hornáček 397*eeb7e5b3SAdam Hornáček web_WriteIndex = 0 398*eeb7e5b3SAdam Hornáček For web_ReadIndex = web_BlankLineIndex + 1 To UBound(web_CurlResponseLines) 399*eeb7e5b3SAdam Hornáček web_BodyLines(web_WriteIndex) = web_CurlResponseLines(web_ReadIndex) 400*eeb7e5b3SAdam Hornáček web_WriteIndex = web_WriteIndex + 1 401*eeb7e5b3SAdam Hornáček Next web_ReadIndex 402*eeb7e5b3SAdam Hornáček 403*eeb7e5b3SAdam Hornáček web_ExtractResponseTextFromCurlResponse = VBA.Join$(web_BodyLines, web_CrLf) 404*eeb7e5b3SAdam HornáčekEnd Function 405*eeb7e5b3SAdam Hornáček 406*eeb7e5b3SAdam HornáčekPrivate Function web_FindStatusLine(web_CurlResponseLines() As String) As Long 407*eeb7e5b3SAdam Hornáček ' Special case for cURL: 100 Continue is included before final status code 408*eeb7e5b3SAdam Hornáček ' -> ignore 100 and find final status code (next non-100 status code) 409*eeb7e5b3SAdam Hornáček For web_FindStatusLine = LBound(web_CurlResponseLines) To UBound(web_CurlResponseLines) 410*eeb7e5b3SAdam Hornáček If VBA.Trim$(web_CurlResponseLines(web_FindStatusLine)) <> "" Then 411*eeb7e5b3SAdam Hornáček If VBA.Split(web_CurlResponseLines(web_FindStatusLine), " ")(1) <> "100" Then 412*eeb7e5b3SAdam Hornáček Exit Function 413*eeb7e5b3SAdam Hornáček End If 414*eeb7e5b3SAdam Hornáček End If 415*eeb7e5b3SAdam Hornáček Next web_FindStatusLine 416*eeb7e5b3SAdam HornáčekEnd Function 417*eeb7e5b3SAdam Hornáček 418*eeb7e5b3SAdam HornáčekPrivate Function web_FindBlankLine(web_CurlResponseLines() As String) As Long 419*eeb7e5b3SAdam Hornáček For web_FindBlankLine = (web_FindStatusLine(web_CurlResponseLines) + 1) To UBound(web_CurlResponseLines) 420*eeb7e5b3SAdam Hornáček If VBA.Trim$(web_CurlResponseLines(web_FindBlankLine)) = "" Then 421*eeb7e5b3SAdam Hornáček Exit Function 422*eeb7e5b3SAdam Hornáček End If 423*eeb7e5b3SAdam Hornáček Next web_FindBlankLine 424*eeb7e5b3SAdam HornáčekEnd Function 425*eeb7e5b3SAdam Hornáček 426*eeb7e5b3SAdam HornáčekPrivate Sub Class_Initialize() 427*eeb7e5b3SAdam Hornáček web_CrLf = VBA.Chr$(&HA) & VBA.Chr$(&o12) 428*eeb7e5b3SAdam Hornáček 429*eeb7e5b3SAdam Hornáček Set Headers = New Collection 430*eeb7e5b3SAdam Hornáček Set Cookies = New Collection 431*eeb7e5b3SAdam HornáčekEnd Sub 432*eeb7e5b3SAdam Hornáček 433*eeb7e5b3SAdam HornáčekPrivate Sub Test_strings() 434*eeb7e5b3SAdam Hornáček Dim foo1() As String 435*eeb7e5b3SAdam Hornáček Set foo1 = " testing 436*eeb7e5b3SAdam Hornáček 1-2-3" 437*eeb7e5b3SAdam HornáčekEnd Sub 438