http: Windows fixes + clean up
parent
aac8503d83
commit
54d2f9921f
|
@ -11,8 +11,7 @@ import time
|
||||||
#include <WinInet.h>
|
#include <WinInet.h>
|
||||||
#include "urlmon.h"
|
#include "urlmon.h"
|
||||||
#include <shlwapi.h>
|
#include <shlwapi.h>
|
||||||
// #LPWSTR winstring(string s);
|
|
||||||
// # bool ok = InternetReadFile(request, buf, BUF_MAX, &nr_read);
|
|
||||||
import const (
|
import const (
|
||||||
INTERNET_OPEN_TYPE_PRECONFIG
|
INTERNET_OPEN_TYPE_PRECONFIG
|
||||||
INTERNET_DEFAULT_HTTP_PORT
|
INTERNET_DEFAULT_HTTP_PORT
|
||||||
|
@ -33,9 +32,7 @@ pub fn (req &Request) do() Response {
|
||||||
emptyresp := Response{}
|
emptyresp := Response{}
|
||||||
mut url := req.url
|
mut url := req.url
|
||||||
//println('\n\nhttp.do() WIN URL="$url" TYP=$req.typ data="$req.data" headers.len=req.headers.len"')
|
//println('\n\nhttp.do() WIN URL="$url" TYP=$req.typ data="$req.data" headers.len=req.headers.len"')
|
||||||
//println(req.headers)
|
|
||||||
is_ssl := req.url.starts_with('https://')
|
is_ssl := req.url.starts_with('https://')
|
||||||
//println('is ssl=$is_ssl')
|
|
||||||
mut pos := url.index('://')
|
mut pos := url.index('://')
|
||||||
if pos == -1 {return emptyresp}
|
if pos == -1 {return emptyresp}
|
||||||
url = url.right(pos + 3)
|
url = url.right(pos + 3)
|
||||||
|
@ -47,42 +44,24 @@ pub fn (req &Request) do() Response {
|
||||||
host = host.clone()
|
host = host.clone()
|
||||||
path = url.right(pos)
|
path = url.right(pos)
|
||||||
}
|
}
|
||||||
// println('HOST="$host"')
|
|
||||||
// println('PATH="$path"')
|
|
||||||
mut headers := ''
|
mut headers := ''
|
||||||
mut resp_headers := ''
|
mut resp_headers := ''
|
||||||
// for header in req.headers {
|
|
||||||
for key, val in req.headers {
|
for key, val in req.headers {
|
||||||
headers += '$key: $val\r\n'
|
headers += '$key: $val\r\n'
|
||||||
}
|
}
|
||||||
if req.typ == 'POST' {
|
if req.typ == 'POST' {
|
||||||
headers += 'Content-Type: application/x-www-form-urlencoded'
|
headers += 'Content-Type: application/x-www-form-urlencoded'
|
||||||
}
|
}
|
||||||
// headers = headers.trim_space()
|
|
||||||
// println('!!! OLO REQ HEADERS WIN="$headers"')
|
|
||||||
data := req.data
|
data := req.data
|
||||||
// Retrieve default http user agent
|
// Retrieve default http user agent
|
||||||
// char httpUseragent[512];
|
|
||||||
// # char httpUseragent []= "";
|
|
||||||
user_agent := ''
|
user_agent := ''
|
||||||
// DWORD szhttpUserAgent = sizeof(httpUseragent);
|
|
||||||
// ObtainUserAgentString(0, httpUseragent, &szhttpUserAgent);
|
|
||||||
// # HINTERNET internet = InternetOpenA(httpUseragent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
|
|
||||||
internet := C.InternetOpenA(user_agent.str, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0)
|
internet := C.InternetOpenA(user_agent.str, INTERNET_OPEN_TYPE_PRECONFIG, 0, 0, 0)
|
||||||
// # if (!internet)
|
|
||||||
if isnil(internet) {
|
if isnil(internet) {
|
||||||
println('InternetOpen() failed')
|
println('InternetOpen() failed')
|
||||||
return emptyresp
|
return emptyresp
|
||||||
}
|
}
|
||||||
// # INTERNET_PORT port = INTERNET_DEFAULT_HTTP_PORT;
|
|
||||||
port := int(if is_ssl{INTERNET_DEFAULT_HTTPS_PORT} else { INTERNET_DEFAULT_HTTP_PORT})
|
port := int(if is_ssl{INTERNET_DEFAULT_HTTPS_PORT} else { INTERNET_DEFAULT_HTTP_PORT})
|
||||||
// if is_ssl {
|
|
||||||
// # port = INTERNET_DEFAULT_HTTPS_PORT;
|
|
||||||
// }
|
|
||||||
connect := C.InternetConnectA(internet, host.str, port, 0, 0, INTERNET_SERVICE_HTTP, 0, 0)
|
connect := C.InternetConnectA(internet, host.str, port, 0, 0, INTERNET_SERVICE_HTTP, 0, 0)
|
||||||
// # HINTERNET connect = InternetConnectA(internet, host.str, port, NULL, NULL,
|
|
||||||
// # INTERNET_SERVICE_HTTP, 0, 0);
|
|
||||||
# if (!connect)
|
|
||||||
if isnil(connect) {
|
if isnil(connect) {
|
||||||
e := C.GetLastError()
|
e := C.GetLastError()
|
||||||
println('[windows] InternetConnect() failed')
|
println('[windows] InternetConnect() failed')
|
||||||
|
@ -90,68 +69,38 @@ pub fn (req &Request) do() Response {
|
||||||
return emptyresp
|
return emptyresp
|
||||||
}
|
}
|
||||||
flags := 0
|
flags := 0
|
||||||
// # DWORD flags =
|
|
||||||
#flags =
|
#flags =
|
||||||
# INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
|
# INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
|
||||||
# INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
|
# INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
|
||||||
# INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
|
# INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
|
||||||
# INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_NO_AUTH |
|
# INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS | INTERNET_FLAG_NO_AUTH |
|
||||||
# INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_UI |
|
# INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_UI |
|
||||||
# INTERNET_FLAG_NO_COOKIES | // FUCK YOU MICROSOFT
|
# INTERNET_FLAG_NO_COOKIES | // ...
|
||||||
# INTERNET_FLAG_KEEP_CONNECTION |
|
# INTERNET_FLAG_KEEP_CONNECTION |
|
||||||
# INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD ;
|
# INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD ;
|
||||||
if is_ssl {
|
if is_ssl {
|
||||||
#flags = flags | INTERNET_FLAG_SECURE;
|
#flags = flags | INTERNET_FLAG_SECURE;
|
||||||
}
|
}
|
||||||
request := C.HttpOpenRequest(connect, req.typ.str, path.str, 'HTTP/1.1', 0, 0, flags, 0)
|
request := C.HttpOpenRequest(connect, req.typ.str, path.str, 'HTTP/1.1', 0, 0, flags, 0)
|
||||||
// request := C.InternetOpenUrl(connect, req.typ.str, path.str, 'HTTP/1.1', 0, 0, flags, 0)
|
|
||||||
// # HINTERNET request = HttpOpenRequest(connect, req->typ.str, path.str, "HTTP/1.1",
|
|
||||||
// # NULL, NULL, flags, NULL);
|
|
||||||
// # if (!request)
|
|
||||||
if isnil(request) {
|
if isnil(request) {
|
||||||
println('HttpOpenRequest() failed')
|
println('HttpOpenRequest() failed')
|
||||||
return emptyresp
|
return emptyresp
|
||||||
}
|
}
|
||||||
// println('LEN BEFORE SEND=$headers.len ; $headers')
|
|
||||||
# bool ret =HttpSendRequest(request, headers.str, -1, data.str, data.len);
|
# bool ret =HttpSendRequest(request, headers.str, -1, data.str, data.len);
|
||||||
// # printf("RET=%d\n", ret);
|
|
||||||
// # int e = GetLastError();
|
|
||||||
// # printf("e=%d\n", e);
|
|
||||||
// Get response headers
|
|
||||||
// Todo call twice to get len
|
|
||||||
# LPSTR h_buf = malloc(1024);
|
# LPSTR h_buf = malloc(1024);
|
||||||
# DWORD dwSize = 1024;
|
# DWORD dwSize = 1024;
|
||||||
// LPVOID lpOutBuffer=malloc(dwSize);
|
|
||||||
# HttpQueryInfo(request, HTTP_QUERY_RAW_HEADERS_CRLF,
|
# HttpQueryInfo(request, HTTP_QUERY_RAW_HEADERS_CRLF,
|
||||||
# h_buf,&dwSize,NULL);
|
# h_buf,&dwSize,NULL);
|
||||||
//# printf(" resp HEADERS %s\n", h_buf);
|
|
||||||
// Get response body
|
// Get response body
|
||||||
// # const int BUF_MAX = 1024;
|
|
||||||
// # TCHAR buf[BUF_MAX + 1];
|
|
||||||
mut buf := [1025]byte
|
mut buf := [1025]byte
|
||||||
mut nr_read := 0
|
mut nr_read := 0
|
||||||
// ok := C.InternetReadFile(request, buf, BUF_MAX, &nr_read)
|
|
||||||
// # DWORD dwRead = 0;
|
|
||||||
// /println('calling InternetReadFile()')
|
|
||||||
// # bool ok = InternetReadFile(request, buf, BUF_MAX, &nr_read);
|
|
||||||
// # if (!ok)
|
|
||||||
// {
|
|
||||||
// println('read not ok')
|
|
||||||
// # int e = GetLastError();
|
|
||||||
// # printf("%d\n", e);
|
|
||||||
// }
|
|
||||||
// # printf("dwread=%d\n", dwRead);
|
|
||||||
// # while ((InternetReadFile(request, buf, BUF_MAX, &nr_read)) && nr_read > 0)
|
|
||||||
mut s := ''
|
mut s := ''
|
||||||
for
|
for {
|
||||||
{
|
|
||||||
ok := C.InternetReadFile(request, buf, BUF_MAX, &nr_read)
|
ok := C.InternetReadFile(request, buf, BUF_MAX, &nr_read)
|
||||||
if !ok {
|
if !ok {
|
||||||
println('InternetReadFile() not ok ')
|
println('InternetReadFile() not ok ')
|
||||||
}
|
}
|
||||||
if ok && nr_read == 0 {
|
if ok && nr_read == 0 {
|
||||||
//println('ok && nr read == 0, breaking')
|
|
||||||
//C.printf('buf broken="%s"\n', buf)
|
|
||||||
if req.url.contains('websocket') {
|
if req.url.contains('websocket') {
|
||||||
println('win sleeping 2')
|
println('win sleeping 2')
|
||||||
time.sleep(2)
|
time.sleep(2)
|
||||||
|
@ -159,11 +108,8 @@ pub fn (req &Request) do() Response {
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
//println('ireadfile()')
|
|
||||||
buf[nr_read] = 0
|
buf[nr_read] = 0
|
||||||
//C.printf('buf="%s"\n', buf)
|
s += string(buf, nr_read) // TODO perf
|
||||||
|
|
||||||
s += tos(buf, nr_read) // TODO perf
|
|
||||||
nr_read = 0
|
nr_read = 0
|
||||||
}
|
}
|
||||||
C.InternetCloseHandle(request)
|
C.InternetCloseHandle(request)
|
||||||
|
@ -172,14 +118,11 @@ pub fn (req &Request) do() Response {
|
||||||
# resp_headers = tos2(h_buf);
|
# resp_headers = tos2(h_buf);
|
||||||
hh := resp_headers.split('\n')
|
hh := resp_headers.split('\n')
|
||||||
mut resp := Response {
|
mut resp := Response {
|
||||||
body: s
|
text: s
|
||||||
headers: map[string]string{}
|
headers: map[string]string{}
|
||||||
// headers: resp_headers
|
// headers: resp_headers
|
||||||
}
|
}
|
||||||
// println('gen hh')
|
|
||||||
for h in hh {
|
for h in hh {
|
||||||
// println('\n!')
|
|
||||||
// println(h)
|
|
||||||
vals := h.split(':')
|
vals := h.split(':')
|
||||||
hpos := h.index(':')
|
hpos := h.index(':')
|
||||||
if hpos == -1 {
|
if hpos == -1 {
|
||||||
|
@ -190,7 +133,6 @@ pub fn (req &Request) do() Response {
|
||||||
// println('$key => $val')
|
// println('$key => $val')
|
||||||
resp.headers[key] = val.trim_space()
|
resp.headers[key] = val.trim_space()
|
||||||
}
|
}
|
||||||
//println('END OF WIN req.do($req.url)')
|
|
||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue