ずいぶん長くなってしまいましたが、できました。
一応、setProxy命令も作りましたが、インターネットオプションで
設定されていれば、たぶん、setProxyを使わなくても動くと思います。
#module "http"
#uselib "wininet.dll"
#cfunc InternetOpen "InternetOpenA" int,int,int,int,int
#cfunc InternetConnect "InternetConnectA" int,int,int,int,int,int,int,int
#cfunc HttpOpenRequest "HttpOpenRequestA" int,int,int,int,int,int,int,int
#cfunc HttpSendRequest "HttpSendRequestA" int,int,int,int,int
#cfunc InternetReadFile "InternetReadFile" int,int,int,int
#cfunc HttpQueryInfo "HttpQueryInfoA" int,int,int,int,int
#func InternetCloseHandle "InternetCloseHandle" int
;プロクシのセット
#deffunc setProxy str s1, str s2
sdim proxy,256
sdim bypass,256
proxy=s1 ;プロクシサーバ
bypass=s2 ;プロクシバイパスリスト
return
;送信ヘッダとreferrerのセット
#deffunc setHeader var v1, str s2
phead=varptr(v1)
sdim referrer,256
referrer=s2
pref=varptr(referrer)
return
;httpを開く
#define INTERNET_OPEN_TYPE_PRECONFIG 0
#define INTERNET_OPEN_TYPE_PROXY 3
#define INTERNET_SERVICE_HTTP 3
#defcfunc openHttp str s1,str s2,int p3
;引数
;User Agent
sdim agent,256
agent=s1
;http server
sdim server,256
server=s2
;http port
port=p3
;インターネットを開く
if proxy=="" {
accessType=INTERNET_OPEN_TYPE_PRECONFIG ;レジストリから設定を取得する
pproxy=0
pbypass=0
} else {
accessType=INTERNET_OPEN_TYPE_PROXY ;プロクシサーバを使う
pproxy=varptr(proxy)
if bypass=="" { pbypass=0 }
else { pbypass=varptr(bypass) }
}
hInternet=InternetOpen(varptr(agent),accessType,pproxy,pbypass,0)
if hInternet==0 {
dialog "インターネットが開けません"
return 1
}
;サーバに接続
hConnect=InternetConnect(hInternet,varptr(server),port,0,0,INTERNET_SERVICE_HTTP,0,0)
if hConnect==0 {
dialog "サーバへの接続に失敗しました"
return 1
}
return 0
;http Requestの送信
#define INTERNET_FLAG_NO_COOKIES 0x80000
#define INTERNET_FLAG_NO_UI 512
#define INTERNET_FLAG_PRAGMA_NOCACHE 256
#define INTERNET_FLAG_SECURE 0x800000
#defcfunc httpRequest str s1,var v2,int p3,int p4
;パス
sdim path,256
path=s1
ppath=varptr(path)
;POSTデータ
pdpost=0: if v2!="": pdpost=varptr(v2)
lpost=strlen(v2)
;0:GET, 1:POST
sdim averb,10,2
averb="GET","POST"
pverb=varptr(averb.p3)
;SSLフラグ
fSsl=0: if p4: fSsl=INTERNET_FLAG_SECURE
;要求を開く
flg=INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI; | INTERNET_FLAG_PRAGMA_NOCACHE
flg=flg | fSsl
hRequest=HttpOpenRequest(hConnect,pverb,ppath,0,pref,0,flg,0)
if hRequest==0 {
dialog "http requestの作成に失敗しました"
return 1
}
;要求送信
if HttpSendRequest(hRequest,phead,-1,pdpost,lpost)==0 {
dialog "http requestの送信に失敗しました"
return 1
}
return 0
;データの受信
#define HTTP_QUERY_RAW_HEADERS_CRLF 22
#defcfunc httpGet var v1,var v2, int p3, int p4
;受信ヘッダ
phead=varptr(v1)
headsize=p3
;受信バッファ
dup buf,v2
bufsize=p4
;受信
sdim tmp,1024
size=0
len=0
repeat
rt=InternetReadFile(hRequest,varptr(tmp),1023,varptr(size))
if rt==0: break
if size<1: break
poke tmp,size,0
len+=size: if len>=bufsize: break
buf+=tmp
loop
if rt==0 {
dialog "データの受信に失敗しました"
return 1
}
if len>=bufsize {
dialog "受信バッファサイズが足りません"
return 1
}
;ヘッダの取得
flg=HTTP_QUERY_RAW_HEADERS_CRLF
rt=HttpQueryInfo(hRequest,flg,phead,varptr(headsize),varptr(index))
if rt==0 {
dialog "受信ヘッダの取得に失敗しました
return 1
}
if index {
dialog "ヘッダがまだあるようです"
}
return 0
#deffunc closeHttp
if hRequest: InternetCloseHandle hRequest
if hConnect: InternetCloseHandle hConnect
if hInternet: InternetCloseHandle hInternet
return
#global
;POSTする文字列 - 英数字と一部の記号以外を含む場合、URLエンコードが必要
dpost="test=abc&mode=check"
;http server
server="antares.cn"
;http port
port=80
path="/test3.php"
;user agent(Browser)
agent="Hsp/3.1"
;送信ヘッダ
sdim header,1024
header="Accept: text/html;q=0.9,text/plain;q=0.8\n" ;この辺はなくても
header+="Connection: close\n" ;動作するようです
header+="Content-type: application/x-www-form-urlencoded\n\n"
;リファラ(リンク元)
referrer=""
;プロクシ
;proxy="nnn.nnn.nnn.nnn:nnnn"
proxy=""
bypass=""
rheadsize=1024
sdim rhead,rheadsize
bufsize=32000
sdim buf, bufsize
setProxy proxy,bypass
setHeader header,referrer
stt=openHttp(agent,server,port)
if stt==0: stt=httpRequest(path,dpost,1)
if stt==0: stt=httpGet(rhead, buf, rheadsize, bufsize)
if stt==0 {
if strlen(rhead)+strlen(buf)>=bufsize {
dialog "bufのサイズが足りません"
stt=1
} else {
buf=rhead+buf
mesbox buf,640,480
}
}
closeHttp
if stt: end
stop
以下を参考にしました。
http://fs-cgi-basic01.freespace.jp/~puma/lng/joyful.cgi?print+log/03020010.txt