xref: /OpenGrok/opengrok-indexer/src/test/resources/analysis/vb/sample.cls (revision eeb7e5b33d1bcc524fcc9d1d560447b044e286a4)
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