REBOL [
Title: "HTTP Console Color"
Purpose: "HTTP TTY-style Console"
Date: 8-Sep-2010
File: %httpc-color.r
Version: 0.1.1
Author: "Christopher Ross-Gill"
]
do http://reb4.me/r/rest
do http://reb4.me/r/altwebform
use [
command request response
root path query
commands styles
emit prompt summarize
][
root: any [
all [
url? system/script/args
parse/all url ["http" opt "s" "://" to end]
system/script/args
]
http://www.rebol.com/
]
path: "/"
styles: context [
reset: "^[[0m^[[4D"
bold: context [on: "^[[1m^[[4D" off: "^[[22m^[[5D"]
italic: context [on: "^[[3m^[[4D" off: "^[[23m^[[5D"]
underline: context [on: "^[[4m^[[4D" off: "^[[24m^[[5D"]
black: context [back: "^[[40m^[[5D" text: "^[[30m^[[5D"]
red: context [back: "^[[41m^[[5D" text: "^[[31m^[[5D"]
green: context [back: "^[[42m^[[5D" text: "^[[32m^[[5D"]
yellow: context [back: "^[[43m^[[5D" text: "^[[33m^[[5D"]
blue: context [back: "^[[44m^[[5D" text: "^[[34m^[[5D"]
white: context [back: "^[[47m^[[5D" text: "^[[37m^[[5D"]
]
emit: func [data [block! string!]][
data: bind compose [(data)] styles
print rejoin data
]
prompt: func [data [block! string!]][
data: bind compose [(data) " "] styles
prin rejoin data
ask ""
]
request: context [
action: content: type: headers: none
]
send: func [spec][
spec: read/custom head change root/:path "rest" third spec
set request none
emit [
case [
spec/status < 299 [join green/back black/text]
spec/status < 399 [join blue/back white/text]
spec/status < 499 [join red/back white/text]
spec/status < 599 [join yellow/back black/text]
]
" " spec/status " " reset " " round (length? spec/http-headers) / 2 " Headers"
]
spec
]
summarize: func [content type /local mk][
content: copy/part content 100
either find/match type "text/" [
content: to-string content
][
content: trim enbase/base content 16
mk: 0
forskip content 3 [
mk: mk + 1
unless tail? skip content 2 [
insert skip content 2 either equal? mk // 24 0 ["^/"][" "]
]
]
]
content
]
commands: use [args output][[
"address " args: "http://" to end (root: to-url args)
| "cd " copy path to end
| copy args ["get" | "post" | "head" | "put" | "delete"] end (
request/action: :args
response: send request
)
| "header" opt "s" (
all [
response
foreach [header content] response/http-headers [
emit [blue/text form header ": " reset content]
]
]
)
| "body" [end (
all [
response
emit [
summarize response/content response/http-headers/(to-set-word "Content-Type")
"..."
]
]
) | " flat" (all [response emit [trim copy/part enbase/base response/content 16 100]])]
| "content " args "[" (
all [args: attempt [load/next args]
request/content: try args/1]
)
| to end (emit ["=== Unknown Command"])
]]
while [not find ["q" "quit"] command: prompt [red/text root/:path reset ">"]][
parse/all trim/head/tail command commands
do []
]
]