mandag den 31. december 2007

Yaws Del III

Dette er den trejde i rækken af post's om Yaws. Denne gang vil jeg kigge lidt på det argument man får med over i out/1.

Argumentet til out/1 er en record der er defineret i yaws_api.hrl. yaws_api.hrl er automatisk inkluderet når en side evalueres, så man kan bruge den normale record-notation uden yderligere tiltag.

Følgende eksempel viser hvordan man kan hente docroot (Yaws-instancens docroot) og fullpath (stien til den ramte .yaws-fil) ud af argumentet

out(A) ->
{ehtml, [
{ul, [], [
{li, [], ["Doc Root: ", A#arg.docroot]},
{li, [], ["Full Path: ", A#arg.fullpath]}]
}]
}.

Argumentet til out/1 indeholder også en record der beskriver det indkomne request.
Følgende eksempel viser hvordan man kan hente method og path ud af argumentet

out(A) ->
Req = A#arg.req,
{_, Path} = Req#http_request.path,
Method = Req#http_request.method,
{ehtml, [
{ul, [], [
{li, [], f("Request Method: ~s", [Method])},
{li, [], f("Request Path: ~s", [Path])}]
}]
}.

Det er også muligt at hente headers fra argumentet. Følgende eksempel viser hvordan man kan hente headerne Accept og User-Agent

out(A) ->
H = A#arg.headers,
{ehtml, [
{ul, [], [
{li, [], f("Accept: ~s", [H#headers.accept])},
{li, [], f("User Agent: ~s", [H#headers.user_agent])}]
}]
}.

Og så er det naturligvis også muligt at forespørge på parametre fra query-delene af URL'en. Følgende eksempel viser hvordan man kan beregne BMI på baggrund af parametrene height og weigth

out(A) ->
Q = dict:from_list(yaws_api:parse_query(A)),
{H, _} = string:to_integer(dict:fetch("height", Q)),
{W, _} = string:to_integer(dict:fetch("weigth", Q)),
{ehtml, [
{h2, [], f("BMI: ~f", [W / math:pow(H / 100, 2)])}]
}.

Hvis filen (inkl. html) er gemt som query.yaws, så vil URL'en http://localhost:8000/query.yaws?height=183&weigth=99 vise en side med indholdet BMI: 29.561946. Hvem sagde fede! ;-)

I næste post vil jeg se lidt på Yaws applications - Yapps, så på snarligt gensyn :-)

1 kommentarer:

Frank Vilhelmsen sagde ...

Hej Kim, hmmm er der ikke ret mange nestninger i koden? Fx der hvor du henter headern Accept og User-Agent? Det er de smarte Record's der gør trixet men er det ikke svært at overskue? Det ville være cool hvis du kunne vise det på en måde så man ikke skulle være verdensmester i yaml/json/erlang notation for at følge med.