mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
windows: Unicode and IPv6 http/sockets
cleanup schannel implementation (drop NT4.0 compatibility, use unicode strings, etc) restore http tests fix socket test: it did not throw before
This commit is contained in:
parent
22d91148ca
commit
9834ccfcd9
@ -48,6 +48,8 @@ CommonCHeaders = '
|
|||||||
#define OPTION_CAST(x) (x)
|
#define OPTION_CAST(x) (x)
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
#define WINVER 0x0600
|
||||||
|
#define _WIN32_WINNT 0x0600
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
#define _UNICODE
|
#define _UNICODE
|
||||||
#define UNICODE
|
#define UNICODE
|
||||||
|
215
thirdparty/vschannel/vschannel.c
vendored
215
thirdparty/vschannel/vschannel.c
vendored
@ -1,8 +1,8 @@
|
|||||||
#include <vschannel.h>
|
#include <vschannel.h>
|
||||||
|
#include <sspi.h>
|
||||||
|
|
||||||
// Proxy
|
// Proxy
|
||||||
CHAR * psz_proxy_server = "proxy";
|
WCHAR * psz_proxy_server = L"proxy";
|
||||||
INT i_proxy_port = 80;
|
INT i_proxy_port = 80;
|
||||||
|
|
||||||
// Options
|
// Options
|
||||||
@ -10,7 +10,7 @@ INT port_number = 443;
|
|||||||
BOOL use_proxy = FALSE;
|
BOOL use_proxy = FALSE;
|
||||||
DWORD protocol = 0;
|
DWORD protocol = 0;
|
||||||
ALG_ID aid_key_exch = 0;
|
ALG_ID aid_key_exch = 0;
|
||||||
|
WSADATA wsa_data;
|
||||||
|
|
||||||
// TODO: joe-c
|
// TODO: joe-c
|
||||||
// socket / tls ctx
|
// socket / tls ctx
|
||||||
@ -20,11 +20,8 @@ struct TlsContext {
|
|||||||
// Cred store
|
// Cred store
|
||||||
HCERTSTORE cert_store;
|
HCERTSTORE cert_store;
|
||||||
SCHANNEL_CRED schannel_cred;
|
SCHANNEL_CRED schannel_cred;
|
||||||
// Loaded sec lib
|
|
||||||
HMODULE g_hsecurity;
|
|
||||||
// Socket
|
// Socket
|
||||||
SOCKET socket;
|
SOCKET socket;
|
||||||
WSADATA wsa_data;
|
|
||||||
CredHandle h_client_creds;
|
CredHandle h_client_creds;
|
||||||
CtxtHandle h_context;
|
CtxtHandle h_context;
|
||||||
PCCERT_CONTEXT p_pemote_cert_context;
|
PCCERT_CONTEXT p_pemote_cert_context;
|
||||||
@ -35,7 +32,6 @@ struct TlsContext {
|
|||||||
TlsContext new_tls_context() {
|
TlsContext new_tls_context() {
|
||||||
return (struct TlsContext) {
|
return (struct TlsContext) {
|
||||||
.cert_store = NULL,
|
.cert_store = NULL,
|
||||||
.g_hsecurity = NULL,
|
|
||||||
.socket = INVALID_SOCKET,
|
.socket = INVALID_SOCKET,
|
||||||
.creds_initialized = FALSE,
|
.creds_initialized = FALSE,
|
||||||
.context_initialized = FALSE,
|
.context_initialized = FALSE,
|
||||||
@ -43,39 +39,6 @@ TlsContext new_tls_context() {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOL load_security_library(TlsContext *tls_ctx) {
|
|
||||||
INIT_SECURITY_INTERFACE pInitSecurityInterface;
|
|
||||||
|
|
||||||
// Load Security DLL
|
|
||||||
tls_ctx->g_hsecurity = LoadLibraryA("schannel.dll");
|
|
||||||
if(tls_ctx->g_hsecurity == NULL) {
|
|
||||||
printf("Error 0x%x loading %s.\n", GetLastError(), "schannel.dll");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
pInitSecurityInterface = (INIT_SECURITY_INTERFACE)GetProcAddress(tls_ctx->g_hsecurity, "InitSecurityInterfaceA");
|
|
||||||
|
|
||||||
if(pInitSecurityInterface == NULL) {
|
|
||||||
printf("Error 0x%x reading InitSecurityInterface entry point.\n", GetLastError());
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
tls_ctx->sspi = pInitSecurityInterface();
|
|
||||||
|
|
||||||
if(tls_ctx->sspi == NULL) {
|
|
||||||
printf("Error 0x%x reading security interface.\n",
|
|
||||||
GetLastError());
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void unload_security_library(TlsContext *tls_ctx) {
|
|
||||||
FreeLibrary(tls_ctx->g_hsecurity);
|
|
||||||
tls_ctx->g_hsecurity = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void vschannel_cleanup(TlsContext *tls_ctx) {
|
void vschannel_cleanup(TlsContext *tls_ctx) {
|
||||||
// Free the server certificate context.
|
// Free the server certificate context.
|
||||||
if(tls_ctx->p_pemote_cert_context) {
|
if(tls_ctx->p_pemote_cert_context) {
|
||||||
@ -100,38 +63,31 @@ void vschannel_cleanup(TlsContext *tls_ctx) {
|
|||||||
closesocket(tls_ctx->socket);
|
closesocket(tls_ctx->socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shutdown WinSock subsystem.
|
|
||||||
WSACleanup();
|
|
||||||
|
|
||||||
// Close "MY" certificate store.
|
// Close "MY" certificate store.
|
||||||
if(tls_ctx->cert_store) {
|
if(tls_ctx->cert_store) {
|
||||||
CertCloseStore(tls_ctx->cert_store, 0);
|
CertCloseStore(tls_ctx->cert_store, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
unload_security_library(tls_ctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void vschannel_init(TlsContext *tls_ctx) {
|
void vschannel_init(TlsContext *tls_ctx) {
|
||||||
if(!load_security_library(tls_ctx)) {
|
WSAStartup(0x202, &wsa_data);
|
||||||
printf("Error initializing the security library\n");
|
tls_ctx->sspi = InitSecurityInterface();
|
||||||
vschannel_cleanup(tls_ctx);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the WinSock subsystem.
|
if(tls_ctx->sspi == NULL) {
|
||||||
if(WSAStartup(0x0101, &tls_ctx->wsa_data) == SOCKET_ERROR) {
|
wprintf(L"Error 0x%x reading security interface.\n",
|
||||||
printf("Error %d returned by WSAStartup\n", GetLastError());
|
GetLastError());
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create credentials.
|
// Create credentials.
|
||||||
if(create_credentials(tls_ctx)) {
|
if(create_credentials(tls_ctx)) {
|
||||||
printf("Error creating credentials\n");
|
wprintf(L"Error creating credentials\n");
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
}
|
}
|
||||||
tls_ctx->creds_initialized = TRUE;
|
tls_ctx->creds_initialized = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out)
|
INT request(TlsContext *tls_ctx, INT iport, LPWSTR host, CHAR *req, CHAR **out)
|
||||||
{
|
{
|
||||||
SecBuffer ExtraData;
|
SecBuffer ExtraData;
|
||||||
SECURITY_STATUS Status;
|
SECURITY_STATUS Status;
|
||||||
@ -148,14 +104,14 @@ INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out)
|
|||||||
|
|
||||||
// Connect to server.
|
// Connect to server.
|
||||||
if(connect_to_server(tls_ctx, host, port_number)) {
|
if(connect_to_server(tls_ctx, host, port_number)) {
|
||||||
printf("Error connecting to server\n");
|
wprintf(L"Error connecting to server\n");
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
return resp_length;
|
return resp_length;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Perform handshake
|
// Perform handshake
|
||||||
if(perform_client_handshake(tls_ctx, host, &ExtraData)) {
|
if(perform_client_handshake(tls_ctx, host, &ExtraData)) {
|
||||||
printf("Error performing handshake\n");
|
wprintf(L"Error performing handshake\n");
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
return resp_length;
|
return resp_length;
|
||||||
}
|
}
|
||||||
@ -168,7 +124,7 @@ INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out)
|
|||||||
SECPKG_ATTR_REMOTE_CERT_CONTEXT,
|
SECPKG_ATTR_REMOTE_CERT_CONTEXT,
|
||||||
(PVOID)&tls_ctx->p_pemote_cert_context);
|
(PVOID)&tls_ctx->p_pemote_cert_context);
|
||||||
if(Status != SEC_E_OK) {
|
if(Status != SEC_E_OK) {
|
||||||
printf("Error 0x%x querying remote certificate\n", Status);
|
wprintf(L"Error 0x%x querying remote certificate\n", Status);
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
return resp_length;
|
return resp_length;
|
||||||
}
|
}
|
||||||
@ -183,7 +139,7 @@ INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out)
|
|||||||
|
|
||||||
// It is therefore best if we abort the connection.
|
// It is therefore best if we abort the connection.
|
||||||
|
|
||||||
printf("Error 0x%x authenticating server credentials!\n", Status);
|
wprintf(L"Error 0x%x authenticating server credentials!\n", Status);
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
return resp_length;
|
return resp_length;
|
||||||
}
|
}
|
||||||
@ -201,7 +157,7 @@ INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out)
|
|||||||
// Send a close_notify alert to the server and
|
// Send a close_notify alert to the server and
|
||||||
// close down the connection.
|
// close down the connection.
|
||||||
if(disconnect_from_server(tls_ctx)) {
|
if(disconnect_from_server(tls_ctx)) {
|
||||||
printf("Error disconnecting from server\n");
|
wprintf(L"Error disconnecting from server\n");
|
||||||
vschannel_cleanup(tls_ctx);
|
vschannel_cleanup(tls_ctx);
|
||||||
return resp_length;
|
return resp_length;
|
||||||
}
|
}
|
||||||
@ -224,10 +180,10 @@ static SECURITY_STATUS create_credentials(TlsContext *tls_ctx) {
|
|||||||
// Open the "MY" certificate store, which is where Internet Explorer
|
// Open the "MY" certificate store, which is where Internet Explorer
|
||||||
// stores its client certificates.
|
// stores its client certificates.
|
||||||
if(tls_ctx->cert_store == NULL) {
|
if(tls_ctx->cert_store == NULL) {
|
||||||
tls_ctx->cert_store = CertOpenSystemStore(0, "MY");
|
tls_ctx->cert_store = CertOpenSystemStore(0, L"MY");
|
||||||
|
|
||||||
if(!tls_ctx->cert_store) {
|
if(!tls_ctx->cert_store) {
|
||||||
printf("Error 0x%x returned by CertOpenSystemStore\n",
|
wprintf(L"Error 0x%x returned by CertOpenSystemStore\n",
|
||||||
GetLastError());
|
GetLastError());
|
||||||
return SEC_E_NO_CREDENTIALS;
|
return SEC_E_NO_CREDENTIALS;
|
||||||
}
|
}
|
||||||
@ -275,7 +231,7 @@ static SECURITY_STATUS create_credentials(TlsContext *tls_ctx) {
|
|||||||
|
|
||||||
Status = tls_ctx->sspi->AcquireCredentialsHandle(
|
Status = tls_ctx->sspi->AcquireCredentialsHandle(
|
||||||
NULL, // Name of principal
|
NULL, // Name of principal
|
||||||
UNISP_NAME_A, // Name of package
|
UNISP_NAME_W, // Name of package
|
||||||
SECPKG_CRED_OUTBOUND, // Flags indicating use
|
SECPKG_CRED_OUTBOUND, // Flags indicating use
|
||||||
NULL, // Pointer to logon ID
|
NULL, // Pointer to logon ID
|
||||||
&tls_ctx->schannel_cred, // Package specific data
|
&tls_ctx->schannel_cred, // Package specific data
|
||||||
@ -284,7 +240,7 @@ static SECURITY_STATUS create_credentials(TlsContext *tls_ctx) {
|
|||||||
&tls_ctx->h_client_creds, // (out) Cred Handle
|
&tls_ctx->h_client_creds, // (out) Cred Handle
|
||||||
&tsExpiry); // (out) Lifetime (optional)
|
&tsExpiry); // (out) Lifetime (optional)
|
||||||
if(Status != SEC_E_OK) {
|
if(Status != SEC_E_OK) {
|
||||||
printf("Error 0x%x returned by AcquireCredentialsHandle\n", Status);
|
wprintf(L"Error 0x%x returned by AcquireCredentialsHandle\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,50 +257,36 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static INT connect_to_server(TlsContext *tls_ctx, CHAR *host, INT port_number) {
|
static INT connect_to_server(TlsContext *tls_ctx, LPWSTR host, INT port_number) {
|
||||||
SOCKET Socket;
|
SOCKET Socket;
|
||||||
struct sockaddr_in sin;
|
|
||||||
struct hostent *hp;
|
SOCKADDR_STORAGE local_address = { 0 };
|
||||||
|
SOCKADDR_STORAGE remote_address = { 0 };
|
||||||
|
|
||||||
|
DWORD local_address_length;
|
||||||
|
DWORD remote_address_length;
|
||||||
|
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = 60;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
Socket = socket(PF_INET, SOCK_STREAM, 0);
|
Socket = socket(PF_INET, SOCK_STREAM, 0);
|
||||||
if(Socket == INVALID_SOCKET) {
|
if(Socket == INVALID_SOCKET) {
|
||||||
printf("Error %d creating socket\n", WSAGetLastError());
|
wprintf(L"Error %d creating socket\n", WSAGetLastError());
|
||||||
return WSAGetLastError();
|
return WSAGetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(use_proxy) {
|
LPWSTR connect_name = use_proxy ? psz_proxy_server : host;
|
||||||
sin.sin_family = AF_INET;
|
|
||||||
sin.sin_port = ntohs((u_short)i_proxy_port);
|
|
||||||
|
|
||||||
if((hp = gethostbyname(psz_proxy_server)) == NULL)
|
WCHAR service_name[10];
|
||||||
{
|
int res = wsprintf(service_name, L"%d", port_number);
|
||||||
printf("Error %d returned by gethostbyname\n", WSAGetLastError());
|
|
||||||
return WSAGetLastError();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(&sin.sin_addr, hp->h_addr, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
sin.sin_family = AF_INET;
|
|
||||||
sin.sin_port = htons((u_short)port_number);
|
|
||||||
|
|
||||||
if((hp = gethostbyname(host)) == NULL)
|
if(WSAConnectByName(Socket,connect_name, service_name, local_address_length,
|
||||||
{
|
&local_address, remote_address_length, &remote_address, &tv, NULL) == SOCKET_ERROR) {
|
||||||
printf("Error %d returned by gethostbyname\n", WSAGetLastError());
|
wprintf(L"Error %d connecting to \"%s\" (%s)\n",
|
||||||
return WSAGetLastError();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memcpy(&sin.sin_addr, hp->h_addr, 4);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(connect(Socket, (struct sockaddr *)&sin, sizeof(sin)) == SOCKET_ERROR) {
|
|
||||||
printf("Error %d connecting to \"%s\" (%s)\n",
|
|
||||||
WSAGetLastError(),
|
WSAGetLastError(),
|
||||||
host,
|
connect_name,
|
||||||
inet_ntoa(sin.sin_addr));
|
service_name);
|
||||||
closesocket(Socket);
|
closesocket(Socket);
|
||||||
return WSAGetLastError();
|
return WSAGetLastError();
|
||||||
}
|
}
|
||||||
@ -363,14 +305,14 @@ static INT connect_to_server(TlsContext *tls_ctx, CHAR *host, INT port_number) {
|
|||||||
|
|
||||||
// Send message to proxy server
|
// Send message to proxy server
|
||||||
if(send(Socket, pbMessage, cbMessage, 0) == SOCKET_ERROR) {
|
if(send(Socket, pbMessage, cbMessage, 0) == SOCKET_ERROR) {
|
||||||
printf("Error %d sending message to proxy!\n", WSAGetLastError());
|
wprintf(L"Error %d sending message to proxy!\n", WSAGetLastError());
|
||||||
return WSAGetLastError();
|
return WSAGetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Receive message from proxy server
|
// Receive message from proxy server
|
||||||
cbMessage = recv(Socket, pbMessage, 200, 0);
|
cbMessage = recv(Socket, pbMessage, 200, 0);
|
||||||
if(cbMessage == SOCKET_ERROR) {
|
if(cbMessage == SOCKET_ERROR) {
|
||||||
printf("Error %d receiving message from proxy\n", WSAGetLastError());
|
wprintf(L"Error %d receiving message from proxy\n", WSAGetLastError());
|
||||||
return WSAGetLastError();
|
return WSAGetLastError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -412,7 +354,7 @@ static LONG disconnect_from_server(TlsContext *tls_ctx) {
|
|||||||
Status = tls_ctx->sspi->ApplyControlToken(&tls_ctx->h_context, &OutBuffer);
|
Status = tls_ctx->sspi->ApplyControlToken(&tls_ctx->h_context, &OutBuffer);
|
||||||
|
|
||||||
if(FAILED(Status)) {
|
if(FAILED(Status)) {
|
||||||
printf("Error 0x%x returned by ApplyControlToken\n", Status);
|
wprintf(L"Error 0x%x returned by ApplyControlToken\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -438,7 +380,7 @@ static LONG disconnect_from_server(TlsContext *tls_ctx) {
|
|||||||
NULL, 0, &tls_ctx->h_context, &OutBuffer, &dwSSPIOutFlags, &tsExpiry);
|
NULL, 0, &tls_ctx->h_context, &OutBuffer, &dwSSPIOutFlags, &tsExpiry);
|
||||||
|
|
||||||
if(FAILED(Status)) {
|
if(FAILED(Status)) {
|
||||||
printf("Error 0x%x returned by InitializeSecurityContext\n", Status);
|
wprintf(L"Error 0x%x returned by InitializeSecurityContext\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -451,7 +393,7 @@ static LONG disconnect_from_server(TlsContext *tls_ctx) {
|
|||||||
cbData = send(tls_ctx->socket, pbMessage, cbMessage, 0);
|
cbData = send(tls_ctx->socket, pbMessage, cbMessage, 0);
|
||||||
if(cbData == SOCKET_ERROR || cbData == 0) {
|
if(cbData == SOCKET_ERROR || cbData == 0) {
|
||||||
Status = WSAGetLastError();
|
Status = WSAGetLastError();
|
||||||
printf("Error %d sending close notify\n", Status);
|
wprintf(L"Error %d sending close notify\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,7 +414,7 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, CHAR *host, SecBuffer *pExtraData) {
|
static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, WCHAR *host, SecBuffer *pExtraData) {
|
||||||
SecBufferDesc OutBuffer;
|
SecBufferDesc OutBuffer;
|
||||||
SecBuffer OutBuffers[1];
|
SecBuffer OutBuffers[1];
|
||||||
DWORD dwSSPIFlags;
|
DWORD dwSSPIFlags;
|
||||||
@ -516,7 +458,7 @@ static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, CHAR *host,
|
|||||||
|
|
||||||
if(scRet != SEC_I_CONTINUE_NEEDED)
|
if(scRet != SEC_I_CONTINUE_NEEDED)
|
||||||
{
|
{
|
||||||
printf("Error %d returned by InitializeSecurityContext (1)\n", scRet);
|
wprintf(L"Error %d returned by InitializeSecurityContext (1)\n", scRet);
|
||||||
return scRet;
|
return scRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +467,7 @@ static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, CHAR *host,
|
|||||||
{
|
{
|
||||||
cbData = send(tls_ctx->socket, OutBuffers[0].pvBuffer, OutBuffers[0].cbBuffer, 0);
|
cbData = send(tls_ctx->socket, OutBuffers[0].pvBuffer, OutBuffers[0].cbBuffer, 0);
|
||||||
if(cbData == SOCKET_ERROR || cbData == 0) {
|
if(cbData == SOCKET_ERROR || cbData == 0) {
|
||||||
printf("Error %d sending data to server (1)\n", WSAGetLastError());
|
wprintf(L"Error %d sending data to server (1)\n", WSAGetLastError());
|
||||||
tls_ctx->sspi->FreeContextBuffer(OutBuffers[0].pvBuffer);
|
tls_ctx->sspi->FreeContextBuffer(OutBuffers[0].pvBuffer);
|
||||||
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
||||||
return SEC_E_INTERNAL_ERROR;
|
return SEC_E_INTERNAL_ERROR;
|
||||||
@ -570,7 +512,7 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
IoBuffer = LocalAlloc(LMEM_FIXED, IO_BUFFER_SIZE);
|
IoBuffer = LocalAlloc(LMEM_FIXED, IO_BUFFER_SIZE);
|
||||||
if(IoBuffer == NULL)
|
if(IoBuffer == NULL)
|
||||||
{
|
{
|
||||||
printf("Out of memory (1)\n");
|
wprintf(L"Out of memory (1)\n");
|
||||||
return SEC_E_INTERNAL_ERROR;
|
return SEC_E_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
cbIoBuffer = 0;
|
cbIoBuffer = 0;
|
||||||
@ -596,12 +538,12 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
IO_BUFFER_SIZE - cbIoBuffer,
|
IO_BUFFER_SIZE - cbIoBuffer,
|
||||||
0);
|
0);
|
||||||
if(cbData == SOCKET_ERROR) {
|
if(cbData == SOCKET_ERROR) {
|
||||||
printf("Error %d reading data from server\n", WSAGetLastError());
|
wprintf(L"Error %d reading data from server\n", WSAGetLastError());
|
||||||
scRet = SEC_E_INTERNAL_ERROR;
|
scRet = SEC_E_INTERNAL_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(cbData == 0) {
|
else if(cbData == 0) {
|
||||||
printf("Server unexpectedly disconnected\n");
|
wprintf(L"Server unexpectedly disconnected\n");
|
||||||
scRet = SEC_E_INTERNAL_ERROR;
|
scRet = SEC_E_INTERNAL_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -661,7 +603,7 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
OutBuffers[0].cbBuffer,
|
OutBuffers[0].cbBuffer,
|
||||||
0);
|
0);
|
||||||
if(cbData == SOCKET_ERROR || cbData == 0) {
|
if(cbData == SOCKET_ERROR || cbData == 0) {
|
||||||
printf("Error %d sending data to server (2)\n",
|
wprintf(L"Error %d sending data to server (2)\n",
|
||||||
WSAGetLastError());
|
WSAGetLastError());
|
||||||
tls_ctx->sspi->FreeContextBuffer(OutBuffers[0].pvBuffer);
|
tls_ctx->sspi->FreeContextBuffer(OutBuffers[0].pvBuffer);
|
||||||
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
||||||
@ -693,7 +635,7 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
pExtraData->pvBuffer = LocalAlloc(LMEM_FIXED,
|
pExtraData->pvBuffer = LocalAlloc(LMEM_FIXED,
|
||||||
InBuffers[1].cbBuffer);
|
InBuffers[1].cbBuffer);
|
||||||
if(pExtraData->pvBuffer == NULL) {
|
if(pExtraData->pvBuffer == NULL) {
|
||||||
printf("Out of memory (2)\n");
|
wprintf(L"Out of memory (2)\n");
|
||||||
return SEC_E_INTERNAL_ERROR;
|
return SEC_E_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -704,7 +646,7 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
pExtraData->cbBuffer = InBuffers[1].cbBuffer;
|
pExtraData->cbBuffer = InBuffers[1].cbBuffer;
|
||||||
pExtraData->BufferType = SECBUFFER_TOKEN;
|
pExtraData->BufferType = SECBUFFER_TOKEN;
|
||||||
|
|
||||||
// printf("%d bytes of app data was bundled with handshake data\n", pExtraData->cbBuffer);
|
// wprintf(L"%d bytes of app data was bundled with handshake data\n", pExtraData->cbBuffer);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
pExtraData->pvBuffer = NULL;
|
pExtraData->pvBuffer = NULL;
|
||||||
@ -718,7 +660,7 @@ static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitia
|
|||||||
|
|
||||||
// Check for fatal error.
|
// Check for fatal error.
|
||||||
if(FAILED(scRet)) {
|
if(FAILED(scRet)) {
|
||||||
printf("Error 0x%x returned by InitializeSecurityContext (2)\n", scRet);
|
wprintf(L"Error 0x%x returned by InitializeSecurityContext (2)\n", scRet);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -792,7 +734,7 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
// Read stream encryption properties.
|
// Read stream encryption properties.
|
||||||
scRet = tls_ctx->sspi->QueryContextAttributes(&tls_ctx->h_context, SECPKG_ATTR_STREAM_SIZES, &Sizes);
|
scRet = tls_ctx->sspi->QueryContextAttributes(&tls_ctx->h_context, SECPKG_ATTR_STREAM_SIZES, &Sizes);
|
||||||
if(scRet != SEC_E_OK) {
|
if(scRet != SEC_E_OK) {
|
||||||
printf("Error 0x%x reading SECPKG_ATTR_STREAM_SIZES\n", scRet);
|
wprintf(L"Error 0x%x reading SECPKG_ATTR_STREAM_SIZES\n", scRet);
|
||||||
return scRet;
|
return scRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -803,7 +745,7 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
|
|
||||||
pbIoBuffer = LocalAlloc(LMEM_FIXED, cbIoBufferLength);
|
pbIoBuffer = LocalAlloc(LMEM_FIXED, cbIoBufferLength);
|
||||||
if(pbIoBuffer == NULL) {
|
if(pbIoBuffer == NULL) {
|
||||||
printf("Out of memory (2)\n");
|
wprintf(L"Out of memory (2)\n");
|
||||||
return SEC_E_INTERNAL_ERROR;
|
return SEC_E_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -843,14 +785,14 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
scRet = tls_ctx->sspi->EncryptMessage(&tls_ctx->h_context, 0, &Message, 0);
|
scRet = tls_ctx->sspi->EncryptMessage(&tls_ctx->h_context, 0, &Message, 0);
|
||||||
|
|
||||||
if(FAILED(scRet)) {
|
if(FAILED(scRet)) {
|
||||||
printf("Error 0x%x returned by EncryptMessage\n", scRet);
|
wprintf(L"Error 0x%x returned by EncryptMessage\n", scRet);
|
||||||
return scRet;
|
return scRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send the encrypted data to the server.
|
// Send the encrypted data to the server.
|
||||||
cbData = send(tls_ctx->socket, pbIoBuffer, Buffers[0].cbBuffer + Buffers[1].cbBuffer + Buffers[2].cbBuffer, 0);
|
cbData = send(tls_ctx->socket, pbIoBuffer, Buffers[0].cbBuffer + Buffers[1].cbBuffer + Buffers[2].cbBuffer, 0);
|
||||||
if(cbData == SOCKET_ERROR || cbData == 0) {
|
if(cbData == SOCKET_ERROR || cbData == 0) {
|
||||||
printf("Error %d sending data to server (3)\n", WSAGetLastError());
|
wprintf(L"Error %d sending data to server (3)\n", WSAGetLastError());
|
||||||
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
tls_ctx->sspi->DeleteSecurityContext(&tls_ctx->h_context);
|
||||||
return SEC_E_INTERNAL_ERROR;
|
return SEC_E_INTERNAL_ERROR;
|
||||||
}
|
}
|
||||||
@ -863,14 +805,14 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
if(0 == cbIoBuffer || scRet == SEC_E_INCOMPLETE_MESSAGE) {
|
if(0 == cbIoBuffer || scRet == SEC_E_INCOMPLETE_MESSAGE) {
|
||||||
cbData = recv(tls_ctx->socket, pbIoBuffer + cbIoBuffer, cbIoBufferLength - cbIoBuffer, 0);
|
cbData = recv(tls_ctx->socket, pbIoBuffer + cbIoBuffer, cbIoBufferLength - cbIoBuffer, 0);
|
||||||
if(cbData == SOCKET_ERROR) {
|
if(cbData == SOCKET_ERROR) {
|
||||||
printf("Error %d reading data from server\n", WSAGetLastError());
|
wprintf(L"Error %d reading data from server\n", WSAGetLastError());
|
||||||
scRet = SEC_E_INTERNAL_ERROR;
|
scRet = SEC_E_INTERNAL_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
else if(cbData == 0) {
|
else if(cbData == 0) {
|
||||||
// Server disconnected.
|
// Server disconnected.
|
||||||
if(cbIoBuffer) {
|
if(cbIoBuffer) {
|
||||||
printf("Server unexpectedly disconnected\n");
|
wprintf(L"Server unexpectedly disconnected\n");
|
||||||
scRet = SEC_E_INTERNAL_ERROR;
|
scRet = SEC_E_INTERNAL_ERROR;
|
||||||
return scRet;
|
return scRet;
|
||||||
}
|
}
|
||||||
@ -914,7 +856,7 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
scRet != SEC_I_RENEGOTIATE &&
|
scRet != SEC_I_RENEGOTIATE &&
|
||||||
scRet != SEC_I_CONTEXT_EXPIRED)
|
scRet != SEC_I_CONTEXT_EXPIRED)
|
||||||
{
|
{
|
||||||
printf("Error 0x%x returned by DecryptMessage\n", scRet);
|
wprintf(L"Error 0x%x returned by DecryptMessage\n", scRet);
|
||||||
return scRet;
|
return scRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -925,7 +867,7 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
if(pDataBuffer == NULL && Buffers[i].BufferType == SECBUFFER_DATA)
|
if(pDataBuffer == NULL && Buffers[i].BufferType == SECBUFFER_DATA)
|
||||||
{
|
{
|
||||||
pDataBuffer = &Buffers[i];
|
pDataBuffer = &Buffers[i];
|
||||||
// printf("Buffers[%d].BufferType = SECBUFFER_DATA\n",i);
|
// wprintf(L"Buffers[%d].BufferType = SECBUFFER_DATA\n",i);
|
||||||
}
|
}
|
||||||
if(pExtraBuffer == NULL && Buffers[i].BufferType == SECBUFFER_EXTRA)
|
if(pExtraBuffer == NULL && Buffers[i].BufferType == SECBUFFER_EXTRA)
|
||||||
{
|
{
|
||||||
@ -978,7 +920,7 @@ static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR *
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host, DWORD dwCertFlags) {
|
static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, LPWSTR host, DWORD dwCertFlags) {
|
||||||
HTTPSPolicyCallbackData polHttps;
|
HTTPSPolicyCallbackData polHttps;
|
||||||
CERT_CHAIN_POLICY_PARA PolicyPara;
|
CERT_CHAIN_POLICY_PARA PolicyPara;
|
||||||
CERT_CHAIN_POLICY_STATUS PolicyStatus;
|
CERT_CHAIN_POLICY_STATUS PolicyStatus;
|
||||||
@ -988,7 +930,7 @@ static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host,
|
|||||||
CHAR *rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH,
|
CHAR *rgszUsages[] = { szOID_PKIX_KP_SERVER_AUTH,
|
||||||
szOID_SERVER_GATED_CRYPTO,
|
szOID_SERVER_GATED_CRYPTO,
|
||||||
szOID_SGC_NETSCAPE };
|
szOID_SGC_NETSCAPE };
|
||||||
DWORD cUsages = sizeof(rgszUsages) / sizeof(LPSTR);
|
DWORD cUsages = sizeof(rgszUsages) / sizeof(CHAR);
|
||||||
|
|
||||||
PWSTR pwszServerName = NULL;
|
PWSTR pwszServerName = NULL;
|
||||||
DWORD cchServerName;
|
DWORD cchServerName;
|
||||||
@ -1000,20 +942,7 @@ static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert server name to unicode.
|
if(host == NULL || wcslen(host) == 0) {
|
||||||
if(host == NULL || strlen(host) == 0) {
|
|
||||||
Status = SEC_E_WRONG_PRINCIPAL;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
cchServerName = MultiByteToWideChar(CP_ACP, 0, host, -1, NULL, 0);
|
|
||||||
pwszServerName = LocalAlloc(LMEM_FIXED, cchServerName * sizeof(WCHAR));
|
|
||||||
if(pwszServerName == NULL) {
|
|
||||||
Status = SEC_E_INSUFFICIENT_MEMORY;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
cchServerName = MultiByteToWideChar(CP_ACP, 0, host, -1, pwszServerName, cchServerName);
|
|
||||||
if(cchServerName == 0) {
|
|
||||||
Status = SEC_E_WRONG_PRINCIPAL;
|
Status = SEC_E_WRONG_PRINCIPAL;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
@ -1028,7 +957,7 @@ static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host,
|
|||||||
|
|
||||||
if(!CertGetCertificateChain(NULL, pServerCert, NULL, pServerCert->hCertStore, &ChainPara, 0, NULL, &pChainContext)) {
|
if(!CertGetCertificateChain(NULL, pServerCert, NULL, pServerCert->hCertStore, &ChainPara, 0, NULL, &pChainContext)) {
|
||||||
Status = GetLastError();
|
Status = GetLastError();
|
||||||
printf("Error 0x%x returned by CertGetCertificateChain!\n", Status);
|
wprintf(L"Error 0x%x returned by CertGetCertificateChain!\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1037,7 +966,7 @@ static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host,
|
|||||||
polHttps.cbStruct = sizeof(HTTPSPolicyCallbackData);
|
polHttps.cbStruct = sizeof(HTTPSPolicyCallbackData);
|
||||||
polHttps.dwAuthType = AUTHTYPE_SERVER;
|
polHttps.dwAuthType = AUTHTYPE_SERVER;
|
||||||
polHttps.fdwChecks = dwCertFlags;
|
polHttps.fdwChecks = dwCertFlags;
|
||||||
polHttps.pwszServerName = pwszServerName;
|
polHttps.pwszServerName = host;
|
||||||
|
|
||||||
memset(&PolicyPara, 0, sizeof(PolicyPara));
|
memset(&PolicyPara, 0, sizeof(PolicyPara));
|
||||||
PolicyPara.cbSize = sizeof(PolicyPara);
|
PolicyPara.cbSize = sizeof(PolicyPara);
|
||||||
@ -1048,7 +977,7 @@ static DWORD verify_server_certificate( PCCERT_CONTEXT pServerCert, PSTR host,
|
|||||||
|
|
||||||
if(!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, pChainContext, &PolicyPara, &PolicyStatus)){
|
if(!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, pChainContext, &PolicyPara, &PolicyStatus)){
|
||||||
Status = GetLastError();
|
Status = GetLastError();
|
||||||
printf("Error 0x%x returned by CertVerifyCertificateChainPolicy!\n", Status);
|
wprintf(L"Error 0x%x returned by CertVerifyCertificateChainPolicy!\n", Status);
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1088,7 +1017,7 @@ static void get_new_client_credentials(TlsContext *tls_ctx) {
|
|||||||
// Read list of trusted issuers from schannel.
|
// Read list of trusted issuers from schannel.
|
||||||
Status = tls_ctx->sspi->QueryContextAttributes(&tls_ctx->h_context, SECPKG_ATTR_ISSUER_LIST_EX, (PVOID)&IssuerListInfo);
|
Status = tls_ctx->sspi->QueryContextAttributes(&tls_ctx->h_context, SECPKG_ATTR_ISSUER_LIST_EX, (PVOID)&IssuerListInfo);
|
||||||
if(Status != SEC_E_OK) {
|
if(Status != SEC_E_OK) {
|
||||||
printf("Error 0x%x querying issuer list info\n", Status);
|
wprintf(L"Error 0x%x querying issuer list info\n", Status);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1113,7 +1042,7 @@ static void get_new_client_credentials(TlsContext *tls_ctx) {
|
|||||||
&FindByIssuerPara,
|
&FindByIssuerPara,
|
||||||
pChainContext);
|
pChainContext);
|
||||||
if(pChainContext == NULL) {
|
if(pChainContext == NULL) {
|
||||||
printf("Error 0x%x finding cert chain\n", GetLastError());
|
wprintf(L"Error 0x%x finding cert chain\n", GetLastError());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1127,7 +1056,7 @@ static void get_new_client_credentials(TlsContext *tls_ctx) {
|
|||||||
|
|
||||||
Status = tls_ctx->sspi->AcquireCredentialsHandle(
|
Status = tls_ctx->sspi->AcquireCredentialsHandle(
|
||||||
NULL, // Name of principal
|
NULL, // Name of principal
|
||||||
UNISP_NAME_A, // Name of package
|
UNISP_NAME_W, // Name of package
|
||||||
SECPKG_CRED_OUTBOUND, // Flags indicating use
|
SECPKG_CRED_OUTBOUND, // Flags indicating use
|
||||||
NULL, // Pointer to logon ID
|
NULL, // Pointer to logon ID
|
||||||
&tls_ctx->schannel_cred, // Package specific data
|
&tls_ctx->schannel_cred, // Package specific data
|
||||||
@ -1136,7 +1065,7 @@ static void get_new_client_credentials(TlsContext *tls_ctx) {
|
|||||||
&hCreds, // (out) Cred Handle
|
&hCreds, // (out) Cred Handle
|
||||||
&tsExpiry); // (out) Lifetime (optional)
|
&tsExpiry); // (out) Lifetime (optional)
|
||||||
if(Status != SEC_E_OK) {
|
if(Status != SEC_E_OK) {
|
||||||
printf("Error 0x%x returned by AcquireCredentialsHandle\n", Status);
|
wprintf(L"Error 0x%x returned by AcquireCredentialsHandle\n", Status);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
8
thirdparty/vschannel/vschannel.h
vendored
8
thirdparty/vschannel/vschannel.h
vendored
@ -28,19 +28,19 @@ static void vschannel_init(TlsContext *tls_ctx);
|
|||||||
|
|
||||||
static void vschannel_cleanup(TlsContext *tls_ctx);
|
static void vschannel_cleanup(TlsContext *tls_ctx);
|
||||||
|
|
||||||
static INT request(TlsContext *tls_ctx, INT iport, CHAR *host, CHAR *req, CHAR **out);
|
static INT request(TlsContext *tls_ctx, INT iport, LPWSTR host, CHAR *req, CHAR **out);
|
||||||
|
|
||||||
static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR **out, int *length);
|
static SECURITY_STATUS https_make_request(TlsContext *tls_ctx, CHAR *req, CHAR **out, int *length);
|
||||||
|
|
||||||
static INT connect_to_server(TlsContext *tls_ctx, CHAR *host, INT port_number);
|
static INT connect_to_server(TlsContext *tls_ctx, LPWSTR host, INT port_number);
|
||||||
|
|
||||||
static LONG disconnect_from_server(TlsContext *tls_ctx);
|
static LONG disconnect_from_server(TlsContext *tls_ctx);
|
||||||
|
|
||||||
static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, CHAR *host, SecBuffer *pExtraData);
|
static SECURITY_STATUS perform_client_handshake(TlsContext *tls_ctx, LPWSTR host, SecBuffer *pExtraData);
|
||||||
|
|
||||||
static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitialRead, SecBuffer *pExtraData);
|
static SECURITY_STATUS client_handshake_loop(TlsContext *tls_ctx, BOOL fDoInitialRead, SecBuffer *pExtraData);
|
||||||
|
|
||||||
static DWORD verify_server_certificate(PCCERT_CONTEXT pServerCert, PSTR host, DWORD dwCertFlags);
|
static DWORD verify_server_certificate(PCCERT_CONTEXT pServerCert, LPWSTR host, DWORD dwCertFlags);
|
||||||
|
|
||||||
static SECURITY_STATUS create_credentials(TlsContext *tls_ctx);
|
static SECURITY_STATUS create_credentials(TlsContext *tls_ctx);
|
||||||
|
|
||||||
|
@ -28,14 +28,7 @@ struct C.SSL {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn init() int {
|
fn init() int {
|
||||||
$if mac {
|
|
||||||
C.SSL_library_init()
|
C.SSL_library_init()
|
||||||
}
|
|
||||||
$if linux {
|
|
||||||
C.SSL_library_init()
|
|
||||||
}
|
|
||||||
//C.SSL_load_error_strings()
|
|
||||||
//C.OPENSSL_config(0)
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ module http
|
|||||||
#flag windows -I @VROOT/thirdparty/vschannel
|
#flag windows -I @VROOT/thirdparty/vschannel
|
||||||
#flag -l ws2_32
|
#flag -l ws2_32
|
||||||
#flag -l crypt32
|
#flag -l crypt32
|
||||||
|
#flag -l secur32
|
||||||
|
|
||||||
#include "vschannel.c"
|
#include "vschannel.c"
|
||||||
|
|
||||||
@ -22,7 +23,7 @@ fn (req &Request) ssl_do(port int, method, host_name, path string) Response {
|
|||||||
mut buff := malloc(C.vsc_init_resp_buff_size)
|
mut buff := malloc(C.vsc_init_resp_buff_size)
|
||||||
addr := host_name
|
addr := host_name
|
||||||
sdata := req.build_request_headers(method, host_name, path)
|
sdata := req.build_request_headers(method, host_name, path)
|
||||||
length := int(C.request(&ctx, port, addr.str, sdata.str, &buff))
|
length := int(C.request(&ctx, port, addr.to_wide(), sdata.str, &buff))
|
||||||
|
|
||||||
C.vschannel_cleanup(&ctx)
|
C.vschannel_cleanup(&ctx)
|
||||||
return parse_response(string(buff, length))
|
return parse_response(string(buff, length))
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// import net.urllib
|
// import net.urllib
|
||||||
// import http
|
import http
|
||||||
|
|
||||||
fn test_escape_unescape() {
|
fn test_escape_unescape() {
|
||||||
/*
|
/*
|
||||||
@ -12,15 +12,11 @@ fn test_escape_unescape() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn test_http_get() {
|
fn test_http_get() {
|
||||||
/*
|
|
||||||
$if windows { return }
|
|
||||||
assert http.get_text('https://vlang.io/version') == '0.1.5'
|
assert http.get_text('https://vlang.io/version') == '0.1.5'
|
||||||
println('http ok')
|
println('http ok')
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_http_get_from_vlang_utc_now() {
|
fn test_http_get_from_vlang_utc_now() {
|
||||||
/*
|
|
||||||
urls := ['http://vlang.io/utc_now', 'https://vlang.io/utc_now']
|
urls := ['http://vlang.io/utc_now', 'https://vlang.io/utc_now']
|
||||||
for url in urls {
|
for url in urls {
|
||||||
println('Test getting current time from $url by http.get')
|
println('Test getting current time from $url by http.get')
|
||||||
@ -30,11 +26,9 @@ fn test_http_get_from_vlang_utc_now() {
|
|||||||
assert res.text.int() > 1566403696
|
assert res.text.int() > 1566403696
|
||||||
println('Current time is: ${res.text.int()}')
|
println('Current time is: ${res.text.int()}')
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_public_servers() {
|
fn test_public_servers() {
|
||||||
/*
|
|
||||||
urls := [
|
urls := [
|
||||||
'http://github.com/robots.txt',
|
'http://github.com/robots.txt',
|
||||||
'http://google.com/robots.txt',
|
'http://google.com/robots.txt',
|
||||||
@ -49,5 +43,4 @@ fn test_public_servers() {
|
|||||||
assert 200 == res.status_code
|
assert 200 == res.status_code
|
||||||
assert res.text.len > 0
|
assert res.text.len > 0
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
@ -176,9 +176,11 @@ pub fn (s Socket) connect(address string, port int) ?int {
|
|||||||
hints.ai_family = C.AF_UNSPEC
|
hints.ai_family = C.AF_UNSPEC
|
||||||
hints.ai_socktype = C.SOCK_STREAM
|
hints.ai_socktype = C.SOCK_STREAM
|
||||||
hints.ai_flags = C.AI_PASSIVE
|
hints.ai_flags = C.AI_PASSIVE
|
||||||
|
hints.ai_protocol = 0
|
||||||
hints.ai_addrlen = 0
|
hints.ai_addrlen = 0
|
||||||
hints.ai_canonname = C.NULL
|
hints.ai_canonname = C.NULL
|
||||||
hints.ai_addr = C.NULL
|
hints.ai_addr = C.NULL
|
||||||
|
hints.ai_next = C.NULL
|
||||||
|
|
||||||
|
|
||||||
info := &C.addrinfo{!}
|
info := &C.addrinfo{!}
|
||||||
|
@ -2,17 +2,14 @@ import net
|
|||||||
|
|
||||||
fn test_socket() {
|
fn test_socket() {
|
||||||
mut server := net.listen(0) or {
|
mut server := net.listen(0) or {
|
||||||
println(err)
|
panic(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
server_port := server.get_port()
|
server_port := server.get_port()
|
||||||
mut client := net.dial('127.0.0.1', server_port) or {
|
mut client := net.dial('127.0.0.1', server_port) or {
|
||||||
println(err)
|
panic(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
mut socket := server.accept() or {
|
mut socket := server.accept() or {
|
||||||
println(err)
|
panic(err)
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message := 'Hello World'
|
message := 'Hello World'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user