A2osX/BIN/HTTPGET.S.txt
2020-09-03 08:24:36 +02:00

671 lines
11 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/httpget
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
.INB inc/mli.i
.INB inc/mli.e.i
.INB inc/eth.i
.INB inc/libtcpip.i
.INB inc/net.http.i
*--------------------------------------
TIMEOUT.MAX .EQ 200 20 sec.
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ZPIPCfgPtr .BS 2
ZPHostPtr .BS 2
ZPPtr .BS 2
ArgIndex .BS 1
hSocket .BS 1
hReqBuf .BS 1
ZPReqBufPtr .BS 2
ZPReqBufLen .BS 2
bResponse .BS 1
TimeOut .BS 1
bURI .BS 1
hEncodedBuf .BS 1
ZPEncodedBufPtr .BS 2
ZPEncodedBufLen .BS 2
hSendBuf .BS 1
ZPSendBufPtr .BS 2
hRespBuf .BS 1
ZPRespBufPtr .BS 2
ZPRespBufLen .BS 2
hFile .BS 1
ZPFileName .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #S.PS.F.EVENT S.PS.F
.DA #0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
.DA #64 SS
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBTCPIP .DA LIBTCPIP
L.SA.LOCAL .DA SA.LOCAL
L.SA.REMOTE .DA SA.REMOTE
L.SA.REMOTE.AD .DA SA.REMOTE+S.SOCKADDR.ADDR
L.MSG.IPKO .DA MSG.IPKO
L.MSG.USAGE .DA MSG.USAGE
L.MSG.UNKNOWN .DA MSG.UNKNOWN
L.MSG.CONNECT .DA MSG.CONNECT
L.MSG.SKTKO .DA MSG.SKTKO
L.MSG.CONNECTED .DA MSG.CONNECTED
L.MSG.SKTERR .DA MSG.SKTERR
L.MSG.IOERR .DA MSG.IOERR
L.HTTP.GET .DA HTTP.GET
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBTCPIP
>SYSCALL LoadLib
bcs .9
sta hLIBTCPIP
.9 rts
*--------------------------------------
CS.RUN >LIBCALL hLIBTCPIP,LIBTCPIP.GETCFG is TCPIP loaded ?
>STYA ZPIPCfgPtr
lda (ZPIPCfgPtr) Configured ?
bmi CS.RUN.IPOK
>LDYA L.MSG.IPKO
>SYSCALL PutS
lda #E.SYN
sec
rts
CS.RUN.IPOK ldy #S.IPCFG.IP+3
ldx #3
.1 lda (ZPIPCfgPtr),y
sta SA.LOCAL+S.SOCKADDR.ADDR,x
dey
dex
bpl .1
jsr CS.RUN.GETNEXTARG
bcs .9
>STYA ZPHostPtr
jsr Init.TimeOut
.2 >PUSHW L.SA.REMOTE.AD
>PUSHW ZPHostPtr
>LIBCALL hLIBTCPIP,LIBTCPIP.HST.GetByName
bcc CS.RUN.HOSTOK
>SLEEP
lda TimeOut
bne .2
>PUSHW L.MSG.UNKNOWN
>PUSHW ZPHostPtr
>PUSHBI 2
>SYSCALL PrintF
bra CS.RUN.ESYN
.9 >PUSHW L.MSG.USAGE
>PUSHBI 0
>SYSCALL PrintF
CS.RUN.ESYN lda #E.SYN
sec
CS.RUN.RTS rts
*--------------------------------------
CS.RUN.HOSTOK jsr CS.RUN.GETNEXTARG
bcc .10
.8 jmp CS.RUN.ARGSOK
.10 >STYA ZPPtr
lda (ZPPtr)
cmp #'-'
beq .1
>LDYA ZPPtr
>SYSCALL AToI
bcs CS.RUN.RTS
>STYA SA.REMOTE+S.SOCKADDR.PORT
jsr CS.RUN.GETNEXTARG
bcs .8
>STYA ZPPtr
lda (ZPPtr)
cmp #'-'
bne CS.RUN.ESYN
.1 ldy #1
lda (ZPPtr),y
cmp #'a'
bcc .11
cmp #'z'+1
bcs .11
eor #$20
.11 cmp #'U'
bne .2
bit bURI
bmi CS.RUN.ESYN
jsr CS.RUN.GETNEXTARG
.9 bcs CS.RUN.ESYN
>STYA ZPReqBufPtr
>SYSCALL StrLen
>STYA ZPReqBufLen
sec
ror bURI
bra CS.RUN.HOSTOK
.2 cmp #'F'
bne .3
bit bURI
bmi CS.RUN.ESYN
jsr CS.RUN.GETNEXTARG
bcs .9
>PUSHYA
>PUSHBI O.RDONLY
>PUSHBI S.FI.T.TXT
>PUSHWZ Aux type
>SYSCALL LoadTxtFile
bcs .9
>STYA ZPReqBufLen
stx hReqBuf
>SYSCALL GetMemPtr
>STYA ZPReqBufPtr
sec
ror bURI
jmp CS.RUN.HOSTOK
.3 cmp #'O'
bne .9
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .9
>STYA ZPFileName
jmp CS.RUN.HOSTOK
*--------------------------------------
CS.RUN.GETNEXTARG
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
rts
*--------------------------------------
CS.RUN.ARGSOK >PUSHW L.MSG.CONNECT
ldx #0
.1 >PUSHB SA.REMOTE+S.SOCKADDR.ADDR,x
inx
cpx #4
bne .1
>PUSHW SA.REMOTE+S.SOCKADDR.PORT
>PUSHW ZPHostPtr
>PUSHBI 8
>SYSCALL PrintF
CS.RUN.OPENSKT >PUSHBI 0 no protocol
lda #S.SOCKET.T.SEQPKT
>LIBCALL hLIBTCPIP,LIBTCPIP.Socket
bcs .9
sta hSocket
>PUSHW L.SA.LOCAL
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Bind
bcc .1
.9 pha
>LDYA L.MSG.SKTKO
>SYSCALL PutS
pla
sec
.99 rts
.1 jsr Init.TimeOut
.2 >SLEEP
>PUSHW L.SA.REMOTE
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Connect
bcc .3
cmp #ERR.SKT.NOCONN
bne .9
lda TimeOut
bne .2
lda #ERR.SKT.NOCONN
bra .9
.3 >LDYA L.MSG.CONNECTED
>SYSCALL PutS
>SLEEP
CS.RUN.GET jsr CS.RUN.ENCODE
bcs .99
jsr CS.RUN.REQUEST
bcs .99
>LDYA ZPFileName
beq .1
>PUSHYA
>PUSHBI O.CREATE+O.WRONLY+O.TRUNC
>PUSHBI 0 TYPE
>PUSHWI 0 AUXTYPE
>SYSCALL FOpen
bcs .9
sta hFile
.1 jsr CS.RUN.RESPONSE
bcs .99
.9 lda #0
sec
.99 rts
*--------------------------------------
CS.RUN.SKTERR pha
>PUSHW L.MSG.SKTERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.IOERR pha
>PUSHW L.MSG.IOERR
pla
pha
>PUSHA
>PUSHBI 1
>SYSCALL PrintF
pla
sec
rts
*--------------------------------------
CS.RUN.ENCODE >LDYA ZPReqBufPtr
>STYA ZPPtr
.10 lda (ZPPtr)
beq .4
inc ZPEncodedBufLen
bne .1
inc ZPEncodedBufLen+1
.1 inc ZPPtr
bne .11
inc ZPPtr+1
.11 jsr CS.RUN.TOENCODE
bcc .10
.3 lda ZPEncodedBufLen
clc
adc #2
sta ZPEncodedBufLen
bcc .10
inc ZPEncodedBufLen+1
bra .10
.4 >LDYA ZPEncodedBufLen
>SYSCALL GetMem
bcs .9
>STYA ZPEncodedBufPtr
>STYA ZPPtr
stx hEncodedBuf
.5 lda (ZPReqBufPtr)
beq .8
inc ZPReqBufPtr
bne .6
inc ZPReqBufPtr+1
.6 jsr CS.RUN.TOENCODE
bcc .7
jsr CS.RUN.ADDBYTETOBUF
bra .5
.7 jsr CS.RUN.ADDTOBUF
bra .5
.8 clc
.9 rts
*--------------------------------------
CS.RUN.TOENCODE ldx #URI.ToEncode.Cnt-1
.1 cmp URI.ToEncode,x
beq .9 CS
dex
bpl .1
clc
.9 rts
*--------------------------------------
CS.RUN.ADDBYTETOBUF
pha
lda #'%'
jsr CS.RUN.ADDTOBUF
pla
pha
lsr
lsr
lsr
lsr
ora #$30
cmp #$3A
bcc .1
adc #6
.1 jsr CS.RUN.ADDTOBUF
pla
and #$0F
ora #$30
cmp #$3A
bcc CS.RUN.ADDTOBUF
adc #6
*--------------------------------------
CS.RUN.ADDTOBUF sta (ZPPtr)
inc ZPPtr
bne .8
inc ZPPtr+1
.8 rts
*--------------------------------------
CS.RUN.REQUEST jsr Init.TimeOut
>LDYAI 1024
>SYSCALL GetMem
bcs .9
>STYA ZPSendBufPtr
stx hSendBuf
>PUSHYA
>PUSHW L.HTTP.GET
>PUSHW ZPEncodedBufPtr
>PUSHW ZPHostPtr
>PUSHBI 4
>SYSCALL SPrintF
bcs .90
>PUSHYA Byte count
>PUSHW ZPSendBufPtr
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Send
.90 php
pha
lda hSendBuf
>SYSCALL FreeMem
pla
plp
.9 rts
*--------------------------------------
CS.RUN.RESPONSE jsr Init.TimeOut
.1 >SLEEP
lda hSocket
>LIBCALL hLIBTCPIP,LIBTCPIP.Recv
bcc .2
cmp #E.NODATA
beq .1
bne .8
lda TimeOut
bne .1
bra .80
.2 jsr CS.RUN.GETRESPONSE
lda #"!"
>SYSCALL putchar
.3 bit bResponse
bmi .6
.30 ldx #0
.4 dex
lda (ZPRespBufPtr)
inc ZPRespBufPtr
bne .5
inc ZPRespBufPtr+1
.5 cmp #C.LF
bne .4
txa
* sec
adc ZPRespBufLen
sta ZPRespBufLen
lda ZPRespBufLen+1
adc #$ff
sta ZPRespBufLen+1
inx
inx
bne .30
sec
ror bResponse
.6 >PUSHW ZPRespBufLen
>PUSHW ZPRespBufPtr
lda hFile
bne .7
ldy #S.PS.hStdOut
lda (pPS),y
.7 >SYSCALL FWrite
bcs .9
lda hRespBuf
stz hRespBuf
>SYSCALL FreeMem
jmp CS.RUN.RESPONSE
.8 cmp #MLI.E.IO SKT Close ?
bne .9
.80 lda bResponse
bpl .99
.81 clc
rts
.99 lda #MLI.E.IO
sec
.9 rts
*--------------------------------------
CS.RUN.GETRESPONSE
sta hRespBuf
>SYSCALL GetMemPtr
>STYA ZPRespBufPtr
ldy #S.IP.TOTAL.LENGTH+1
lda (ZPRespBufPtr),y
sec
sbc #S.TCP-S.IP
sta ZPRespBufLen
dey
lda (ZPRespBufPtr),y
sbc /S.TCP-S.IP
sta ZPRespBufLen+1
lda ZPRespBufPtr
clc
adc #S.TCP
sta ZPRespBufPtr
bcc .8
inc ZPRespBufPtr+1
.8 rts
*--------------------------------------
CS.DOEVENT lda (pEvent)
bpl .9 is it a TIMER event?
lda TimeOut
beq .9
dec TimeOut
.9 sec do not discard TIMER event
rts
*--------------------------------------
CS.QUIT lda hSocket
beq .1
>LIBCALL hLIBTCPIP,LIBTCPIP.Shutdown
.1 lda hReqBuf
beq .2
>SYSCALL FreeMem
.2 lda hEncodedBuf
beq .3
>SYSCALL FreeMem
.3 lda hRespBuf
beq .4
>SYSCALL FreeMem
.4 lda hFile
beq .5
>SYSCALL FClose
.5 lda hLIBTCPIP
beq .8
>SYSCALL UnloadLib
.8 clc
rts
*--------------------------------------
Init.TimeOut lda #TIMEOUT.MAX
sta TimeOut
rts
*--------------------------------------
CS.END
LIBTCPIP .AZ "libtcpip"
hLIBTCPIP .BS 1
MSG.IPKO .AZ "TCP/IP Not Loaded/Configured."
MSG.USAGE .AS "Usage : HTTPGET <ip|host> [port]\r\n"
.AS " -U Url\r\n"
.AS " -F UrlFile\r\n"
.AZ " -O OutputFile\r\n"
MSG.UNKNOWN .AZ "%s: Unknown host\r\n"
MSG.CONNECT .AZ "Connecting to %d.%d.%d.%d:%D (%s)..."
MSG.SKTKO .AZ "Failed to Open Socket."
MSG.CONNECTED .AZ "Connected."
MSG.SKTERR .AZ "Socket Error : $%h\r\n"
MSG.IOERR .AZ "I/O Error : $%h\r\n"
*--------------------------------------
SA.LOCAL .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.BS 2 S.SOCKADDR.PORT
*--------------------------------------
SA.REMOTE .DA #AF.INET S.SOCKADDR.AF
.BS 1
.BS 4 S.SOCKADDR.ADDR
.DA TCP.PORT.HTTP
*--------------------------------------
URI.ToEncode .DA #C.LF,#C.CR,#C.SPACE,#'"'
.AS "%-.\^_`{|}~"
URI.ToEncode.Cnt .EQ *-URI.ToEncode
*--------------------------------------
HTTP.GET .AS "GET /%s HTTP/1.1"
.DA #C.CR,#C.LF
.AS "User-Agent: A2osX.HTTPGET"
.DA #C.CR,#C.LF
.AS "Host: %s"
.DA #C.CR,#C.LF
.AS "Connection: close"
.DA #C.CR,#C.LF
.DA #C.CR,#C.LF
.DA #0
*--------------------------------------
.DUMMY
.OR 0
DS.START
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/httpget.s
ASM