Subversion Repositories Kolibri OS

Rev

Rev 7296 | Rev 7969 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7296 Rev 7512
Line 1... Line 1...
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                                 ;;
2
;;                                                                 ;;
3
;; Copyright (C) KolibriOS team 2004-2017. All rights reserved.    ;;
3
;; Copyright (C) KolibriOS team 2004-2018. All rights reserved.    ;;
4
;; Distributed under terms of the GNU General Public License       ;;
4
;; Distributed under terms of the GNU General Public License       ;;
5
;;                                                                 ;;
5
;;                                                                 ;;
6
;;  HTTP library for KolibriOS                                     ;;
6
;;  HTTP library for KolibriOS                                     ;;
7
;;                                                                 ;;
7
;;                                                                 ;;
8
;;   Written by hidnplayr@kolibrios.org                            ;;
8
;;   Written by hidnplayr@kolibrios.org                            ;;
Line 17... Line 17...
17
; "HTTP made really easy", http://www.jmarshall.com/easy/http/
17
; "HTTP made really easy", http://www.jmarshall.com/easy/http/
18
; "Hypertext Transfer Protocol -- HTTP/1.1", http://tools.ietf.org/html/rfc2616
18
; "Hypertext Transfer Protocol -- HTTP/1.1", http://tools.ietf.org/html/rfc2616
Line 19... Line 19...
19
 
19
 
20
 
20
 
21
        URLMAXLEN       = 65535
21
        URLMAXLEN       = 65535
Line 22... Line 22...
22
        BUFFERSIZE      = 8192
22
        BUFFERSIZE      = 512*1024
23
        TIMEOUT         = 500  ; in 1/100 s
23
        TIMEOUT         = 500  ; in 1/100 s
Line 62... Line 62...
62
        lea     esi, [eax + http_msg.http_header]
62
        lea     esi, [eax + http_msg.http_header]
63
        push    flags
63
        push    flags
64
        pop     [eax + http_msg.flags]
64
        pop     [eax + http_msg.flags]
65
        or      [eax + http_msg.flags], FLAG_CONNECTED
65
        or      [eax + http_msg.flags], FLAG_CONNECTED
66
        mov     [eax + http_msg.write_ptr], esi
66
        mov     [eax + http_msg.write_ptr], esi
-
 
67
 
-
 
68
        mov     ebx, [buffersize]
-
 
69
        sub     ebx, http_msg.http_header
67
        mov     [eax + http_msg.buffer_length], BUFFERSIZE -  http_msg.http_header
70
        mov     [eax + http_msg.buffer_length], ebx
68
        mov     [eax + http_msg.chunk_ptr], 0
71
        mov     [eax + http_msg.chunk_ptr], 0
Line 69... Line 72...
69
 
72
 
70
        mov     [eax + http_msg.status], 0
73
        mov     [eax + http_msg.status], 0
71
        mov     [eax + http_msg.header_length], 0
74
        mov     [eax + http_msg.header_length], 0
Line 122... Line 125...
122
        inc     eax
125
        inc     eax
123
        ret
126
        ret
Line 124... Line 127...
124
 
127
 
-
 
128
 
-
 
129
;;================================================================================================;;
-
 
130
proc HTTP_buffersize_get ;////////////////////////////////////////////////////////////////////////;;
-
 
131
;;------------------------------------------------------------------------------------------------;;
-
 
132
;? Get HTTP buffer size                                                                           ;;
-
 
133
;;------------------------------------------------------------------------------------------------;;
-
 
134
;< eax = buffer size in bytes                                                                     ;;
-
 
135
;;================================================================================================;;
-
 
136
 
-
 
137
        mov     eax, [BUFFERSIZE]
-
 
138
        ret
-
 
139
 
-
 
140
endp
-
 
141
 
-
 
142
;;================================================================================================;;
-
 
143
proc HTTP_buffersize_set ;////////////////////////////////////////////////////////////////////////;;
-
 
144
;;------------------------------------------------------------------------------------------------;;
-
 
145
;? Set HTTP buffer size                                                                           ;;
-
 
146
;;------------------------------------------------------------------------------------------------;;
-
 
147
;> eax = buffer size in bytes                                                                     ;;
-
 
148
;;================================================================================================;;
-
 
149
 
-
 
150
        mov     [BUFFERSIZE], eax
-
 
151
        ret
-
 
152
 
-
 
153
endp
-
 
154
 
125
 
155
 
126
;;================================================================================================;;
156
;;================================================================================================;;
127
proc HTTP_disconnect identifier ;/////////////////////////////////////////////////////////////////;;
157
proc HTTP_disconnect identifier ;/////////////////////////////////////////////////////////////////;;
128
;;------------------------------------------------------------------------------------------------;;
158
;;------------------------------------------------------------------------------------------------;;
129
;? Stops the open connection                                                                      ;;
159
;? Stops the open connection                                                                      ;;
Line 228... Line 258...
228
        jz      .error
258
        jz      .error
229
        mov     [socketnum], eax
259
        mov     [socketnum], eax
Line 230... Line 260...
230
 
260
 
