23 lipca 2007

Monitorowanie i modyfikacja ruchu HTTP z narzędziem WebScarab

Bywa tak, że to co w tutorialach i przykładach typu „witaj świecie” wygląda bardzo miło i działa bez zarzutu potrafi szydzić z naiwnych gdy przyjdzie do implementacji rzeczywistych systemów. Takim cichym szydercą stała się dla mnie ostatnio technologia związana z serwisami sieciowymi (ang. web services). Pierwszym krokiem w zwalczaniu przeciwności losu jest wyizolowanie i identyfikacja problemu. W przypadku serwisów sieciowych w stylu SOAP po HTTP niewątpliwym sprzymierzeńcem jest monitor HTTP, ale możemy chcieć czegoś więcej niż tylko możliwość monitorowania tego, co się dzieje. Dobrze jest móc także modyfikować w locie żądania i odpowiedzi HTTP a jeszcze lepiej, gdy możemy także zaprogramować modyfikacje automatyczną. Wszystko to i jeszcze więcej daje nam WebScarab, jest nawet wersja Java WebStart.

Zaczynamy od konfiguracji proxy. Przechodzimy do zakładki Proxy > Listeners. W polach Address i Port na dole okna wpisujemy adres i port, na którym Proxy będzie nasłuchiwał. W polu Base URL podajemy kompletny URL (łącznie z nazwą protokołu i portem) na który żądania HTTP będą przesyłane. Naciskamy guzik Start to prawej stronie okna.

Przekierowywanie i monitorowanie ruchu HTTP mamy załatwione. Przechodzimy do modyfikacji, na początek manualnej. W tym celu otwieramy zakładkę Proxy > Manual Edit, zaznaczamy interesujące nas metody HTTP. Zaznaczenie opcji Intercept requests spowoduje, że ilekroć WebScarab otrzyma żądanie będziemy poproszeni o podjęcie akcji. Mamy różne możliwości podglądu treści żądania, zaczynając od podglądu zupełnie nie formatowanego na parsowaniu zawartości XML skończywszy. Po zmodyfikowaniu lub tylko przejrzeniu treści żądanie przesyłamy dalej klikając Akcept changes. Zaznaczenie opcji Intercept responses wywoła analogiczny efekt dla odpowiedzi. Ilustracja poniżej.


No i wreszcie gwóźdź programu, modyfikacja programowa. Przechodzimy do zakładki Proxy > Bean Shell, zaznaczamy kontrolkę Enabled i voila! Twórcy WebScarab byli mili i napisali nawet kilka linijek kodu. Bazując na przykładach ze strony projektu rozszerzyłem go troche, tak że powinno już być w miarę jasne z czym to się je. Zastanawia mnie tylko, co to tak naprawdę jest. Wygląda zupełnie jak Java. Czyżby pokusili się o implementację interpretera Javy? Szczęśliwie nie musiałem drążyć zbyt głęboko żeby zaimplementować to co akurat było mi potrzebne. Ilustracja poniżej, mam nadzieje, że kod który na niej widać jest co nieco czytelny.