⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 https.asm

📁 Application sources:A084.ZIP
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;                                                      ;
;    Tiny HTTP Server v 0.4 for MenuetOS               ;
;                                                      ;
;    License GPL / See file COPYING for details.       ;
;    Copyright 2003 Ville Turjanmaa                    ;
;                                                      ;
;    Compile with FASM for Menuet                      ;
;                                                      ;
;    Request /TinyStat for server statistics           ;
;    Request /TinyBoard for server message board       ;
;                                                      ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

version  equ  '0.4'

use32

                org     0x0

                db      'MENUET01'              ; 8 byte id
                dd      0x01                    ; required os
                dd      START                   ; program start
                dd      I_END                   ; program image size
                dd      0x400000                ; required amount of memory
                dd      0x1ffff
                dd      0,0                     ; reserved=no extended header

; 0x0+       - program image
; 0x1ffff    - stack
; 0x20000+   - message board
; 0x100000+  - requested file

filel:
   dd   0x0,0x0,50000/512,0x20000,0x70000
   db   '/rd/1/board.htm',0

files:
   dd   0x1,0x0,0x0,0x20000,0x70000
   db   '/rd/1/board.htm',0



START:                          ; start of execution

    mov  eax,58
    mov  ebx,filel
    int  0x40
    mov  [board_size],ebx
    cmp  eax,0
    je   board_found

    mov  [board_size],board_end-board
    mov  esi,board
    mov  edi,0x20000
    mov  ecx,[board_size]
    cld
    rep  movsb

   board_found:

    mov  eax,58
    mov  ebx,files
    mov  ecx,[board_size]
    mov  [files+8],ecx
    int  0x40

    mov  [status],-1
    mov  [last_status],-2
    call clear_input
    call draw_window            ; at first, draw the window

;    call ops

still:

    call check_status
    cmp  [status],4
    je   start_transmission

    cmp  [status],0
    jne  nnn
    cmp  [server_active],1
    jne  nnn
    call ops
   nnn:

    mov  eax,5
    mov  ebx,1
    int  0x40

    mov  eax,11
    int  0x40
    call check_events

    jmp  still


 reb:  ; boot

    mov  eax,18
    mov  ebx,1
    int  0x40

    jmp  $


last_status   dd   0x0

check_events:

    cmp  eax,1                  ; redraw request ?
    jz   red
    cmp  eax,2                  ; key in buffer ?
    jz   key
    cmp  eax,3                  ; button in buffer ?
    jz   button

    ret

red:                           ; redraw
    call draw_window
    ret

key:                           ; Keys are not valid at this part of the
    mov  eax,2                 ; loop. Just read it and ignore
    int  0x40
    ret

button:                         ; button

    mov  eax,17                 ; get id
    int  0x40

    cmp  ah,1                   ; close
    jnz  tst2
    mov  eax,53
    mov  ebx,8
    mov  ecx,[socket]
    int  0x40
    mov  eax,-1
    int  0x40
  tst2:

    cmp  ah,2                   ; button id=2 ?
    jnz  tst3
    ; open socket
  ops:
    mov  eax,53
    mov  ebx,5
    mov  ecx,80     ; local port # - http
    mov  edx,0      ; no remote port specified
    mov  esi,0      ; no remote ip specified
    mov  edi,0      ; PASSIVE open
    int  0x40
    mov  [socket], eax
    mov  [posy],1
    mov  [posx],0
    call check_for_incoming_data
    call clear_input
    call draw_data
    mov  [server_active],1
    call check_status
;    cmp  [status],0
;    je   reb
    ret
  tst3:

    cmp  ah,4                   ; button id=4 ?
    jnz  no4
    mov  [server_active],0
  close_socket:
    mov  eax,53
    mov  ebx,8
    mov  ecx,[socket]
    int  0x40
    mov  eax,5
    mov  ebx,2
    int  0x40
    mov  eax,53
    mov  ebx,8
    mov  ecx,[socket]
    int  0x40

    cmp  [server_active],1
    jne  no_re_open
    mov  eax,53
    mov  ebx,5
    mov  ecx,80     ; local port # - http
    mov  edx,0      ; no remote port specified
    mov  esi,0      ; no remote ip specified
    mov  edi,0      ; PASSIVE open
    int  0x40
    mov  [socket], eax
  no_re_open:

    mov  edi,input_text+256*15+1
    mov  [edi+2],dword ':  :'
    call set_time
    mov  edi,input_text+256*16+1
    mov  [edi+2],dword '.  .'
    call set_date

    mov  eax,[documents_served]
    mov  ecx,9
    mov  edi,input_text+256*15+12
    call set_value

    mov  eax,[bytes_transferred]
    mov  ecx,9
    mov  edi,input_text+256*16+12
    call set_value

    call draw_data

    mov  esp,0x1ffff
    jmp  still
  no4:

    cmp  ah,6                   ; read directory
    je   read_string

    ret


clear_input:

    mov  edi,input_text
    mov  eax,0
    mov  ecx,256*30
    cld
    rep  stosb

    ret