231
; Create the HTTP request.
261
; Create the HTTP request.
232
  .send_request:
262
  .send_request:
233
        invoke  mem.alloc, BUFFERSIZE
263
        invoke  mem.alloc, [buffersize]
234
        test    eax, eax
264
        test    eax, eax
235
        jz      .error
265
        jz      .error
236
        mov     [buffer], eax
266
        mov     [buffer], eax
237
        mov     edi, eax
267
        mov     edi, eax
Line 367... Line 397...
367
        jz      .error
397
        jz      .error
368
        mov     [socketnum], eax
398
        mov     [socketnum], eax
Line 369... Line 399...
369
 
399
 
370
; Create the HTTP request.
400
; Create the HTTP request.
371
  .send_request:
401
  .send_request:
372
        invoke  mem.alloc, BUFFERSIZE
402
        invoke  mem.alloc, [buffersize]
373
        test    eax, eax
403
        test    eax, eax
374
        jz      .error
404
        jz      .error
375
        mov     [buffer], eax
405
        mov     [buffer], eax
376
        mov     edi, eax
406
        mov     edi, eax
Line 510... Line 540...
510
        jz      .error
540
        jz      .error
511
        mov     [socketnum], eax
541
        mov     [socketnum], eax
Line 512... Line 542...
512
 
542
 
513
; Create the HTTP request.
543
; Create the HTTP request.
514
  .send_request:
544
  .send_request:
515
        invoke  mem.alloc, BUFFERSIZE
545
        invoke  mem.alloc, [buffersize]
516
        test    eax, eax
546
        test    eax, eax
517
        jz      .error
547
        jz      .error
518
        mov     [buffer], eax
548
        mov     [buffer], eax
519
        mov     edi, eax
549
        mov     edi, eax
Line 644... Line 674...
644
        test    [ebp + http_msg.flags], FLAG_REUSE_BUFFER
674
        test    [ebp + http_msg.flags], FLAG_REUSE_BUFFER
645
        jz      .new_buffer
675
        jz      .new_buffer
Line 646... Line 676...
646
 
676
 
647
        mov     eax, [ebp + http_msg.content_ptr]
677
        mov     eax, [ebp + http_msg.content_ptr]
-
 
678
        mov     [ebp + http_msg.write_ptr], eax
648
        mov     [ebp + http_msg.write_ptr], eax
679
        push    [buffersize]
649
        mov     [ebp + http_msg.buffer_length], BUFFERSIZE
680
        pop     [ebp + http_msg.buffer_length]
Line 650... Line 681...
650
        jmp     .receive
681
        jmp     .receive
651
 
682
 
652
  .new_buffer:
683
  .new_buffer:
653
        invoke  mem.alloc, BUFFERSIZE
684
        invoke  mem.alloc, [buffersize]
654
        test    eax, eax
685
        test    eax, eax
655
        jz      .err_no_ram
686
        jz      .err_no_ram
-
 
687
        mov     [ebp + http_msg.content_ptr], eax
656
        mov     [ebp + http_msg.content_ptr], eax
688
        mov     [ebp + http_msg.write_ptr], eax
657
        mov     [ebp + http_msg.write_ptr], eax
689
        push    [buffersize]
Line 658... Line 690...
658
        mov     [ebp + http_msg.buffer_length], BUFFERSIZE
690
        pop     [ebp + http_msg.buffer_length]
659
        DEBUGF  1, "New buffer: 0x%x\n", eax
691
        DEBUGF  1, "New buffer: 0x%x\n", eax
660
 
692
 
Line 849... Line 881...
849
        stdcall HTTP_find_header_field, ebp, str_te
881
        stdcall HTTP_find_header_field, ebp, str_te
850
        test    eax, eax
882
        test    eax, eax
851
        jnz     .ct_hdr_found
883
        jnz     .ct_hdr_found
Line 852... Line 884...
852
 
884
 
853
  .not_chunked:
885
  .not_chunked:
854
        mov     edx, BUFFERSIZE
886
        mov     edx, [buffersize]
855
        call    alloc_contentbuff
887
        call    alloc_contentbuff
856
        test    eax, eax
888
        test    eax, eax
857
        jz      .err_no_ram
889
        jz      .err_no_ram
858
        xor     eax, eax
890
        xor     eax, eax
Line 870... Line 902...
870
        jne     .not_chunked
902
        jne     .not_chunked
Line 871... Line 903...
871
 
903
 
872
        or      [ebp + http_msg.flags], FLAG_CHUNKED
904
        or      [ebp + http_msg.flags], FLAG_CHUNKED
Line 873... Line 905...
873
        DEBUGF  1, "Transfer type is: chunked\n"
905
        DEBUGF  1, "Transfer type is: chunked\n"
874
 
906
 
875
        mov     edx, BUFFERSIZE
907
        mov     edx, [buffersize]
876
        call    alloc_contentbuff
908
        call    alloc_contentbuff
Line 877... Line 909...
877
        test    eax, eax
909
        test    eax, eax
Line 954... Line 986...
954
; Calculate new write ptr
986
; Calculate new write ptr
955
        sub     [ebp + http_msg.write_ptr], edx
