package Ġcom . hex agon kt . http . server . handlers Ċ Ċ import Ġcom . hex agon kt . core . handlers . Context Ċ import Ġcom . hex agon kt . http . model . HttpMethod Ċ import Ġcom . hex agon kt . http . model . HttpMethod .* Ċ import Ġcom . hex agon kt . http . model . HttpMethod . Companion . ALL Ċ import Ġcom . hex agon kt . http . model . HttpStatus Ċ import Ġcom . hex agon kt . http . model . Success Status . OK Ċ import Ġcom . hex agon kt . http . patterns . Literal Path Pattern Ċ import Ġcom . hex agon kt . http . server . model . HttpServer Call Ċ import Ġcom . hex agon kt . http . server . model . HttpServer Request Ċ import Ġcom . hex agon kt . http . server . model . HttpServer Response Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġjava . io . IOException Ċ import Ġjava . lang . IllegalStateException Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertFalse Ċ import Ġkotlin . test . assertTrue Ċ Ċ internal Ġclass ĠHttp Server Predicate Test Ġ{ ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Pred icates Ġwith Ġempty Ġpattern Ġmatches Ġexact Ġpath Ġor Ġroot `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpredicate Ġ= ĠHttp Server Predicate () ĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= ĠHttp Server Call ( HttpServer Request (), ĠHttp Server Response ()) ĊĠĠĠĠĠĠĠ Ġval Ġcontext Ġ= ĠContext ( call , Ġpredicate ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( predicate ( context )) ĊĠĠĠĠĠĠĠ Ġval Ġcall 1 Ġ= ĠHttp Server Call ( HttpServer Request ( path Ġ= Ġ"/ "), ĠHttp Server Response ()) ĊĠĠĠĠĠĠĠ Ġval Ġcontext 1 Ġ= ĠContext ( call 1 , Ġpredicate ) ĊĠĠĠĠĠĠĠ ĠassertTrue ( predicate ( context 1 )) ĊĠĠĠĠĠĠĠ Ġval Ġcall 2 Ġ= ĠHttp Server Call ( HttpServer Request ( path Ġ= Ġ"/ a "), ĠHttp Server Response ()) ĊĠĠĠĠĠĠĠ Ġval Ġcontext 2 Ġ= ĠContext ( call 2 , Ġpredicate ) ĊĠĠĠĠĠĠĠ ĠassertFalse ( predicate ( context 2 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` HTTP Ġpredicates Ġare Ġdescribed Ġcorrectly `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpredicate 1 Ġ= ĠHttp Server Predicate ( set Of ( PUT , ĠOPTIONS ), ĠLiteral Path Pattern ("/ a ")) ĊĠĠĠĠĠĠĠ ĠassertEquals (" PUT , ĠOPTIONS ĠLiteral Ġ'/ a '", Ġpredicate 1 . describe ()) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate 2 Ġ= ĠHttp Server Predicate ( set Of ( GET ), ĠLiteral Path Pattern ("/ b / c ")) ĊĠĠĠĠĠĠĠ ĠassertEquals (" GET ĠLiteral Ġ'/ b / c '", Ġpredicate 2 . describe ()) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate 3 Ġ= ĠHttp Server Predicate ( path Pattern Ġ= ĠLiteral Path Pattern ("/ b / c ")) ĊĠĠĠĠĠĠĠ ĠassertEquals (" ANY ĠLiteral Ġ'/ b / c '", Ġpredicate 3 . describe ()) ĊĠĠĠĠĠĠĠ Ġval Ġpredicate 4 Ġ= ĠHttp Server Predicate ( set Of ( POST , ĠP ATCH )) ĊĠĠĠĠĠĠĠ ĠassertEquals (" POST , ĠP ATCH ĠLiteral Ġ'' ", Ġpredicate 4 . describe ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwithout Ġfilter Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ Ġset Of ( HttpServer Predicate ( pattern Ġ= Ġ"* "), ĠHttp Server Predicate ( ALL , Ġ"* ")). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . codes . values . forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/", Ġ"/ a "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġpattern , Ġstatus ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġpattern , Ġstatus ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġmethod Ġfilter Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( set Of ( PUT , ĠOPTIONS ), Ġ"* "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( PUT , Ġ"/ a ", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( OPTIONS , Ġ"/ a ", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( POST , Ġ"/", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( GET , Ġ"/", ĠOK ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġpattern Ġfilter Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( path Pattern Ġ= ĠLiteral Path Pattern ("/ a ")). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( POST , Ġ"/ a ", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( GET , Ġ"/ a ", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( POST , Ġ"/", ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( GET , Ġ"/", ĠOK ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġexception Ġfilter Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( pattern Ġ= Ġ"*", Ġexception Ġ= ĠRuntimeException :: class ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . codes . values . forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/", Ġ"/ a "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 1 Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , ĠRuntimeException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( c 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 2 Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , ĠIllegalStateException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( c 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 3 Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , ĠIOException ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( c 3 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 4 Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( c 4 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġstatus Ġfilter Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( pattern Ġ= Ġ"*", Ġstatus Ġ= ĠOK ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/", Ġ"/ a "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġpattern , ĠOK ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( HttpStatus . codes . values . toList () Ġ- ĠOK ). forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( method , Ġpattern , Ġstatus ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġcombined Ġfilters Ġ( without Ġmethod ) Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Pattern Ġ= ĠLiteral Path Pattern ("/ a "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠRuntimeException :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠOK ). let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠRuntimeException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠIllegalStateException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/ b ", Ġ"/ c "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( null , ĠIOException ()). forEach Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( HttpStatus . codes . values . toList () Ġ- ĠOK ). forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( c )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Pattern Ġ= ĠLiteral Path Pattern ("/ a "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠRuntimeException :: class ). let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . codes . values . toList (). forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( RuntimeException (), ĠIllegalStateException ()). forEach Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", Ġstatus , Ġexception ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", Ġstatus , Ġexception ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/ b ", Ġ"/ c "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( null , ĠIOException ()). forEach Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttpStatus . codes . values . toList (). forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġserver Context ( method , Ġpattern , Ġstatus , Ġexception ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( c )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Predicate Ġwith Ġcombined Ġfilters Ġworks Ġproperly `() Ġ{ ĊĠĠĠĠĠĠĠ ĠHttp Server Predicate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethods Ġ= Ġset Of ( POST , ĠPUT ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpath Pattern Ġ= ĠLiteral Path Pattern ("/ a "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= ĠRuntimeException :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠOK ). let Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Of ( POST , ĠPUT ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠRuntimeException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠIllegalStateException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( ALL Ġ- ĠPOST Ġ- ĠPUT ). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠRuntimeException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( it . predicate ( server Context ( method , Ġ"/ a ", ĠOK , ĠIllegalStateException ()))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttpMethod . values (). forEach Ġ{ Ġmethod Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ("/ b ", Ġ"/ c "). forEach Ġ{ Ġpattern Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( null , ĠIOException ()). forEach Ġ{ Ġexception Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( HttpStatus . codes . values . toList () Ġ- ĠOK ). forEach Ġ{ Ġstatus Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġit . predicate ( server Context ( method , Ġpattern , Ġstatus , Ġexception )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertFalse ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test Ġfun Ġ` Add Ġprefix Ġto Ġpredicate `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġp 1 Ġ= ĠHttp Server Predicate () ĊĠĠĠĠĠĠĠ ĠassertEquals ("/ a ", Ġp 1 . add Prefix ("/ a "). path Pattern . pattern ) ĊĠĠĠĠĠĠĠ Ġval Ġp 2 Ġ= ĠHttp Server Predicate ( path Pattern Ġ= ĠLiteral Path Pattern ("/ a ")) ĊĠĠĠĠĠĠĠ ĠassertEquals ("/ b / a ", Ġp 2 . add Prefix ("/ b "). path Pattern . pattern ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġserver Context ( ĊĠĠĠĠĠĠĠ Ġmethod : ĠHttpMethod , ĊĠĠĠĠĠĠĠ Ġpath : ĠString , ĊĠĠĠĠĠĠĠ Ġstatus : ĠHttpStatus , ĊĠĠĠĠĠĠĠ Ġexception : ĠException ? Ġ= Ġnull , ĊĠĠĠ Ġ) Ġ= ĊĠĠĠĠĠĠĠ ĠContext ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Server Call ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Server Request ( method Ġ= Ġmethod , Ġpath Ġ= Ġpath ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Server Response ( status Ġ= Ġstatus ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHttp Server Predicate (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexception Ġ= Ġexception ĊĠĠĠĠĠĠĠ Ġ) Ċ } Ċ