http: Windows fixes + clean up

pull/1409/head
Alexander Medvednikov 2019-07-31 22:27:39 +02:00
parent aac8503d83
commit 54d2f9921f
1 changed files with 5 additions and 63 deletions

View File

@ -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
} }