987
        sub     [ebp + http_msg.write_ptr], edx
956
        test    [ebp + http_msg.flags], FLAG_STREAM
988
        test    [ebp + http_msg.flags], FLAG_STREAM
957
        jnz     .dont_resize
989
        jnz     .dont_resize
958
; Realloc buffer, make it 'chunksize' bigger.
990
; Realloc buffer, make it 'chunksize' bigger.
-
 
991
        mov     edx, ebx
959
        lea     edx, [ebx + BUFFERSIZE]
992
        add     edx, [buffersize]
960
        mov     [ebp + http_msg.buffer_length], edx     ; remaining space in new buffer
993
        mov     [ebp + http_msg.buffer_length], edx     ; remaining space in new buffer
961
        add     edx, [ebp + http_msg.write_ptr]
994
        add     edx, [ebp + http_msg.write_ptr]
962
        sub     edx, [ebp + http_msg.content_ptr]
995
        sub     edx, [ebp + http_msg.content_ptr]
963
        DEBUGF  1, "Resizing buffer 0x%x, it will now be %u bytes\n", [ebp + http_msg.content_ptr], edx
996
        DEBUGF  1, "Resizing buffer 0x%x, it will now be %u bytes\n", [ebp + http_msg.content_ptr], edx
964
        invoke  mem.realloc, [ebp + http_msg.content_ptr], edx
997
        invoke  mem.realloc, [ebp + http_msg.content_ptr], edx
Line 1004... Line 1037...
1004
 
1037
 
1005
  .buffer_full:
1038
  .buffer_full:
1006
        test    [ebp + http_msg.flags], FLAG_STREAM
1039
        test    [ebp + http_msg.flags], FLAG_STREAM
1007
        jnz     .multibuff
1040
        jnz     .multibuff
1008
        mov     eax, [ebp + http_msg.write_ptr]
1041
        mov     eax, [ebp + http_msg.write_ptr]
1009
        add     eax, BUFFERSIZE
1042
        add     eax, [buffersize]
1010
        sub     eax, [ebp + http_msg.content_ptr]
1043
        sub     eax, [ebp + http_msg.content_ptr]
1011
        invoke  mem.realloc, [ebp + http_msg.content_ptr], eax
1044
        invoke  mem.realloc, [ebp + http_msg.content_ptr], eax
1012
        or      eax, eax
1045
        or      eax, eax
1013
        jz      .err_no_ram
1046
        jz      .err_no_ram
-
 
1047
        call    recalculate_pointers
1014
        call    recalculate_pointers
1048
        push    [buffersize]
1015
        mov     [ebp + http_msg.buffer_length], BUFFERSIZE
1049
        pop     [ebp + http_msg.buffer_length]
1016
        ; Need more data
1050
        ; Need more data
1017
        popa
1051
        popa
1018
        xor     eax, eax
1052
        xor     eax, eax
1019
        dec     eax
1053
        dec     eax
Line 1122... Line 1156...
1122
 
1156
 
Line 1123... Line 1157...
1123
alloc_contentbuff:
1157
alloc_contentbuff:
1124
 
1158
 
1125
        test    [ebp + http_msg.flags], FLAG_STREAM
1159
        test    [ebp + http_msg.flags], FLAG_STREAM
1126
        jz      @f
1160
        jz      @f
Line 1127... Line 1161...
1127
        mov     edx, BUFFERSIZE
1161
        mov     edx, [buffersize]
1128
  @@:
1162
  @@:
1129
 
1163
 
Line 1878... Line 1912...
1878
align 4
1912
align 4
1879
@EXPORT:
1913
@EXPORT:
1880
export  \
1914
export  \
1881
        lib_init                , 'lib_init'            , \
1915
        lib_init                , 'lib_init'            , \
1882
        0x00010001              , 'version'             , \
1916
        0x00010001              , 'version'             , \
-
 
1917
        HTTP_buffersize_get     , 'buffersize_get'      , \
-
 
1918
        HTTP_buffersize_set     , 'buffersize_set'      , \
1883
        HTTP_get                , 'get'                 , \
1919
        HTTP_get                , 'get'                 , \
1884
        HTTP_head               , 'head'                , \
1920
        HTTP_head               , 'head'                , \
1885
        HTTP_post               , 'post'                , \
1921
        HTTP_post               , 'post'                , \
1886
        HTTP_find_header_field  , 'find_header_field'   , \
1922
        HTTP_find_header_field  , 'find_header_field'   , \
1887
        HTTP_process            , 'process'             , \    ; To be removed
1923
        HTTP_process            , 'process'             , \    ; To be removed
Line 1946... Line 1982...
1946
dd      0xffffffff
1982
dd      0xffffffff
Line 1947... Line 1983...
1947
 
1983
 
1948
str_hex:
1984
str_hex:
Line -... Line 1985...
-
 
1985
db '0123456789ABCDEF'
-
 
1986
 
1949
db '0123456789ABCDEF'
1987
buffersize      dd BUFFERSIZE
Line 1950... Line 1988...
1950
 
1988
 
1951
include_debug_strings
1989
include_debug_strings
1952
 
1990