retries  dd 50

start_transmission:

    mov  [posy],1
    mov  [posx],0
    call clear_input
    mov  [retries],50

  wait_for_data:
    call check_for_incoming_data
    cmp  [input_text+256+1],dword 'GET '
    je   data_received
    cmp  [input_text+256+1],dword 'POST'
    je   data_received
    mov  eax,5
    mov  ebx,1
    int  0x40
    dec  [retries]
    jnz  wait_for_data
    jmp  no_http_request
  data_received:

    mov  eax,0x100000
    mov  ebx,0x2f0000 / 512
    call read_file

    call wait_for_empty_slot
    call send_header

    mov  [filepos],0x100000
    mov  [fileadd],700

    call check_status
    call draw_data

  newblock:

    call wait_for_empty_slot

    mov  edx,[fileadd]
    cmp  edx,[file_left]
    jbe  file_size_ok
    mov  edx,[file_left]
  file_size_ok:
    sub  [file_left],edx

    ; write to socket
    mov  eax,53
    mov  ebx,7
    mov  ecx,[socket]
    mov  esi,[filepos]
    int  0x40

    mov  eax,esi
    add  eax,edx
    sub  eax,0x100000
    call display_progress

    mov  edx,[fileadd]
    add  [filepos],edx

    cmp  [file_left],0
    jg   newblock

  no_http_request:

    jmp  close_socket


filepos   dd  0x100000
fileadd   dd  0x1
filesize  dd  0x0
file_left dd  0x0


wait_for_empty_slot:

    pusha

  wait_more:

;    rdtsc
;    mov  ecx,eax
;    add  ecx,1000000
;   wr:
;    rdtsc
;    cmp  eax,ecx
;    jb   wr

    mov  eax,5
    mov  ebx,1
    int  0x40

    mov  eax,11
    int  0x40
    call check_events

    mov  eax,53
    mov  ebx,255
    mov  ecx,103
    int  0x40

    cmp  eax,0
    je   no_wait_more

    jmp  wait_more

  no_wait_more:

    popa
    ret




display_progress:

  pusha

  mov  edi,eax

  mov  eax,13
  mov  ebx,115*65536+8*6
  mov  ecx,178*65536+10
  mov  edx,0xffffff
  int  0x40

  mov  eax,47
  mov  ebx,8*65536
  mov  ecx,edi
  mov  edx,115*65536+178
  mov  esi,0x000000
  int  0x40

  popa
  ret


send_header:

    pusha

    mov   eax,53                  ; send response and file length
    mov   ebx,7
    mov   ecx,[socket]
    mov   edx,h_len-html_header
    mov   esi,html_header
    int   0x40

    mov   eax,53                  ; send file type
    mov   ebx,7
    mov   ecx,[socket]
    mov   edx,[type_len]
    mov   esi,[file_type]
    int   0x40

    popa
    ret


fileinfo     dd  0,0,1,0x100000,0xf0000
getf         db  '/RD/1/'
             times 50 db 0
wanted_file: times 100 db 0

getflen      dd  6

make_room:

   pusha

   mov  edx,ecx

   mov  esi,0x20000
   add  esi,[board_size]
   mov  edi,esi
   add  edi,edx
   mov  ecx,[board_size]
   sub  ecx,board1-board
   inc  ecx
   std
   rep  movsb
   cld

   popa
   ret


from_i  dd  0x0
from_len dd 0x0

message dd 0x0
message_len dd 0x0

