
User-Agent: vim
Den første store browser var Mosaic, dernæst kom Netscape og Internet Explorer. Netscape blev til Mozilla, blev til Firefox, blev til Iceweasel og endelig kom Google Chrome. Min nyeste HTTP-client hedder vim - ja, gode gamle vim.
Selvfølgelig har jeg ikke erstattet min grafiske browser med vim, men det er blevet er fast værktøj til at debugge servere for HTTP-baserede protokoller. I gamle dage kunne man bare telnet'e til serverens port 80, skrive sin ret enkle HTTP-forspørgsel og så vente på svaret.
Men alt det her nymodens XML over HTTP, keep-alive og pipelining bliver det så pokkers svært. Alene det at skrive XML i hånden og uden gode redigeringsmuligheder er svært nok, men med keep-alive skal man også på forhånd bestemme sig for hvor mange bytes ens XML kommer til at fylde.
Måske kan man vælge at kaste en masse smarte værktøjer til at genrere HTTP-forspørgsler efter problemet, men helt lav-teknologisk har jeg valgt at bruge min editor og en række filer med basis-forspørgsler. Så kan jeg let hente en forspørgsel ind og rette den til. Tilbage er der så at opdatere Content-Length headeren (i vim: marker kroppen med 'v' og tryk ':wc -c' og undo) og endelig sende forspørgslen til serveren (i vim: ':%!nc 192.168.42.42 80') og så vent på at indholdet i editoren bliver erstattet med svaret.
Næste skridt bliver lige at lave 5 linjer perl der selv opdaterer Content-Length istedet for at jeg skal gøre det i hånden. Har I nogle smartere løsninger?
Kommentarer (8)
Doh, man skal jo have længden af hver chunk.
Men i HTTP 1.0 tillod man at undlade Content-Length og så læstes der til eof. Så det kunne måske lade sig gøre.
Jeg plejer at bruge curl til den slags - den beregner selv Content-Length når du laver et POST request.
Ja, curl vil kunne give en Content-Length, men resten kommer let til at være mere besværligt. Følgende er eksemplet i afsnit 9.1.5 af WebDAV-standarden (RFC4918) udsat for curl:
[code=bash]curl -X PROPFIND http://localhost:8080/container/ -H 'Depth: 1' -H 'Content-Type: application/xml; charset="utf-8"' -H 'Host: example.com' --data '<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
<D:allprop/>
</D:propfind>'[/code]
I det omfang, at det er XML, man har behov for at POSTe, så kan man klare sig nødtørftigt ved at sætte Content-Length tilpas højt og så smide mellemrum til overflod i bunden af forespørgslen.
Kan Emacs shell-command-on-region ikke gøre det samme for dig.
Content-lenght plejer jeg blot at sætte Perl til at beregne.
Det ville undre mig meget om ikke Emacs havde passende funktioenr der kunne gøre det samme. Alt der skal til er jo bare at filtrere teksten gennem et eksternt program (her netcat).
Men lige hvilken funktion eller hvilken obskur tastekombination den er bundet til som standard har jeg ingen anelse om.
