/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 2 2 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . server . plugins . content neg otiation Ċ Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . serialization .* Ċ import Ġio . ktor . server . application .* Ċ import Ġio . ktor . server . http . content .* Ċ import Ġio . ktor . server . response .* Ċ import Ġio . ktor . utils . io . char sets .* Ċ Ċ private Ġval ĠNOT _ ACCEPT ABLE Ġ= ĠHttpStatusCode Content ( HttpStatusCode . Not Accept able ) Ċ Ċ internal Ġfun ĠPlugin Builder < Content Neg otiation Config >. convert ResponseBody () Ġ= Ġon Call Respond Ġ{ Ġcall , Ġsubject Ġ-> ĊĠĠĠ Ġif Ġ( subject Ġis ĠOut going Content Ġ|| Ġsubject :: class Ġin Ġplugin Config . ignored Types ) Ġreturn @ on Call Respond ĊĊĠĠĠ Ġval Ġregist rations Ġ= Ġplugin Config . regist rations ĊĠĠĠ Ġval Ġcheck Accept Header Ġ= Ġplugin Config . check Accept Header Compliance ĊĊĠĠĠ Ġtransform Body Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaccept Header Ġ= Ġcall . parse Accept Header () ĊĊĠĠĠĠĠĠĠ Ġval Ġaccept Items : ĠList < ContentType With Quality > Ġ= Ġthis @ on Call Respond . plugin Config ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. accept Contribut ors ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fold ( accept Header ) Ġ{ Ġresult , Ġcontributor Ġ-> Ġcontributor ( call , Ġresult ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. distinct () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. sorted By Quality () ĊĊĠĠĠĠĠĠĠ Ġval Ġsuitable Converters Ġ= Ġif Ġ( accept Items . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġall Ġconverter s Ġare Ġsuitable Ġsince Ġclient Ġdidn 't Ġindicate Ġwhat Ġit Ġwants ĊĠĠĠĠĠĠĠĠĠĠĠ Ġregist rations ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġselect Ġconverter s Ġthat Ġmatch Ġspecified ĠAccept Ġheader , Ġin Ġorder Ġof Ġquality ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaccept Items . flatMap Ġ{ Ġ( contentType , Ġ_) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregist rations . filter Ġ{ Ġit . contentType . match ( contentType ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. distinct () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġaccept Charset Ġ= Ġcall . request . headers . suit able Charset OrNull () ĊĊĠĠĠĠĠĠĠ Ġ// ĠPick Ġthe Ġfirst Ġone Ġthat Ġcan Ġconvert Ġthe Ġsubject Ġsuccessfully ĊĠĠĠĠĠĠĠ Ġval Ġconverted : ĠOut going Content ? Ġ= Ġsuitable Converters . first NotNull Of OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġaccept Charset ?. let Ġ{ Ġcharset Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . contentType . with Charset ( charset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . converter . serialize ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠcontentType Ġ= ĠcontentType Ġ?: Ġit . contentType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcharset Ġ= Ġaccept Charset Ġ?: ĠChar sets . UTF _ 8 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype Info Ġ= Ġcall . response . response Type !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġsubject ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrendered Ġ= Ġconverted ?. let Ġ{ Ġtransform Default Content ( call , Ġit ) Ġ} Ġ?: Ġreturn @ transform Body Ġsubject ĊĊĠĠĠĠĠĠĠ Ġif Ġ( check Accept Header Ġ&& Ġ! check Accept Header ( accept Items , Ġrendered . contentType )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ transform Body ĠNOT _ ACCEPT ABLE ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn @ transform Body Ġrendered ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġa Ġlist Ġof Ġcontent Ġtypes Ġsorted Ġby Ġthe Ġquality , Ġnumber Ġof Ġaster is ks , Ġand Ġnumber Ġof Ġparameters . Ċ Ġ* Ġ@ see Ġparse And Sort ContentType Header Ċ Ġ*/ Ċ private Ġfun ĠList < ContentType With Quality >. sorted By Quality (): ĠList < ContentType With Quality > Ġ= Ġsorted With ( ĊĠĠĠ Ġcompare By Descending < ContentType With Quality > Ġ{ Ġit . quality Ġ}. then By Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠcontentType Ġ= Ġit . contentType ĊĠĠĠĠĠĠĠ Ġvar Ġaster is ks Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġif Ġ( contentType . contentType Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaster is ks Ġ+= Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( contentType . content Subtype Ġ== Ġ"* ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġaster is ks ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġaster is ks ĊĠĠĠ Ġ}. then By Descending Ġ{ Ġit . contentType . parameters . size Ġ} Ċ ) Ċ