| \ a http proxy |
\ a http proxy |
| |
|
| \ Copyright (C) 2000 Free Software Foundation, Inc. |
\ Copyright (C) 2000,2002 Free Software Foundation, Inc. |
| |
|
| \ This file is part of Gforth. |
\ This file is part of Gforth. |
| |
|
| |
|
| : request ( host u request u proxy-host u port -- fid ) |
: request ( host u request u proxy-host u port -- fid ) |
| open-socket >r |
open-socket >r |
| 2dup type ." HTTP/1.1" cr |
|
| r@ write-file throw s" HTTP/1.1" r@ writeln |
r@ write-file throw s" HTTP/1.1" r@ writeln |
| s" Host: " r@ write-file throw r@ writeln |
s" Host: " r@ write-file throw r@ writeln |
| ." Connection: close" cr |
|
| s" Connection: close" r@ writeln |
s" Connection: close" r@ writeln |
| s" User-Agent: " r@ write-file throw |
s" User-Agent: " r@ write-file throw |
| User-Agent @ IF |
User-Agent @ IF |
| ELSE s" Gforth Proxy 0.1" THEN r@ writeln |
ELSE s" Gforth Proxy 0.1" THEN r@ writeln |
| s" " r@ writeln r> ; |
s" " r@ writeln r> ; |
| |
|
| Variable proxy s" localhost" proxy $! |
Variable proxy s" proxy" proxy $! \ replace that with your proxy host |
| Variable proxy-port 3128 proxy-port ! |
Variable proxy-port 3128 proxy-port ! \ replace that with your proxy port |
| |
|
| : proxy-open ( host u request u -- fid ) |
: proxy-open ( host u request u -- fid ) |
| proxy $@ proxy-port @ request ; |
proxy $@ proxy-port @ request ; |
| |
|
| response: Allow: |
response: Allow: |
| response: Age: |
response: Age: |
| |
response: Accept-Ranges: |
| response: Cache-Control: |
response: Cache-Control: |
| response: Connection: |
response: Connection: |
| response: Proxy-Connection: |
response: Proxy-Connection: |
| response: Date: |
response: Date: |
| response: ETag: |
response: ETag: |
| response: Expires: |
response: Expires: |
| response: Last-modified: |
response: Last-Modified: |
| response: Location: |
response: Location: |
| response: Mime-Version: |
response: Mime-Version: |
| response: Proxy-Authenticate: |
response: Proxy-Authenticate: |
| |
response: Proxy-Connection: |
| response: Public: |
response: Public: |
| response: Retry-After: |
response: Retry-After: |
| response: Server: |
response: Server: |
| Content-Length @ IF |
Content-Length @ IF |
| Content-Length $@ s>number drop r> read-sized EXIT THEN |
Content-Length $@ s>number drop r> read-sized EXIT THEN |
| Transfer-Encoding @ IF |
Transfer-Encoding @ IF |
| Transfer-Encoding $@ s" chunked" compare 0= IF |
Transfer-Encoding $@ s" chunked" str= 0= IF |
| r> read-chunked EXIT THEN THEN |
r> read-chunked EXIT THEN THEN |
| r> read-to-end ; |
r> read-to-end ; |
| |
|
| |
|
| \ handle proxy request |
\ handle proxy request |
| |
|
| : proxy-request ( host u request u -- ) |
: handle-request ( fid -- ) |
| proxy-open |
|
| dup >r get-response throw |
|
| r@ read-data r> close-file throw |
|
| convert-data write-response write-data ; |
|
| |
|
| : http-request ( host u request u -- ) |
|
| http-open |
|
| dup >r get-response throw |
dup >r get-response throw |
| r@ read-data r> close-file throw |
r@ read-data r> close-file throw |
| convert-data write-response write-data ; |
convert-data write-response write-data ; |
| : (redirect?) ( addr u -- addr' u' t / f ) |
: (redirect?) ( addr u -- addr' u' t / f ) |
| htmldir $! htmldir $@ bounds ?DO |
htmldir $! htmldir $@ bounds ?DO |
| I c@ '/ = IF #lf I c! THEN LOOP |
I c@ '/ = IF #lf I c! THEN LOOP |
| redirects 1 set-order |
redirects 1 set-order redir$ $off |
| htmldir $@ ['] evaluate catch |
htmldir $@ ['] evaluate catch |
| IF 2drop false ELSE true THEN ; |
IF 2drop false ELSE redir$ @ 0<> THEN ; |
| |
|
| : (redirect) ( addr u -- ) |
: (redirect) ( -- ) |
| host$ $@ 2swap proxy-request maxnum off ; |
host$ $@ redir$ $@ proxy-open handle-request maxnum off ; |
| |
|
| ' (redirect?) IS redirect? |
' (redirect?) IS redirect? |
| ' (redirect) IS redirect |
' (redirect) IS redirect |
| |
|
| also systems definitions |
also systems definitions |
| |
|
| redirect: bigforth www.jwdt.com"http://www.jwdt.com/~paysan/" |
redirect: bigforth bigforth.sourceforge.net"http://bigforth.sourceforge.net/" |
| |
|
| previous previous definitions |
previous previous definitions |