PureBasic
PureBasic
WebSocket Connect through HTTP Proxy
See more WebSocket Examples
This example shows how to establish a WebSocket connection through an HTTP proxy server.Chilkat PureBasic Downloads
IncludeFile "CkSocket.pb"
IncludeFile "CkRest.pb"
IncludeFile "CkWebSocket.pb"
Procedure ChilkatExample()
success.i = 0
; This example requires the Chilkat API to have been previously unlocked.
; See Global Unlock Sample for sample code.
; --------------------------------------------------
; This example borrows the code from the REST using HTTP Proxy example.
; We first use the Chilkat Socket object to establish a connection to the WebSocket server through an HTTP proxy.
; Next, the Rest object uses the Socket object for its connection.
; Finally, the WebSocket object uses the Rest object for its connection.
;
rest.i = CkRest::ckCreate()
If rest.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
socket.i = CkSocket::ckCreate()
If socket.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Set the HTTP proxy domain or IP address, and port.
CkSocket::setCkHttpProxyHostname(socket, "192.168.1.79")
CkSocket::setCkHttpProxyPort(socket, 808)
; Provide authentication to the HTTP proxy, if needed.
CkSocket::setCkHttpProxyUsername(socket, "HTTP_PROXY_LOGIN")
CkSocket::setCkHttpProxyPassword(socket, "HTTP_PROXY_PASSWORD")
CkSocket::setCkHttpProxyAuthMethod(socket, "Basic")
; Indicate that HTTP requests (i.e. the WebSocket opening handshake) will be sent over the socket.
; This is important for how the HTTP proxy connection is established.
CkSocket::setCkHttpProxyForHttp(socket, 1)
; Connect to the websocket server through the HTTP proxy.
bTls.i = 0
port.i = 80
maxWaitMs.i = 5000
success = CkSocket::ckConnect(socket,"some-websocket-server.com",port,bTls,maxWaitMs)
If success <> 1
Debug "Connect Failure Error Code: " + Str(CkSocket::ckConnectFailReason(socket))
Debug CkSocket::ckLastErrorText(socket)
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
ProcedureReturn
EndIf
; Tell the Rest object to use the connected socket.
success = CkRest::ckUseConnection(rest,socket,1)
If success <> 1
Debug CkRest::ckLastErrorText(rest)
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
ProcedureReturn
EndIf
ws.i = CkWebSocket::ckCreate()
If ws.i = 0
Debug "Failed to create object."
ProcedureReturn
EndIf
; Tell the WebSocket to use this connection.
success = CkWebSocket::ckUseConnection(ws,rest)
If success <> 1
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; Add the standard WebSocket open handshake headers that will be needed.
; (This adds the required HTTP request headers to the rest object.)
CkWebSocket::ckAddClientHeaders(ws)
; Add any additional headers that might be desired.
; Two common WebSocketSpecific headers are "Sec-WebSocket-Protocol" and "Origin".
CkRest::ckAddHeader(rest,"Sec-WebSocket-Protocol","x-some-websocket-subprotocol")
CkRest::ckAddHeader(rest,"Origin","http://some-websocket-server.com")
; Do the open handshake.
responseBody.s = CkRest::ckFullRequestNoBody(rest,"GET","/something")
If CkRest::ckLastMethodSuccess(rest) <> 1
Debug CkRest::ckLastErrorText(rest)
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; If successful, the HTTP response status code should be 101,
; and the response body will be empty. (If it failed, we'll have a look
; at the response body..)
statusCode.i = CkRest::ckResponseStatusCode(rest)
Debug "Response status code: " + Str(statusCode)
If statusCode <> 101
Debug responseBody
Debug "-- Failed because of unexpected response status code."
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
; We have the expected 101 response, so let's now validate the
; contents of the response, such as the value sent by the server in the
; Sec-WebSocket-Accept header.
success = CkWebSocket::ckValidateServerHandshake(ws)
If success <> 1
Debug CkWebSocket::ckLastErrorText(ws)
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndIf
Debug "WebSocket connection successful."
; The application may now begin sending and receiving frames on the WebSocket connection.
; (At this point, we're done with the rest and socket objects...)
Debug "Success."
CkRest::ckDispose(rest)
CkSocket::ckDispose(socket)
CkWebSocket::ckDispose(ws)
ProcedureReturn
EndProcedure