read_file:                          ; start of execution

    mov  [fileinfo+12],eax
    mov  [fileinfo+8],ebx

    mov  [file_type],unk
    mov  [type_len],unkl-unk
    mov  [filename+40*2+6],dword 'UNK '

    cmp  [input_text+256+1],dword 'POST'
    je   yes_new_message

    cmp  [input_text+256+11],dword 'oard'     ; server board message
    jne  no_server_message_2

  yes_new_message:

    mov  eax,58
    mov  ebx,filel
    int  0x40
    mov  [board_size],ebx

    cmp  [input_text+256+1],dword 'POST'
    jne  no_new_message

    mov  edi,bsmt
    call set_time
    mov  edi,bsmd
    call set_date

    call check_for_incoming_data

    mov  esi,input_text+256   ; from
   newfroms:
    inc  esi
    cmp  esi,input_text+256*20
    je   no_server_message_2
    cmp  [esi],dword 'from'
    jne  newfroms

    add  esi,5
    mov  [from_i],esi

    mov  edx,0
   name_new_len:
    cmp  [esi+edx],byte 13
    je   name_found_len
    cmp  [esi+edx],byte '&'
    je   name_found_len
    cmp  edx,1000
    je   name_found_len
    inc  edx
    jmp  name_new_len
   name_found_len:

    mov  [from_len],edx

    mov  esi,input_text+256
   newmessages:
    inc  esi
    cmp  esi,input_text+256*20
    je   no_server_message_2
    cmp  [esi],dword 'sage'
    jne  newmessages

    add  esi,5
    mov  [message],esi

    mov  edx,0
   new_len:
    inc  edx
    cmp  [esi+edx],byte ' '
    je   found_len
    cmp  [esi+edx],byte 13
    jbe  found_len
    cmp  edx,input_text+5000
    je   found_len
    jmp  new_len
   found_len:
    mov  [message_len],edx


    mov  edx,0

   change_letters:

    cmp  [esi+edx],byte '+'
    jne  no_space
    mov  [esi+edx],byte ' '
   no_space:

    cmp  [esi+edx+1],word '0D'
    jne  no_br
    mov  [esi+edx],dword '<br>'
    mov  [esi+edx+4],word '  '
  no_br:

    cmp  [esi+edx],byte '%'
    jne  no_ascii
    movzx eax,byte [esi+edx+2]
    sub  eax,48
    cmp  eax,9
    jbe  eax_ok
    sub  eax,7
   eax_ok:
    movzx ebx,byte [esi+edx+1]
    sub  ebx,48
    cmp  ebx,9
    jbe  ebx_ok
    sub  ebx,7
   ebx_ok:
    imul ebx,16
    add  ebx,eax
    mov  [esi+edx],bl
    mov  [esi+edx+1],word '  '
    add  edx,2
   no_ascii:

    inc  edx
    cmp  edx,[message_len]
    jbe  change_letters


    mov  edx,board1e-board1 + board2e-board2 + board3e-board3
    add  edx,[from_len]
    add  edx,[message_len]

    add  [board_size],edx

    mov  ecx,edx
    call make_room


    mov  esi,board1          ; first part
    mov  edi,0x20000
    add  edi,board1-board
    mov  ecx,edx
    cld
    rep  movsb

    mov  esi,[from_i]          ; name
    mov  edi,0x20000
    add  edi,board1-board + board1e-board1
    mov  ecx,[from_len]
    cld
    rep  movsb

    mov  esi,board2          ; middle part
    mov  edi,0x20000
    add  edi,board1-board + board1e-board1
    add  edi,[from_len]
    mov  ecx,board2e-board2
    cld
    rep  movsb

    mov  esi,[message]       ; message
    mov  edi,0x20000
    add  edi,board1-board + board1e-board1 +board2e-board2
    add  edi,[from_len]
    mov  ecx,[message_len]
    cld
    rep  movsb

    mov  esi,board3    ; end part
    mov  edi,0x20000
    add  edi,board1-board + board1e-board1 +board2e-board2
    add  edi,[from_len]
    add  edi,[message_len]
    mov  ecx,board3e-board3
    cld
    rep  movsb

    inc  [board_messages]

    mov  eax,[board_size]
    mov  [files+8],eax

    mov  eax,58
    mov  ebx,files
    int  0x40

  no_new_message:
    mov  esi,0x20000
    mov  edi,0x100000
    mov  ecx,[board_size]
    cld
    rep  movsb
    mov  ebx,[board_size]

    mov  [file_type],htm
    mov  [type_len],html-htm
    mov  [filename+40*2+6],dword 'HTM '

    jmp  file_loaded
  no_server_message_2:

    cmp  [input_text+256+9],dword 'ySta'     ; server message
    jne  no_server_message_1
    mov  edi,smt
    call set_time
    mov  edi,smd
    call set_date
    mov  eax,[documents_served]
    mov  ecx,9
    mov  edi,sms+21
    call set_value
    mov  eax,[bytes_transferred]
    mov  ecx,9
    mov  edi,smb+21
    call set_value
    mov  eax,[board_messages]
    mov  ecx,9
    mov  edi,smm+21
    call set_value
    mov  eax,[board_size]
    mov  ecx,9
    mov  edi,smz+21
    call set_value
    mov  esi,sm
    mov  edi,0x100000
    mov  ecx,sme-sm
    cld
    rep  movsb
    mov  ebx,sme-sm

    mov  [file_type],htm
    mov  [type_len],html-htm
    mov  [filename+40*2+6],dword 'HTM '

    jmp  file_loaded
  no_server_message_1:

    mov  esi,input_text+256+6
    cmp  [input_text+256+1],dword 'GET '
    jne  no_new_let
    mov  edi,wanted_file
    cld
  new_let:
    cmp  [esi],byte ' '
    je   no_new_let
    cmp  edi,wanted_file+30
    jge  no_new_let
    movsb
    jmp  new_let
  no_new_let:
    mov  [edi+0],dword 0
    mov  [edi+4],dword 0
    mov  [edi+8],dword 0

    cmp  esi,input_text+256+6
    jne  no_index
    mov  edi,wanted_file
    mov  [edi+0],dword  'inde'
    mov  [edi+4],dword  'x.ht'
    mov  [edi+8],byte   'm'
    mov  [edi+9],byte   0
    add  edi,9

    mov  [file_type],htm
    mov  [type_len],html-htm
    mov  [filename+40*2+6],dword 'HTM '

    jmp  html_file

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -