git-svn-id: http://svn.code.sf.net/p/netboot65/code@204 93682198-c243-4bdb-bd91-e943c89aac3b

This commit is contained in:
jonnosan 2009-10-18 10:37:03 +00:00
parent 274532bae0
commit fcce859d2d
4 changed files with 185 additions and 37 deletions

View File

@ -89,9 +89,6 @@
.import __SELF_MODIFIED_CODE_LOAD__
.import __SELF_MODIFIED_CODE_RUN__
.import __SELF_MODIFIED_CODE_SIZE__
.import __HTTP_VARS_LOAD__
.import __HTTP_VARS_RUN__
.import __HTTP_VARS_SIZE__
.import cfg_tftp_server
kipper_param_buffer = $6000
@ -162,14 +159,6 @@ warm_init:
stax copy_dest
ldax #__SELF_MODIFIED_CODE_SIZE__
jsr copymem
;relocate the self-modifying code (if necessary)
ldax #__HTTP_VARS_LOAD__
stax copy_src
ldax #__HTTP_VARS_RUN__
stax copy_dest
ldax #__HTTP_VARS_SIZE__
jsr copymem
ldax #netboot65_msg
jsr print

View File

@ -13,6 +13,7 @@
.export http_parse_request
.export http_get_value
.export http_variables_buffer
.importzp copy_src
.importzp copy_dest
@ -21,12 +22,15 @@
string_ptr = copy_src
table_ptr=copy_dest
var_table=output_buffer
.bss
var_name: .res 1
hex_digit: .res 1
.data
http_variables_buffer: .word $2800 ;work area for storing variables extracted from query string
.code
@ -47,7 +51,7 @@ hex_digit: .res 1
http_parse_request:
stax string_ptr
ldax #var_table
ldax http_variables_buffer
stax table_ptr
@ -200,7 +204,7 @@ put_byte:
; if variable did not exist, carry flag will be set.
http_get_value:
sta var_name
ldax #var_table
ldax http_variables_buffer
stax string_ptr
ldy #0

View File

@ -29,17 +29,32 @@ HTTPD_TIMEOUT_SECONDS=5 ;what's the maximum time we let 1 connection be open for
.import tcp_send_data_len
.import tcp_send
.import tcp_close
.import io_read_catalogue
.import native_to_ascii
.import io_read_file_with_callback
.import io_filename
.import io_callback
.import __HTTP_VARS_LOAD__
.import __HTTP_VARS_RUN__
.import __HTTP_VARS_SIZE__
temp_ptr =copy_src
.segment "HTTP_VARS"
tcp_buffer_ptr: .res 2
httpd_buffer: .word $2000 ;by default, use a buffer at $2000 for storing inbound requests.
httpd_port_number: .word 80
connection_timeout_seconds: .byte 0
.bss
found_eol: .byte 0
connection_closed: .byte 0
output_buffer_length: .res 2
sent_header: .res 1
connection_timeout_seconds: .byte 0
tcp_buffer_ptr: .res 2
buffer_size: .res 1
.segment "HTTP_VARS"
httpd_io_buffer: .word $2000 ;by default, use a 2k buffer at $2000 for storing inbound requests.
httpd_scratch_buffer: .word $2B00 ;by default, use a 1k buffer at $2b00 as a scratchpad
httpd_port_number: .word 80
jump_to_callback:
jmp $ffff
@ -80,16 +95,33 @@ emit_a:
;outputs:
; none
httpd_start:
pha ;save AX while we relocate self modifying code
txa
pha
;relocate the self-modifying code
ldax #__HTTP_VARS_LOAD__
stax copy_src
ldax #__HTTP_VARS_RUN__
stax copy_dest
ldax #__HTTP_VARS_SIZE__
jsr copymem
pla
tax
pla
stx jump_to_callback+2
bne @not_default_handler
ldax #default_httpd_handler
jmp httpd_start
@not_default_handler:
sta jump_to_callback+1
@listen:
jsr tcp_close
ldax httpd_buffer
ldax httpd_io_buffer
stax tcp_buffer_ptr
ldax #http_callback
stax tcp_callback
@ -135,7 +167,7 @@ httpd_start:
jmp @listen
@got_eol:
ldax httpd_buffer
ldax httpd_io_buffer
jsr http_parse_request
jsr jump_to_callback ;call the handler to generate the response for this request.
;AX should now point at data to be sent
@ -181,7 +213,7 @@ http_callback:
;look for CR or LF in input
sta found_eol
ldax httpd_buffer
ldax httpd_io_buffer
stax get_next_byte+1
@look_for_eol:
@ -216,10 +248,117 @@ default_httpd_handler:
clc
rts
@not_index:
;assume that 'path' is a filename
inc temp_ptr
bne :+
inc temp_ptr
:
lda #0
sta sent_header
ldax temp_ptr
stax io_filename
ldax #send_file_callback
stax io_callback
ldax httpd_scratch_buffer
jsr io_read_file_with_callback
bcc @sent_ok
ldy #4
clc
clc
rts
@sent_ok:
sec
rts
send_file_callback:
sty buffer_size ;only 1 (the last) sector can ever be !=$100 bytes
lda sent_header
bne @sent_header
ldy #3 ;"application/octet-stream"
jsr send_header
inc sent_header
@sent_header:
ldax httpd_scratch_buffer
stax temp_ptr
ldy #0
@loop:
tya
pha
lda (temp_ptr),y
jsr emit_a
pla
tay
iny
cpy buffer_size
bne @loop
rts
reset_output_buffer:
ldax httpd_io_buffer
sta emit_a+1
stx emit_a+2
lda #0
sta output_buffer_length
sta output_buffer_length+1
rts
emit_disk_catalogue:
ldax httpd_scratch_buffer
jsr io_read_catalogue
lda get_next_byte+1
pha
lda get_next_byte+2
pha
ldax httpd_scratch_buffer
stax get_next_byte+1
@next_filename:
jsr get_next_byte
cmp #0
beq @done
pha
ldax #file_li_preamble
jsr emit_string
pla
pha
jsr emit_a
ldax get_next_byte+1
jsr emit_string
ldax #file_li_middle
jsr emit_string
pla
bne @convert_byte
@next_byte:
jsr get_next_byte
cmp #0
beq @done_this_filename
@convert_byte:
jsr native_to_ascii
jsr emit_a
jmp @next_byte
@done_this_filename:
ldax #file_li_postamble
jsr emit_string
jmp @next_filename
@done:
pla
sta get_next_byte+2
pla
sta get_next_byte+1
rts
send_response:
stax get_next_byte+1
jsr reset_output_buffer
@ -229,23 +368,30 @@ send_response:
jsr get_next_byte
cmp #0
beq send_buffer
cmp #'%'
beq @escape
@back_from_escape:
jsr emit_a
jmp @response_loop
reset_output_buffer:
ldax httpd_buffer
sta emit_a+1
stx emit_a+2
lda #0
sta output_buffer_length
sta output_buffer_length+1
rts
@escape:
jsr get_next_byte
cmp #0
beq send_buffer
cmp #'%'
beq @back_from_escape
cmp #'C'
bne :+
jsr emit_disk_catalogue
jmp @response_loop
:
;if we got here, it's an invalid escape code
jmp @response_loop
send_buffer:
ldax output_buffer_length
stax tcp_send_data_len
ldax httpd_buffer
ldax httpd_io_buffer
jsr tcp_send
jmp reset_output_buffer
@ -334,7 +480,7 @@ emit_string:
.rodata
default_html:
.byte "<h1>w00t!</h1><br>yadda yadda yadd!"
.byte "<h1>Index of /</h1><br><ul>%C</ul><p><i>kipper - the 100%% 6502 m/l web server </i>"
.byte 0
@ -368,3 +514,10 @@ end_of_header:
.byte "Connection: Close",CR,LF
.byte "Server: Kipper_httpd/0.c64",CR,LF
.byte CR,LF,0
file_li_preamble:
.byte "<li><a href=",'"',0
file_li_middle:
.byte '"',">",0
file_li_postamble:
.byte "</a></li>",0

View File

@ -63,9 +63,11 @@ test_ping.prg: test_ping.o $(IP65TCPLIB) $(C64PROGLIB) $(INCFILES) ../cfg/c64prg
$(LD) -C ../cfg/a2bin.cfg -o $*.pg2 $(AFLAGS) $< $(IP65LIB) $(APPLE2PROGLIB)
httpd_test.d64: test_httpd.prg
httpd_test.d64: test_httpd.prg index.html file1.html
cp test_httpd.prg autoexec.prg
ripxplore.rb --init CbmDos httpd_test.d64 -a autoexec.prg
ripxplore.rb httpd_test.d64 -a index.html -t C64Seq
ripxplore.rb httpd_test.d64 -a file1.html -t C64Seq
ip65test.dsk: testdns.pg2 testdottedquad.pg2 testtftp.pg2
ripxplore.rb --init BeautifulBoot ip65test.dsk -a testdns.pg2 -t AppleBinary