datastructures.html 325 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>werkzeug.datastructures &#8212; proxypool documentation</title>
  7. <link rel="stylesheet" href="../../_static/alabaster.css" type="text/css" />
  8. <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: '../../',
  12. VERSION: '',
  13. COLLAPSE_INDEX: false,
  14. FILE_SUFFIX: '.html',
  15. HAS_SOURCE: true
  16. };
  17. </script>
  18. <script type="text/javascript" src="../../_static/jquery.js"></script>
  19. <script type="text/javascript" src="../../_static/underscore.js"></script>
  20. <script type="text/javascript" src="../../_static/doctools.js"></script>
  21. <link rel="index" title="Index" href="../../genindex.html" />
  22. <link rel="search" title="Search" href="../../search.html" />
  23. <link rel="top" title="proxypool documentation" href="../../index.html" />
  24. <link rel="up" title="Module code" href="../index.html" />
  25. <link rel="stylesheet" href="../../_static/custom.css" type="text/css" />
  26. <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
  27. </head>
  28. <body role="document">
  29. <div class="document">
  30. <div class="documentwrapper">
  31. <div class="bodywrapper">
  32. <div class="body" role="main">
  33. <h1>Source code for werkzeug.datastructures</h1><div class="highlight"><pre>
  34. <span></span><span class="c1"># -*- coding: utf-8 -*-</span>
  35. <span class="sd">&quot;&quot;&quot;</span>
  36. <span class="sd"> werkzeug.datastructures</span>
  37. <span class="sd"> ~~~~~~~~~~~~~~~~~~~~~~~</span>
  38. <span class="sd"> This module provides mixins and classes with an immutable interface.</span>
  39. <span class="sd"> :copyright: (c) 2014 by the Werkzeug Team, see AUTHORS for more details.</span>
  40. <span class="sd"> :license: BSD, see LICENSE for more details.</span>
  41. <span class="sd">&quot;&quot;&quot;</span>
  42. <span class="kn">import</span> <span class="nn">re</span>
  43. <span class="kn">import</span> <span class="nn">codecs</span>
  44. <span class="kn">import</span> <span class="nn">mimetypes</span>
  45. <span class="kn">from</span> <span class="nn">copy</span> <span class="k">import</span> <span class="n">deepcopy</span>
  46. <span class="kn">from</span> <span class="nn">itertools</span> <span class="k">import</span> <span class="n">repeat</span>
  47. <span class="kn">from</span> <span class="nn">werkzeug._internal</span> <span class="k">import</span> <span class="n">_missing</span><span class="p">,</span> <span class="n">_empty_stream</span>
  48. <span class="kn">from</span> <span class="nn">werkzeug._compat</span> <span class="k">import</span> <span class="n">iterkeys</span><span class="p">,</span> <span class="n">itervalues</span><span class="p">,</span> <span class="n">iteritems</span><span class="p">,</span> <span class="n">iterlists</span><span class="p">,</span> \
  49. <span class="n">PY2</span><span class="p">,</span> <span class="n">text_type</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">,</span> <span class="n">string_types</span><span class="p">,</span> <span class="n">make_literal_wrapper</span><span class="p">,</span> \
  50. <span class="n">to_native</span>
  51. <span class="kn">from</span> <span class="nn">werkzeug.filesystem</span> <span class="k">import</span> <span class="n">get_filesystem_encoding</span>
  52. <span class="n">_locale_delim_re</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">r&#39;[_-]&#39;</span><span class="p">)</span>
  53. <span class="k">def</span> <span class="nf">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  54. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%r</span><span class="s1"> objects are immutable&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
  55. <span class="k">def</span> <span class="nf">iter_multi_items</span><span class="p">(</span><span class="n">mapping</span><span class="p">):</span>
  56. <span class="sd">&quot;&quot;&quot;Iterates over the items of a mapping yielding keys and values</span>
  57. <span class="sd"> without dropping any from more complex structures.</span>
  58. <span class="sd"> &quot;&quot;&quot;</span>
  59. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mapping</span><span class="p">,</span> <span class="n">MultiDict</span><span class="p">):</span>
  60. <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">mapping</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
  61. <span class="k">yield</span> <span class="n">item</span>
  62. <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mapping</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  63. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">mapping</span><span class="p">):</span>
  64. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
  65. <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
  66. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  67. <span class="k">else</span><span class="p">:</span>
  68. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  69. <span class="k">else</span><span class="p">:</span>
  70. <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">mapping</span><span class="p">:</span>
  71. <span class="k">yield</span> <span class="n">item</span>
  72. <span class="k">def</span> <span class="nf">native_itermethods</span><span class="p">(</span><span class="n">names</span><span class="p">):</span>
  73. <span class="k">if</span> <span class="ow">not</span> <span class="n">PY2</span><span class="p">:</span>
  74. <span class="k">return</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span>
  75. <span class="k">def</span> <span class="nf">setmethod</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
  76. <span class="n">itermethod</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
  77. <span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="s1">&#39;iter</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">name</span><span class="p">,</span> <span class="n">itermethod</span><span class="p">)</span>
  78. <span class="n">listmethod</span> <span class="o">=</span> <span class="k">lambda</span> <span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">:</span> <span class="nb">list</span><span class="p">(</span><span class="n">itermethod</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">))</span>
  79. <span class="n">listmethod</span><span class="o">.</span><span class="n">__doc__</span> <span class="o">=</span> \
  80. <span class="s1">&#39;Like :py:meth:`iter</span><span class="si">%s</span><span class="s1">`, but returns a list.&#39;</span> <span class="o">%</span> <span class="n">name</span>
  81. <span class="nb">setattr</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">listmethod</span><span class="p">)</span>
  82. <span class="k">def</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
  83. <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">:</span>
  84. <span class="n">setmethod</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
  85. <span class="k">return</span> <span class="n">cls</span>
  86. <span class="k">return</span> <span class="n">wrap</span>
  87. <span class="k">class</span> <span class="nc">ImmutableListMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  88. <span class="sd">&quot;&quot;&quot;Makes a :class:`list` immutable.</span>
  89. <span class="sd"> .. versionadded:: 0.5</span>
  90. <span class="sd"> :private:</span>
  91. <span class="sd"> &quot;&quot;&quot;</span>
  92. <span class="n">_hash_cache</span> <span class="o">=</span> <span class="kc">None</span>
  93. <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  94. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  95. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span>
  96. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="nb">tuple</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  97. <span class="k">return</span> <span class="n">rv</span>
  98. <span class="k">def</span> <span class="nf">__reduce_ex__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
  99. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="p">),)</span>
  100. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  101. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  102. <span class="k">def</span> <span class="nf">__delslice__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">):</span>
  103. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  104. <span class="k">def</span> <span class="nf">__iadd__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  105. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  106. <span class="n">__imul__</span> <span class="o">=</span> <span class="n">__iadd__</span>
  107. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  108. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  109. <span class="k">def</span> <span class="nf">__setslice__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  110. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  111. <span class="k">def</span> <span class="nf">append</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  112. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  113. <span class="n">remove</span> <span class="o">=</span> <span class="n">append</span>
  114. <span class="k">def</span> <span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterable</span><span class="p">):</span>
  115. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  116. <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  117. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  118. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
  119. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  120. <span class="k">def</span> <span class="nf">reverse</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  121. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  122. <span class="k">def</span> <span class="nf">sort</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">cmp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  123. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  124. <span class="k">class</span> <span class="nc">ImmutableList</span><span class="p">(</span><span class="n">ImmutableListMixin</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
  125. <span class="sd">&quot;&quot;&quot;An immutable :class:`list`.</span>
  126. <span class="sd"> .. versionadded:: 0.5</span>
  127. <span class="sd"> :private:</span>
  128. <span class="sd"> &quot;&quot;&quot;</span>
  129. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  130. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
  131. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  132. <span class="nb">list</span><span class="o">.</span><span class="n">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
  133. <span class="p">)</span>
  134. <span class="k">class</span> <span class="nc">ImmutableDictMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  135. <span class="sd">&quot;&quot;&quot;Makes a :class:`dict` immutable.</span>
  136. <span class="sd"> .. versionadded:: 0.5</span>
  137. <span class="sd"> :private:</span>
  138. <span class="sd"> &quot;&quot;&quot;</span>
  139. <span class="n">_hash_cache</span> <span class="o">=</span> <span class="kc">None</span>
  140. <span class="nd">@classmethod</span>
  141. <span class="k">def</span> <span class="nf">fromkeys</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">keys</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  142. <span class="n">instance</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">cls</span><span class="p">)</span><span class="o">.</span><span class="n">__new__</span><span class="p">(</span><span class="n">cls</span><span class="p">)</span>
  143. <span class="n">instance</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">keys</span><span class="p">,</span> <span class="n">repeat</span><span class="p">(</span><span class="n">value</span><span class="p">)))</span>
  144. <span class="k">return</span> <span class="n">instance</span>
  145. <span class="k">def</span> <span class="nf">__reduce_ex__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
  146. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="p">(</span><span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">),)</span>
  147. <span class="k">def</span> <span class="nf">_iter_hashitems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  148. <span class="k">return</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  149. <span class="k">def</span> <span class="nf">__hash__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  150. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  151. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span>
  152. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_hash_cache</span> <span class="o">=</span> <span class="nb">hash</span><span class="p">(</span><span class="nb">frozenset</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_iter_hashitems</span><span class="p">()))</span>
  153. <span class="k">return</span> <span class="n">rv</span>
  154. <span class="k">def</span> <span class="nf">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  155. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  156. <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
  157. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  158. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  159. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  160. <span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  161. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  162. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  163. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  164. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  165. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  166. <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  167. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  168. <span class="k">class</span> <span class="nc">ImmutableMultiDictMixin</span><span class="p">(</span><span class="n">ImmutableDictMixin</span><span class="p">):</span>
  169. <span class="sd">&quot;&quot;&quot;Makes a :class:`MultiDict` immutable.</span>
  170. <span class="sd"> .. versionadded:: 0.5</span>
  171. <span class="sd"> :private:</span>
  172. <span class="sd"> &quot;&quot;&quot;</span>
  173. <span class="k">def</span> <span class="nf">__reduce_ex__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
  174. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)),)</span>
  175. <span class="k">def</span> <span class="nf">_iter_hashitems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  176. <span class="k">return</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  177. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  178. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  179. <span class="k">def</span> <span class="nf">popitemlist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  180. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  181. <span class="k">def</span> <span class="nf">poplist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  182. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  183. <span class="k">def</span> <span class="nf">setlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_list</span><span class="p">):</span>
  184. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  185. <span class="k">def</span> <span class="nf">setlistdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default_list</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  186. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  187. <span class="k">class</span> <span class="nc">UpdateDictMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  188. <span class="sd">&quot;&quot;&quot;Makes dicts call `self.on_update` on modifications.</span>
  189. <span class="sd"> .. versionadded:: 0.5</span>
  190. <span class="sd"> :private:</span>
  191. <span class="sd"> &quot;&quot;&quot;</span>
  192. <span class="n">on_update</span> <span class="o">=</span> <span class="kc">None</span>
  193. <span class="k">def</span> <span class="nf">calls_update</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
  194. <span class="k">def</span> <span class="nf">oncall</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
  195. <span class="n">rv</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="nb">super</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">),</span> <span class="n">name</span><span class="p">)(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
  196. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  197. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  198. <span class="k">return</span> <span class="n">rv</span>
  199. <span class="n">oncall</span><span class="o">.</span><span class="n">__name__</span> <span class="o">=</span> <span class="n">name</span>
  200. <span class="k">return</span> <span class="n">oncall</span>
  201. <span class="k">def</span> <span class="nf">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  202. <span class="n">modified</span> <span class="o">=</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span>
  203. <span class="n">rv</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
  204. <span class="k">if</span> <span class="n">modified</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  205. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  206. <span class="k">return</span> <span class="n">rv</span>
  207. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_missing</span><span class="p">):</span>
  208. <span class="n">modified</span> <span class="o">=</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span>
  209. <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="n">_missing</span><span class="p">:</span>
  210. <span class="n">rv</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  211. <span class="k">else</span><span class="p">:</span>
  212. <span class="n">rv</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
  213. <span class="k">if</span> <span class="n">modified</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  214. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  215. <span class="k">return</span> <span class="n">rv</span>
  216. <span class="n">__setitem__</span> <span class="o">=</span> <span class="n">calls_update</span><span class="p">(</span><span class="s1">&#39;__setitem__&#39;</span><span class="p">)</span>
  217. <span class="n">__delitem__</span> <span class="o">=</span> <span class="n">calls_update</span><span class="p">(</span><span class="s1">&#39;__delitem__&#39;</span><span class="p">)</span>
  218. <span class="n">clear</span> <span class="o">=</span> <span class="n">calls_update</span><span class="p">(</span><span class="s1">&#39;clear&#39;</span><span class="p">)</span>
  219. <span class="n">popitem</span> <span class="o">=</span> <span class="n">calls_update</span><span class="p">(</span><span class="s1">&#39;popitem&#39;</span><span class="p">)</span>
  220. <span class="n">update</span> <span class="o">=</span> <span class="n">calls_update</span><span class="p">(</span><span class="s1">&#39;update&#39;</span><span class="p">)</span>
  221. <span class="k">del</span> <span class="n">calls_update</span>
  222. <span class="k">class</span> <span class="nc">TypeConversionDict</span><span class="p">(</span><span class="nb">dict</span><span class="p">):</span>
  223. <span class="sd">&quot;&quot;&quot;Works like a regular dict but the :meth:`get` method can perform</span>
  224. <span class="sd"> type conversions. :class:`MultiDict` and :class:`CombinedMultiDict`</span>
  225. <span class="sd"> are subclasses of this class and provide the same feature.</span>
  226. <span class="sd"> .. versionadded:: 0.5</span>
  227. <span class="sd"> &quot;&quot;&quot;</span>
  228. <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  229. <span class="sd">&quot;&quot;&quot;Return the default value if the requested data doesn&#39;t exist.</span>
  230. <span class="sd"> If `type` is provided and is a callable it should convert the value,</span>
  231. <span class="sd"> return it or raise a :exc:`ValueError` if that is not possible. In</span>
  232. <span class="sd"> this case the function will return the default as if the value was not</span>
  233. <span class="sd"> found:</span>
  234. <span class="sd"> &gt;&gt;&gt; d = TypeConversionDict(foo=&#39;42&#39;, bar=&#39;blub&#39;)</span>
  235. <span class="sd"> &gt;&gt;&gt; d.get(&#39;foo&#39;, type=int)</span>
  236. <span class="sd"> 42</span>
  237. <span class="sd"> &gt;&gt;&gt; d.get(&#39;bar&#39;, -1, type=int)</span>
  238. <span class="sd"> -1</span>
  239. <span class="sd"> :param key: The key to be looked up.</span>
  240. <span class="sd"> :param default: The default value to be returned if the key can&#39;t</span>
  241. <span class="sd"> be looked up. If not further specified `None` is</span>
  242. <span class="sd"> returned.</span>
  243. <span class="sd"> :param type: A callable that is used to cast the value in the</span>
  244. <span class="sd"> :class:`MultiDict`. If a :exc:`ValueError` is raised</span>
  245. <span class="sd"> by this callable the default value is returned.</span>
  246. <span class="sd"> &quot;&quot;&quot;</span>
  247. <span class="k">try</span><span class="p">:</span>
  248. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  249. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  250. <span class="n">rv</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
  251. <span class="k">except</span> <span class="p">(</span><span class="ne">KeyError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
  252. <span class="n">rv</span> <span class="o">=</span> <span class="n">default</span>
  253. <span class="k">return</span> <span class="n">rv</span>
  254. <span class="k">class</span> <span class="nc">ImmutableTypeConversionDict</span><span class="p">(</span><span class="n">ImmutableDictMixin</span><span class="p">,</span> <span class="n">TypeConversionDict</span><span class="p">):</span>
  255. <span class="sd">&quot;&quot;&quot;Works like a :class:`TypeConversionDict` but does not support</span>
  256. <span class="sd"> modifications.</span>
  257. <span class="sd"> .. versionadded:: 0.5</span>
  258. <span class="sd"> &quot;&quot;&quot;</span>
  259. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  260. <span class="sd">&quot;&quot;&quot;Return a shallow mutable copy of this object. Keep in mind that</span>
  261. <span class="sd"> the standard library&#39;s :func:`copy` function is a no-op for this class</span>
  262. <span class="sd"> like for any other python immutable type (eg: :class:`tuple`).</span>
  263. <span class="sd"> &quot;&quot;&quot;</span>
  264. <span class="k">return</span> <span class="n">TypeConversionDict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  265. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  266. <span class="k">return</span> <span class="bp">self</span>
  267. <span class="nd">@native_itermethods</span><span class="p">([</span><span class="s1">&#39;keys&#39;</span><span class="p">,</span> <span class="s1">&#39;values&#39;</span><span class="p">,</span> <span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="s1">&#39;lists&#39;</span><span class="p">,</span> <span class="s1">&#39;listvalues&#39;</span><span class="p">])</span>
  268. <span class="k">class</span> <span class="nc">MultiDict</span><span class="p">(</span><span class="n">TypeConversionDict</span><span class="p">):</span>
  269. <span class="sd">&quot;&quot;&quot;A :class:`MultiDict` is a dictionary subclass customized to deal with</span>
  270. <span class="sd"> multiple values for the same key which is for example used by the parsing</span>
  271. <span class="sd"> functions in the wrappers. This is necessary because some HTML form</span>
  272. <span class="sd"> elements pass multiple values for the same key.</span>
  273. <span class="sd"> :class:`MultiDict` implements all standard dictionary methods.</span>
  274. <span class="sd"> Internally, it saves all values for a key as a list, but the standard dict</span>
  275. <span class="sd"> access methods will only return the first value for a key. If you want to</span>
  276. <span class="sd"> gain access to the other values, too, you have to use the `list` methods as</span>
  277. <span class="sd"> explained below.</span>
  278. <span class="sd"> Basic Usage:</span>
  279. <span class="sd"> &gt;&gt;&gt; d = MultiDict([(&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;)])</span>
  280. <span class="sd"> &gt;&gt;&gt; d</span>
  281. <span class="sd"> MultiDict([(&#39;a&#39;, &#39;b&#39;), (&#39;a&#39;, &#39;c&#39;)])</span>
  282. <span class="sd"> &gt;&gt;&gt; d[&#39;a&#39;]</span>
  283. <span class="sd"> &#39;b&#39;</span>
  284. <span class="sd"> &gt;&gt;&gt; d.getlist(&#39;a&#39;)</span>
  285. <span class="sd"> [&#39;b&#39;, &#39;c&#39;]</span>
  286. <span class="sd"> &gt;&gt;&gt; &#39;a&#39; in d</span>
  287. <span class="sd"> True</span>
  288. <span class="sd"> It behaves like a normal dict thus all dict functions will only return the</span>
  289. <span class="sd"> first value when multiple values for one key are found.</span>
  290. <span class="sd"> From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a</span>
  291. <span class="sd"> subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will</span>
  292. <span class="sd"> render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP</span>
  293. <span class="sd"> exceptions.</span>
  294. <span class="sd"> A :class:`MultiDict` can be constructed from an iterable of</span>
  295. <span class="sd"> ``(key, value)`` tuples, a dict, a :class:`MultiDict` or from Werkzeug 0.2</span>
  296. <span class="sd"> onwards some keyword parameters.</span>
  297. <span class="sd"> :param mapping: the initial value for the :class:`MultiDict`. Either a</span>
  298. <span class="sd"> regular dict, an iterable of ``(key, value)`` tuples</span>
  299. <span class="sd"> or `None`.</span>
  300. <span class="sd"> &quot;&quot;&quot;</span>
  301. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  302. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mapping</span><span class="p">,</span> <span class="n">MultiDict</span><span class="p">):</span>
  303. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">((</span><span class="n">k</span><span class="p">,</span> <span class="n">l</span><span class="p">[:])</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">iterlists</span><span class="p">(</span><span class="n">mapping</span><span class="p">)))</span>
  304. <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mapping</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  305. <span class="n">tmp</span> <span class="o">=</span> <span class="p">{}</span>
  306. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">mapping</span><span class="p">):</span>
  307. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
  308. <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
  309. <span class="k">continue</span>
  310. <span class="n">value</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  311. <span class="k">else</span><span class="p">:</span>
  312. <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
  313. <span class="n">tmp</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
  314. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tmp</span><span class="p">)</span>
  315. <span class="k">else</span><span class="p">:</span>
  316. <span class="n">tmp</span> <span class="o">=</span> <span class="p">{}</span>
  317. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">mapping</span> <span class="ow">or</span> <span class="p">():</span>
  318. <span class="n">tmp</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  319. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tmp</span><span class="p">)</span>
  320. <span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  321. <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lists</span><span class="p">())</span>
  322. <span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  323. <span class="nb">dict</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  324. <span class="nb">dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  325. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  326. <span class="sd">&quot;&quot;&quot;Return the first data value for this key;</span>
  327. <span class="sd"> raises KeyError if not found.</span>
  328. <span class="sd"> :param key: The key to be looked up.</span>
  329. <span class="sd"> :raise KeyError: if the key does not exist.</span>
  330. <span class="sd"> &quot;&quot;&quot;</span>
  331. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  332. <span class="n">lst</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  333. <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lst</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
  334. <span class="k">return</span> <span class="n">lst</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  335. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  336. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  337. <span class="sd">&quot;&quot;&quot;Like :meth:`add` but removes an existing key first.</span>
  338. <span class="sd"> :param key: the key for the value.</span>
  339. <span class="sd"> :param value: the value to set.</span>
  340. <span class="sd"> &quot;&quot;&quot;</span>
  341. <span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="p">[</span><span class="n">value</span><span class="p">])</span>
  342. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  343. <span class="sd">&quot;&quot;&quot;Adds a new value for the key.</span>
  344. <span class="sd"> .. versionadded:: 0.6</span>
  345. <span class="sd"> :param key: the key for the value.</span>
  346. <span class="sd"> :param value: the value to add.</span>
  347. <span class="sd"> &quot;&quot;&quot;</span>
  348. <span class="nb">dict</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  349. <span class="k">def</span> <span class="nf">getlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  350. <span class="sd">&quot;&quot;&quot;Return the list of items for a given key. If that key is not in the</span>
  351. <span class="sd"> `MultiDict`, the return value will be an empty list. Just as `get`</span>
  352. <span class="sd"> `getlist` accepts a `type` parameter. All items will be converted</span>
  353. <span class="sd"> with the callable defined there.</span>
  354. <span class="sd"> :param key: The key to be looked up.</span>
  355. <span class="sd"> :param type: A callable that is used to cast the value in the</span>
  356. <span class="sd"> :class:`MultiDict`. If a :exc:`ValueError` is raised</span>
  357. <span class="sd"> by this callable the value will be removed from the list.</span>
  358. <span class="sd"> :return: a :class:`list` of all the values for the key.</span>
  359. <span class="sd"> &quot;&quot;&quot;</span>
  360. <span class="k">try</span><span class="p">:</span>
  361. <span class="n">rv</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  362. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  363. <span class="k">return</span> <span class="p">[]</span>
  364. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  365. <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
  366. <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
  367. <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">rv</span><span class="p">:</span>
  368. <span class="k">try</span><span class="p">:</span>
  369. <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">item</span><span class="p">))</span>
  370. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  371. <span class="k">pass</span>
  372. <span class="k">return</span> <span class="n">result</span>
  373. <span class="k">def</span> <span class="nf">setlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_list</span><span class="p">):</span>
  374. <span class="sd">&quot;&quot;&quot;Remove the old values for a key and add new ones. Note that the list</span>
  375. <span class="sd"> you pass the values in will be shallow-copied before it is inserted in</span>
  376. <span class="sd"> the dictionary.</span>
  377. <span class="sd"> &gt;&gt;&gt; d = MultiDict()</span>
  378. <span class="sd"> &gt;&gt;&gt; d.setlist(&#39;foo&#39;, [&#39;1&#39;, &#39;2&#39;])</span>
  379. <span class="sd"> &gt;&gt;&gt; d[&#39;foo&#39;]</span>
  380. <span class="sd"> &#39;1&#39;</span>
  381. <span class="sd"> &gt;&gt;&gt; d.getlist(&#39;foo&#39;)</span>
  382. <span class="sd"> [&#39;1&#39;, &#39;2&#39;]</span>
  383. <span class="sd"> :param key: The key for which the values are set.</span>
  384. <span class="sd"> :param new_list: An iterable with the new values for the key. Old values</span>
  385. <span class="sd"> are removed first.</span>
  386. <span class="sd"> &quot;&quot;&quot;</span>
  387. <span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">new_list</span><span class="p">))</span>
  388. <span class="k">def</span> <span class="nf">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  389. <span class="sd">&quot;&quot;&quot;Returns the value for the key if it is in the dict, otherwise it</span>
  390. <span class="sd"> returns `default` and sets that value for `key`.</span>
  391. <span class="sd"> :param key: The key to be looked up.</span>
  392. <span class="sd"> :param default: The default value to be returned if the key is not</span>
  393. <span class="sd"> in the dict. If not further specified it&#39;s `None`.</span>
  394. <span class="sd"> &quot;&quot;&quot;</span>
  395. <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  396. <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">default</span>
  397. <span class="k">else</span><span class="p">:</span>
  398. <span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  399. <span class="k">return</span> <span class="n">default</span>
  400. <span class="k">def</span> <span class="nf">setlistdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default_list</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  401. <span class="sd">&quot;&quot;&quot;Like `setdefault` but sets multiple values. The list returned</span>
  402. <span class="sd"> is not a copy, but the list that is actually used internally. This</span>
  403. <span class="sd"> means that you can put new values into the dict by appending items</span>
  404. <span class="sd"> to the list:</span>
  405. <span class="sd"> &gt;&gt;&gt; d = MultiDict({&quot;foo&quot;: 1})</span>
  406. <span class="sd"> &gt;&gt;&gt; d.setlistdefault(&quot;foo&quot;).extend([2, 3])</span>
  407. <span class="sd"> &gt;&gt;&gt; d.getlist(&quot;foo&quot;)</span>
  408. <span class="sd"> [1, 2, 3]</span>
  409. <span class="sd"> :param key: The key to be looked up.</span>
  410. <span class="sd"> :param default: An iterable of default values. It is either copied</span>
  411. <span class="sd"> (in case it was a list) or converted into a list</span>
  412. <span class="sd"> before returned.</span>
  413. <span class="sd"> :return: a :class:`list`</span>
  414. <span class="sd"> &quot;&quot;&quot;</span>
  415. <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  416. <span class="n">default_list</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">default_list</span> <span class="ow">or</span> <span class="p">())</span>
  417. <span class="nb">dict</span><span class="o">.</span><span class="n">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default_list</span><span class="p">)</span>
  418. <span class="k">else</span><span class="p">:</span>
  419. <span class="n">default_list</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  420. <span class="k">return</span> <span class="n">default_list</span>
  421. <span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  422. <span class="sd">&quot;&quot;&quot;Return an iterator of ``(key, value)`` pairs.</span>
  423. <span class="sd"> :param multi: If set to `True` the iterator returned will have a pair</span>
  424. <span class="sd"> for each value of each key. Otherwise it will only</span>
  425. <span class="sd"> contain pairs for the first value of each key.</span>
  426. <span class="sd"> &quot;&quot;&quot;</span>
  427. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
  428. <span class="k">if</span> <span class="n">multi</span><span class="p">:</span>
  429. <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
  430. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  431. <span class="k">else</span><span class="p">:</span>
  432. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  433. <span class="k">def</span> <span class="nf">lists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  434. <span class="sd">&quot;&quot;&quot;Return a list of ``(key, values)`` pairs, where values is the list</span>
  435. <span class="sd"> of all values associated with the key.&quot;&quot;&quot;</span>
  436. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
  437. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
  438. <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  439. <span class="k">return</span> <span class="n">iterkeys</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
  440. <span class="n">__iter__</span> <span class="o">=</span> <span class="n">keys</span>
  441. <span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  442. <span class="sd">&quot;&quot;&quot;Returns an iterator of the first value on every key&#39;s value list.&quot;&quot;&quot;</span>
  443. <span class="k">for</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">itervalues</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="bp">self</span><span class="p">):</span>
  444. <span class="k">yield</span> <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  445. <span class="k">def</span> <span class="nf">listvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  446. <span class="sd">&quot;&quot;&quot;Return an iterator of all values associated with a key. Zipping</span>
  447. <span class="sd"> :meth:`keys` and this is the same as calling :meth:`lists`:</span>
  448. <span class="sd"> &gt;&gt;&gt; d = MultiDict({&quot;foo&quot;: [1, 2, 3]})</span>
  449. <span class="sd"> &gt;&gt;&gt; zip(d.keys(), d.listvalues()) == d.lists()</span>
  450. <span class="sd"> True</span>
  451. <span class="sd"> &quot;&quot;&quot;</span>
  452. <span class="k">return</span> <span class="n">itervalues</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
  453. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  454. <span class="sd">&quot;&quot;&quot;Return a shallow copy of this object.&quot;&quot;&quot;</span>
  455. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  456. <span class="k">def</span> <span class="nf">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  457. <span class="sd">&quot;&quot;&quot;Return a deep copy of this object.&quot;&quot;&quot;</span>
  458. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">(</span><span class="n">deepcopy</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">to_dict</span><span class="p">(</span><span class="n">flat</span><span class="o">=</span><span class="kc">False</span><span class="p">),</span> <span class="n">memo</span><span class="p">))</span>
  459. <span class="k">def</span> <span class="nf">to_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
  460. <span class="sd">&quot;&quot;&quot;Return the contents as regular dict. If `flat` is `True` the</span>
  461. <span class="sd"> returned dict will only have the first item present, if `flat` is</span>
  462. <span class="sd"> `False` all values will be returned as lists.</span>
  463. <span class="sd"> :param flat: If set to `False` the dict returned will have lists</span>
  464. <span class="sd"> with all the values in it. Otherwise it will only</span>
  465. <span class="sd"> contain the first value for each key.</span>
  466. <span class="sd"> :return: a :class:`dict`</span>
  467. <span class="sd"> &quot;&quot;&quot;</span>
  468. <span class="k">if</span> <span class="n">flat</span><span class="p">:</span>
  469. <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  470. <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lists</span><span class="p">())</span>
  471. <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_dict</span><span class="p">):</span>
  472. <span class="sd">&quot;&quot;&quot;update() extends rather than replaces existing key lists:</span>
  473. <span class="sd"> &gt;&gt;&gt; a = MultiDict({&#39;x&#39;: 1})</span>
  474. <span class="sd"> &gt;&gt;&gt; b = MultiDict({&#39;x&#39;: 2, &#39;y&#39;: 3})</span>
  475. <span class="sd"> &gt;&gt;&gt; a.update(b)</span>
  476. <span class="sd"> &gt;&gt;&gt; a</span>
  477. <span class="sd"> MultiDict([(&#39;y&#39;, 3), (&#39;x&#39;, 1), (&#39;x&#39;, 2)])</span>
  478. <span class="sd"> If the value list for a key in ``other_dict`` is empty, no new values</span>
  479. <span class="sd"> will be added to the dict and the key will not be created:</span>
  480. <span class="sd"> &gt;&gt;&gt; x = {&#39;empty_list&#39;: []}</span>
  481. <span class="sd"> &gt;&gt;&gt; y = MultiDict()</span>
  482. <span class="sd"> &gt;&gt;&gt; y.update(x)</span>
  483. <span class="sd"> &gt;&gt;&gt; y</span>
  484. <span class="sd"> MultiDict([])</span>
  485. <span class="sd"> &quot;&quot;&quot;</span>
  486. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iter_multi_items</span><span class="p">(</span><span class="n">other_dict</span><span class="p">):</span>
  487. <span class="n">MultiDict</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  488. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_missing</span><span class="p">):</span>
  489. <span class="sd">&quot;&quot;&quot;Pop the first item for a list on the dict. Afterwards the</span>
  490. <span class="sd"> key is removed from the dict, so additional values are discarded:</span>
  491. <span class="sd"> &gt;&gt;&gt; d = MultiDict({&quot;foo&quot;: [1, 2, 3]})</span>
  492. <span class="sd"> &gt;&gt;&gt; d.pop(&quot;foo&quot;)</span>
  493. <span class="sd"> 1</span>
  494. <span class="sd"> &gt;&gt;&gt; &quot;foo&quot; in d</span>
  495. <span class="sd"> False</span>
  496. <span class="sd"> :param key: the key to pop.</span>
  497. <span class="sd"> :param default: if provided the value to return if the key was</span>
  498. <span class="sd"> not in the dictionary.</span>
  499. <span class="sd"> &quot;&quot;&quot;</span>
  500. <span class="k">try</span><span class="p">:</span>
  501. <span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
  502. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  503. <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_missing</span><span class="p">:</span>
  504. <span class="k">return</span> <span class="n">default</span>
  505. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  506. <span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  507. <span class="sd">&quot;&quot;&quot;Pop an item from the dict.&quot;&quot;&quot;</span>
  508. <span class="k">try</span><span class="p">:</span>
  509. <span class="n">item</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  510. <span class="k">return</span> <span class="p">(</span><span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">item</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span>
  511. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  512. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  513. <span class="k">def</span> <span class="nf">poplist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  514. <span class="sd">&quot;&quot;&quot;Pop the list for a key from the dict. If the key is not in the dict</span>
  515. <span class="sd"> an empty list is returned.</span>
  516. <span class="sd"> .. versionchanged:: 0.5</span>
  517. <span class="sd"> If the key does no longer exist a list is returned instead of</span>
  518. <span class="sd"> raising an error.</span>
  519. <span class="sd"> &quot;&quot;&quot;</span>
  520. <span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="p">[])</span>
  521. <span class="k">def</span> <span class="nf">popitemlist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  522. <span class="sd">&quot;&quot;&quot;Pop a ``(key, list)`` tuple from the dict.&quot;&quot;&quot;</span>
  523. <span class="k">try</span><span class="p">:</span>
  524. <span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  525. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  526. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  527. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  528. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
  529. <span class="k">def</span> <span class="nf">__deepcopy__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">memo</span><span class="p">):</span>
  530. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">deepcopy</span><span class="p">(</span><span class="n">memo</span><span class="o">=</span><span class="n">memo</span><span class="p">)</span>
  531. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  532. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)))</span>
  533. <span class="k">class</span> <span class="nc">_omd_bucket</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  534. <span class="sd">&quot;&quot;&quot;Wraps values in the :class:`OrderedMultiDict`. This makes it</span>
  535. <span class="sd"> possible to keep an order over multiple different keys. It requires</span>
  536. <span class="sd"> a lot of extra memory and slows down access a lot, but makes it</span>
  537. <span class="sd"> possible to access elements in O(1) and iterate in O(n).</span>
  538. <span class="sd"> &quot;&quot;&quot;</span>
  539. <span class="n">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">&#39;prev&#39;</span><span class="p">,</span> <span class="s1">&#39;key&#39;</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">,</span> <span class="s1">&#39;next&#39;</span><span class="p">)</span>
  540. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">omd</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  541. <span class="bp">self</span><span class="o">.</span><span class="n">prev</span> <span class="o">=</span> <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span>
  542. <span class="bp">self</span><span class="o">.</span><span class="n">key</span> <span class="o">=</span> <span class="n">key</span>
  543. <span class="bp">self</span><span class="o">.</span><span class="n">value</span> <span class="o">=</span> <span class="n">value</span>
  544. <span class="bp">self</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="kc">None</span>
  545. <span class="k">if</span> <span class="n">omd</span><span class="o">.</span><span class="n">_first_bucket</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  546. <span class="n">omd</span><span class="o">.</span><span class="n">_first_bucket</span> <span class="o">=</span> <span class="bp">self</span>
  547. <span class="k">if</span> <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  548. <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="bp">self</span>
  549. <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span> <span class="o">=</span> <span class="bp">self</span>
  550. <span class="k">def</span> <span class="nf">unlink</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">omd</span><span class="p">):</span>
  551. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">prev</span><span class="p">:</span>
  552. <span class="bp">self</span><span class="o">.</span><span class="n">prev</span><span class="o">.</span><span class="n">next</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
  553. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="p">:</span>
  554. <span class="bp">self</span><span class="o">.</span><span class="n">next</span><span class="o">.</span><span class="n">prev</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prev</span>
  555. <span class="k">if</span> <span class="n">omd</span><span class="o">.</span><span class="n">_first_bucket</span> <span class="ow">is</span> <span class="bp">self</span><span class="p">:</span>
  556. <span class="n">omd</span><span class="o">.</span><span class="n">_first_bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">next</span>
  557. <span class="k">if</span> <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span> <span class="ow">is</span> <span class="bp">self</span><span class="p">:</span>
  558. <span class="n">omd</span><span class="o">.</span><span class="n">_last_bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prev</span>
  559. <span class="nd">@native_itermethods</span><span class="p">([</span><span class="s1">&#39;keys&#39;</span><span class="p">,</span> <span class="s1">&#39;values&#39;</span><span class="p">,</span> <span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="s1">&#39;lists&#39;</span><span class="p">,</span> <span class="s1">&#39;listvalues&#39;</span><span class="p">])</span>
  560. <span class="k">class</span> <span class="nc">OrderedMultiDict</span><span class="p">(</span><span class="n">MultiDict</span><span class="p">):</span>
  561. <span class="sd">&quot;&quot;&quot;Works like a regular :class:`MultiDict` but preserves the</span>
  562. <span class="sd"> order of the fields. To convert the ordered multi dict into a</span>
  563. <span class="sd"> list you can use the :meth:`items` method and pass it ``multi=True``.</span>
  564. <span class="sd"> In general an :class:`OrderedMultiDict` is an order of magnitude</span>
  565. <span class="sd"> slower than a :class:`MultiDict`.</span>
  566. <span class="sd"> .. admonition:: note</span>
  567. <span class="sd"> Due to a limitation in Python you cannot convert an ordered</span>
  568. <span class="sd"> multi dict into a regular dict by using ``dict(multidict)``.</span>
  569. <span class="sd"> Instead you have to use the :meth:`to_dict` method, otherwise</span>
  570. <span class="sd"> the internal bucket objects are exposed.</span>
  571. <span class="sd"> &quot;&quot;&quot;</span>
  572. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  573. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  574. <span class="bp">self</span><span class="o">.</span><span class="n">_first_bucket</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_last_bucket</span> <span class="o">=</span> <span class="kc">None</span>
  575. <span class="k">if</span> <span class="n">mapping</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  576. <span class="n">OrderedMultiDict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="p">)</span>
  577. <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  578. <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">MultiDict</span><span class="p">):</span>
  579. <span class="k">return</span> <span class="bp">NotImplemented</span>
  580. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">OrderedMultiDict</span><span class="p">):</span>
  581. <span class="n">iter1</span> <span class="o">=</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  582. <span class="n">iter2</span> <span class="o">=</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  583. <span class="k">try</span><span class="p">:</span>
  584. <span class="k">for</span> <span class="n">k1</span><span class="p">,</span> <span class="n">v1</span> <span class="ow">in</span> <span class="n">iter1</span><span class="p">:</span>
  585. <span class="n">k2</span><span class="p">,</span> <span class="n">v2</span> <span class="o">=</span> <span class="nb">next</span><span class="p">(</span><span class="n">iter2</span><span class="p">)</span>
  586. <span class="k">if</span> <span class="n">k1</span> <span class="o">!=</span> <span class="n">k2</span> <span class="ow">or</span> <span class="n">v1</span> <span class="o">!=</span> <span class="n">v2</span><span class="p">:</span>
  587. <span class="k">return</span> <span class="kc">False</span>
  588. <span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
  589. <span class="k">return</span> <span class="kc">False</span>
  590. <span class="k">try</span><span class="p">:</span>
  591. <span class="nb">next</span><span class="p">(</span><span class="n">iter2</span><span class="p">)</span>
  592. <span class="k">except</span> <span class="ne">StopIteration</span><span class="p">:</span>
  593. <span class="k">return</span> <span class="kc">True</span>
  594. <span class="k">return</span> <span class="kc">False</span>
  595. <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">other</span><span class="p">):</span>
  596. <span class="k">return</span> <span class="kc">False</span>
  597. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">iterlists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  598. <span class="k">if</span> <span class="n">other</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">!=</span> <span class="n">values</span><span class="p">:</span>
  599. <span class="k">return</span> <span class="kc">False</span>
  600. <span class="k">return</span> <span class="kc">True</span>
  601. <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  602. <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
  603. <span class="k">def</span> <span class="nf">__reduce_ex__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
  604. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">)),)</span>
  605. <span class="k">def</span> <span class="nf">__getstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  606. <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
  607. <span class="k">def</span> <span class="nf">__setstate__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
  608. <span class="nb">dict</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  609. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
  610. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  611. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  612. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  613. <span class="k">return</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
  614. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  615. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  616. <span class="bp">self</span><span class="o">.</span><span class="n">poplist</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  617. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  618. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  619. <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  620. <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  621. <span class="k">return</span> <span class="p">(</span><span class="n">key</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  622. <span class="n">__iter__</span> <span class="o">=</span> <span class="n">keys</span>
  623. <span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  624. <span class="k">return</span> <span class="p">(</span><span class="n">value</span> <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  625. <span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  626. <span class="n">ptr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_first_bucket</span>
  627. <span class="k">if</span> <span class="n">multi</span><span class="p">:</span>
  628. <span class="k">while</span> <span class="n">ptr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  629. <span class="k">yield</span> <span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">ptr</span><span class="o">.</span><span class="n">value</span>
  630. <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="o">.</span><span class="n">next</span>
  631. <span class="k">else</span><span class="p">:</span>
  632. <span class="n">returned_keys</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
  633. <span class="k">while</span> <span class="n">ptr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  634. <span class="k">if</span> <span class="n">ptr</span><span class="o">.</span><span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">returned_keys</span><span class="p">:</span>
  635. <span class="n">returned_keys</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
  636. <span class="k">yield</span> <span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="n">ptr</span><span class="o">.</span><span class="n">value</span>
  637. <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="o">.</span><span class="n">next</span>
  638. <span class="k">def</span> <span class="nf">lists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  639. <span class="n">returned_keys</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
  640. <span class="n">ptr</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_first_bucket</span>
  641. <span class="k">while</span> <span class="n">ptr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  642. <span class="k">if</span> <span class="n">ptr</span><span class="o">.</span><span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">returned_keys</span><span class="p">:</span>
  643. <span class="k">yield</span> <span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
  644. <span class="n">returned_keys</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">ptr</span><span class="o">.</span><span class="n">key</span><span class="p">)</span>
  645. <span class="n">ptr</span> <span class="o">=</span> <span class="n">ptr</span><span class="o">.</span><span class="n">next</span>
  646. <span class="k">def</span> <span class="nf">listvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  647. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">iterlists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  648. <span class="k">yield</span> <span class="n">values</span>
  649. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  650. <span class="nb">dict</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_omd_bucket</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
  651. <span class="k">def</span> <span class="nf">getlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  652. <span class="k">try</span><span class="p">:</span>
  653. <span class="n">rv</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  654. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  655. <span class="k">return</span> <span class="p">[]</span>
  656. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  657. <span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">rv</span><span class="p">]</span>
  658. <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
  659. <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">rv</span><span class="p">:</span>
  660. <span class="k">try</span><span class="p">:</span>
  661. <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">value</span><span class="p">))</span>
  662. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  663. <span class="k">pass</span>
  664. <span class="k">return</span> <span class="n">result</span>
  665. <span class="k">def</span> <span class="nf">setlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">new_list</span><span class="p">):</span>
  666. <span class="bp">self</span><span class="o">.</span><span class="n">poplist</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  667. <span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">new_list</span><span class="p">:</span>
  668. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  669. <span class="k">def</span> <span class="nf">setlistdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default_list</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  670. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;setlistdefault is unsupported for &#39;</span>
  671. <span class="s1">&#39;ordered multi dicts&#39;</span><span class="p">)</span>
  672. <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mapping</span><span class="p">):</span>
  673. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iter_multi_items</span><span class="p">(</span><span class="n">mapping</span><span class="p">):</span>
  674. <span class="n">OrderedMultiDict</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  675. <span class="k">def</span> <span class="nf">poplist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  676. <span class="n">buckets</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="p">())</span>
  677. <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">:</span>
  678. <span class="n">bucket</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  679. <span class="k">return</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">]</span>
  680. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_missing</span><span class="p">):</span>
  681. <span class="k">try</span><span class="p">:</span>
  682. <span class="n">buckets</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  683. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  684. <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_missing</span><span class="p">:</span>
  685. <span class="k">return</span> <span class="n">default</span>
  686. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  687. <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">:</span>
  688. <span class="n">bucket</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  689. <span class="k">return</span> <span class="n">buckets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
  690. <span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  691. <span class="k">try</span><span class="p">:</span>
  692. <span class="n">key</span><span class="p">,</span> <span class="n">buckets</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  693. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  694. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  695. <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">:</span>
  696. <span class="n">bucket</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  697. <span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="n">buckets</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">value</span>
  698. <span class="k">def</span> <span class="nf">popitemlist</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  699. <span class="k">try</span><span class="p">:</span>
  700. <span class="n">key</span><span class="p">,</span> <span class="n">buckets</span> <span class="o">=</span> <span class="nb">dict</span><span class="o">.</span><span class="n">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  701. <span class="k">except</span> <span class="ne">KeyError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
  702. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span>
  703. <span class="k">for</span> <span class="n">bucket</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">:</span>
  704. <span class="n">bucket</span><span class="o">.</span><span class="n">unlink</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  705. <span class="k">return</span> <span class="n">key</span><span class="p">,</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">value</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">buckets</span><span class="p">]</span>
  706. <span class="k">def</span> <span class="nf">_options_header_vkw</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">kw</span><span class="p">):</span>
  707. <span class="k">return</span> <span class="n">dump_options_header</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">dict</span><span class="p">((</span><span class="n">k</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">),</span> <span class="n">v</span><span class="p">)</span>
  708. <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">kw</span><span class="o">.</span><span class="n">items</span><span class="p">()))</span>
  709. <span class="k">def</span> <span class="nf">_unicodify_header_value</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
  710. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
  711. <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;latin-1&#39;</span><span class="p">)</span>
  712. <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">text_type</span><span class="p">):</span>
  713. <span class="n">value</span> <span class="o">=</span> <span class="n">text_type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  714. <span class="k">return</span> <span class="n">value</span>
  715. <span class="nd">@native_itermethods</span><span class="p">([</span><span class="s1">&#39;keys&#39;</span><span class="p">,</span> <span class="s1">&#39;values&#39;</span><span class="p">,</span> <span class="s1">&#39;items&#39;</span><span class="p">])</span>
  716. <span class="k">class</span> <span class="nc">Headers</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  717. <span class="sd">&quot;&quot;&quot;An object that stores some headers. It has a dict-like interface</span>
  718. <span class="sd"> but is ordered and can store the same keys multiple times.</span>
  719. <span class="sd"> This data structure is useful if you want a nicer way to handle WSGI</span>
  720. <span class="sd"> headers which are stored as tuples in a list.</span>
  721. <span class="sd"> From Werkzeug 0.3 onwards, the :exc:`KeyError` raised by this class is</span>
  722. <span class="sd"> also a subclass of the :class:`~exceptions.BadRequest` HTTP exception</span>
  723. <span class="sd"> and will render a page for a ``400 BAD REQUEST`` if caught in a</span>
  724. <span class="sd"> catch-all for HTTP exceptions.</span>
  725. <span class="sd"> Headers is mostly compatible with the Python :class:`wsgiref.headers.Headers`</span>
  726. <span class="sd"> class, with the exception of `__getitem__`. :mod:`wsgiref` will return</span>
  727. <span class="sd"> `None` for ``headers[&#39;missing&#39;]``, whereas :class:`Headers` will raise</span>
  728. <span class="sd"> a :class:`KeyError`.</span>
  729. <span class="sd"> To create a new :class:`Headers` object pass it a list or dict of headers</span>
  730. <span class="sd"> which are used as default values. This does not reuse the list passed</span>
  731. <span class="sd"> to the constructor for internal usage.</span>
  732. <span class="sd"> :param defaults: The list of default values for the :class:`Headers`.</span>
  733. <span class="sd"> .. versionchanged:: 0.9</span>
  734. <span class="sd"> This data structure now stores unicode values similar to how the</span>
  735. <span class="sd"> multi dicts do it. The main difference is that bytes can be set as</span>
  736. <span class="sd"> well which will automatically be latin1 decoded.</span>
  737. <span class="sd"> .. versionchanged:: 0.9</span>
  738. <span class="sd"> The :meth:`linked` function was removed without replacement as it</span>
  739. <span class="sd"> was an API that does not support the changes to the encoding model.</span>
  740. <span class="sd"> &quot;&quot;&quot;</span>
  741. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">defaults</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  742. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span> <span class="o">=</span> <span class="p">[]</span>
  743. <span class="k">if</span> <span class="n">defaults</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  744. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">defaults</span><span class="p">,</span> <span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">Headers</span><span class="p">)):</span>
  745. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span>
  746. <span class="k">else</span><span class="p">:</span>
  747. <span class="bp">self</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span>
  748. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">_get_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  749. <span class="k">if</span> <span class="ow">not</span> <span class="n">_get_mode</span><span class="p">:</span>
  750. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">):</span>
  751. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  752. <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">slice</span><span class="p">):</span>
  753. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
  754. <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
  755. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  756. <span class="n">ikey</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  757. <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">:</span>
  758. <span class="k">if</span> <span class="n">k</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">ikey</span><span class="p">:</span>
  759. <span class="k">return</span> <span class="n">v</span>
  760. <span class="c1"># micro optimization: if we are in get mode we will catch that</span>
  761. <span class="c1"># exception one stack level down so we can raise a standard</span>
  762. <span class="c1"># key error instead of our special one.</span>
  763. <span class="k">if</span> <span class="n">_get_mode</span><span class="p">:</span>
  764. <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">()</span>
  765. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  766. <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  767. <span class="k">return</span> <span class="n">other</span><span class="o">.</span><span class="n">__class__</span> <span class="ow">is</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span> <span class="ow">and</span> \
  768. <span class="nb">set</span><span class="p">(</span><span class="n">other</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span> <span class="o">==</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span>
  769. <span class="k">def</span> <span class="nf">__ne__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  770. <span class="k">return</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">__eq__</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
  771. <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">as_bytes</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  772. <span class="sd">&quot;&quot;&quot;Return the default value if the requested data doesn&#39;t exist.</span>
  773. <span class="sd"> If `type` is provided and is a callable it should convert the value,</span>
  774. <span class="sd"> return it or raise a :exc:`ValueError` if that is not possible. In</span>
  775. <span class="sd"> this case the function will return the default as if the value was not</span>
  776. <span class="sd"> found:</span>
  777. <span class="sd"> &gt;&gt;&gt; d = Headers([(&#39;Content-Length&#39;, &#39;42&#39;)])</span>
  778. <span class="sd"> &gt;&gt;&gt; d.get(&#39;Content-Length&#39;, type=int)</span>
  779. <span class="sd"> 42</span>
  780. <span class="sd"> If a headers object is bound you must not add unicode strings</span>
  781. <span class="sd"> because no encoding takes place.</span>
  782. <span class="sd"> .. versionadded:: 0.9</span>
  783. <span class="sd"> Added support for `as_bytes`.</span>
  784. <span class="sd"> :param key: The key to be looked up.</span>
  785. <span class="sd"> :param default: The default value to be returned if the key can&#39;t</span>
  786. <span class="sd"> be looked up. If not further specified `None` is</span>
  787. <span class="sd"> returned.</span>
  788. <span class="sd"> :param type: A callable that is used to cast the value in the</span>
  789. <span class="sd"> :class:`Headers`. If a :exc:`ValueError` is raised</span>
  790. <span class="sd"> by this callable the default value is returned.</span>
  791. <span class="sd"> :param as_bytes: return bytes instead of unicode strings.</span>
  792. <span class="sd"> &quot;&quot;&quot;</span>
  793. <span class="k">try</span><span class="p">:</span>
  794. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">_get_mode</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  795. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  796. <span class="k">return</span> <span class="n">default</span>
  797. <span class="k">if</span> <span class="n">as_bytes</span><span class="p">:</span>
  798. <span class="n">rv</span> <span class="o">=</span> <span class="n">rv</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;latin1&#39;</span><span class="p">)</span>
  799. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  800. <span class="k">return</span> <span class="n">rv</span>
  801. <span class="k">try</span><span class="p">:</span>
  802. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
  803. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  804. <span class="k">return</span> <span class="n">default</span>
  805. <span class="k">def</span> <span class="nf">getlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">as_bytes</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  806. <span class="sd">&quot;&quot;&quot;Return the list of items for a given key. If that key is not in the</span>
  807. <span class="sd"> :class:`Headers`, the return value will be an empty list. Just as</span>
  808. <span class="sd"> :meth:`get` :meth:`getlist` accepts a `type` parameter. All items will</span>
  809. <span class="sd"> be converted with the callable defined there.</span>
  810. <span class="sd"> .. versionadded:: 0.9</span>
  811. <span class="sd"> Added support for `as_bytes`.</span>
  812. <span class="sd"> :param key: The key to be looked up.</span>
  813. <span class="sd"> :param type: A callable that is used to cast the value in the</span>
  814. <span class="sd"> :class:`Headers`. If a :exc:`ValueError` is raised</span>
  815. <span class="sd"> by this callable the value will be removed from the list.</span>
  816. <span class="sd"> :return: a :class:`list` of all the values for the key.</span>
  817. <span class="sd"> :param as_bytes: return bytes instead of unicode strings.</span>
  818. <span class="sd"> &quot;&quot;&quot;</span>
  819. <span class="n">ikey</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  820. <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
  821. <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  822. <span class="k">if</span> <span class="n">k</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">ikey</span><span class="p">:</span>
  823. <span class="k">if</span> <span class="n">as_bytes</span><span class="p">:</span>
  824. <span class="n">v</span> <span class="o">=</span> <span class="n">v</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;latin1&#39;</span><span class="p">)</span>
  825. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  826. <span class="k">try</span><span class="p">:</span>
  827. <span class="n">v</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
  828. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  829. <span class="k">continue</span>
  830. <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">v</span><span class="p">)</span>
  831. <span class="k">return</span> <span class="n">result</span>
  832. <span class="k">def</span> <span class="nf">get_all</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
  833. <span class="sd">&quot;&quot;&quot;Return a list of all the values for the named field.</span>
  834. <span class="sd"> This method is compatible with the :mod:`wsgiref`</span>
  835. <span class="sd"> :meth:`~wsgiref.headers.Headers.get_all` method.</span>
  836. <span class="sd"> &quot;&quot;&quot;</span>
  837. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
  838. <span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lower</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  839. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  840. <span class="k">if</span> <span class="n">lower</span><span class="p">:</span>
  841. <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  842. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  843. <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lower</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  844. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">lower</span><span class="p">):</span>
  845. <span class="k">yield</span> <span class="n">key</span>
  846. <span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  847. <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  848. <span class="k">yield</span> <span class="n">value</span>
  849. <span class="k">def</span> <span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterable</span><span class="p">):</span>
  850. <span class="sd">&quot;&quot;&quot;Extend the headers with a dict or an iterable yielding keys and</span>
  851. <span class="sd"> values.</span>
  852. <span class="sd"> &quot;&quot;&quot;</span>
  853. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">iterable</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  854. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">iterable</span><span class="p">):</span>
  855. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="p">(</span><span class="nb">tuple</span><span class="p">,</span> <span class="nb">list</span><span class="p">)):</span>
  856. <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
  857. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
  858. <span class="k">else</span><span class="p">:</span>
  859. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  860. <span class="k">else</span><span class="p">:</span>
  861. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
  862. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  863. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">_index_operation</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
  864. <span class="k">if</span> <span class="n">_index_operation</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">(</span><span class="n">integer_types</span><span class="p">,</span> <span class="nb">slice</span><span class="p">)):</span>
  865. <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  866. <span class="k">return</span>
  867. <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  868. <span class="n">new</span> <span class="o">=</span> <span class="p">[]</span>
  869. <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">:</span>
  870. <span class="k">if</span> <span class="n">k</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">key</span><span class="p">:</span>
  871. <span class="n">new</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">))</span>
  872. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">new</span>
  873. <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  874. <span class="sd">&quot;&quot;&quot;Remove a key.</span>
  875. <span class="sd"> :param key: The key to be removed.</span>
  876. <span class="sd"> &quot;&quot;&quot;</span>
  877. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__delitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">_index_operation</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
  878. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">_missing</span><span class="p">):</span>
  879. <span class="sd">&quot;&quot;&quot;Removes and returns a key or index.</span>
  880. <span class="sd"> :param key: The key to be popped. If this is an integer the item at</span>
  881. <span class="sd"> that position is removed, if it&#39;s a string the value for</span>
  882. <span class="sd"> that key is. If the key is omitted or `None` the last</span>
  883. <span class="sd"> item is removed.</span>
  884. <span class="sd"> :return: an item.</span>
  885. <span class="sd"> &quot;&quot;&quot;</span>
  886. <span class="k">if</span> <span class="n">key</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  887. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
  888. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">):</span>
  889. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  890. <span class="k">try</span><span class="p">:</span>
  891. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  892. <span class="bp">self</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  893. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  894. <span class="k">if</span> <span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_missing</span><span class="p">:</span>
  895. <span class="k">return</span> <span class="n">default</span>
  896. <span class="k">raise</span>
  897. <span class="k">return</span> <span class="n">rv</span>
  898. <span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  899. <span class="sd">&quot;&quot;&quot;Removes a key or index and returns a (key, value) item.&quot;&quot;&quot;</span>
  900. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
  901. <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  902. <span class="sd">&quot;&quot;&quot;Check if a key is present.&quot;&quot;&quot;</span>
  903. <span class="k">try</span><span class="p">:</span>
  904. <span class="bp">self</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">_get_mode</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
  905. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  906. <span class="k">return</span> <span class="kc">False</span>
  907. <span class="k">return</span> <span class="kc">True</span>
  908. <span class="n">has_key</span> <span class="o">=</span> <span class="n">__contains__</span>
  909. <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  910. <span class="sd">&quot;&quot;&quot;Yield ``(key, value)`` tuples.&quot;&quot;&quot;</span>
  911. <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span>
  912. <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  913. <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span>
  914. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
  915. <span class="sd">&quot;&quot;&quot;Add a new header tuple to the list.</span>
  916. <span class="sd"> Keyword arguments can specify additional parameters for the header</span>
  917. <span class="sd"> value, with underscores converted to dashes::</span>
  918. <span class="sd"> &gt;&gt;&gt; d = Headers()</span>
  919. <span class="sd"> &gt;&gt;&gt; d.add(&#39;Content-Type&#39;, &#39;text/plain&#39;)</span>
  920. <span class="sd"> &gt;&gt;&gt; d.add(&#39;Content-Disposition&#39;, &#39;attachment&#39;, filename=&#39;foo.png&#39;)</span>
  921. <span class="sd"> The keyword argument dumping uses :func:`dump_options_header`</span>
  922. <span class="sd"> behind the scenes.</span>
  923. <span class="sd"> .. versionadded:: 0.4.1</span>
  924. <span class="sd"> keyword arguments were added for :mod:`wsgiref` compatibility.</span>
  925. <span class="sd"> &quot;&quot;&quot;</span>
  926. <span class="k">if</span> <span class="n">kw</span><span class="p">:</span>
  927. <span class="n">_value</span> <span class="o">=</span> <span class="n">_options_header_vkw</span><span class="p">(</span><span class="n">_value</span><span class="p">,</span> <span class="n">kw</span><span class="p">)</span>
  928. <span class="n">_value</span> <span class="o">=</span> <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="n">_value</span><span class="p">)</span>
  929. <span class="bp">self</span><span class="o">.</span><span class="n">_validate_value</span><span class="p">(</span><span class="n">_value</span><span class="p">)</span>
  930. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">))</span>
  931. <span class="k">def</span> <span class="nf">_validate_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  932. <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">text_type</span><span class="p">):</span>
  933. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;Value should be unicode.&#39;</span><span class="p">)</span>
  934. <span class="k">if</span> <span class="s1">u&#39;</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="ow">in</span> <span class="n">value</span> <span class="ow">or</span> <span class="s1">u&#39;</span><span class="se">\r</span><span class="s1">&#39;</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
  935. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;Detected newline in header value. This is &#39;</span>
  936. <span class="s1">&#39;a potential security problem&#39;</span><span class="p">)</span>
  937. <span class="k">def</span> <span class="nf">add_header</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">,</span> <span class="o">**</span><span class="n">_kw</span><span class="p">):</span>
  938. <span class="sd">&quot;&quot;&quot;Add a new header tuple to the list.</span>
  939. <span class="sd"> An alias for :meth:`add` for compatibility with the :mod:`wsgiref`</span>
  940. <span class="sd"> :meth:`~wsgiref.headers.Headers.add_header` method.</span>
  941. <span class="sd"> &quot;&quot;&quot;</span>
  942. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">,</span> <span class="o">**</span><span class="n">_kw</span><span class="p">)</span>
  943. <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  944. <span class="sd">&quot;&quot;&quot;Clears all headers.&quot;&quot;&quot;</span>
  945. <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[:]</span>
  946. <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
  947. <span class="sd">&quot;&quot;&quot;Remove all header tuples for `key` and add a new one. The newly</span>
  948. <span class="sd"> added key either appears at the end of the list if there was no</span>
  949. <span class="sd"> entry or replaces the first one.</span>
  950. <span class="sd"> Keyword arguments can specify additional parameters for the header</span>
  951. <span class="sd"> value, with underscores converted to dashes. See :meth:`add` for</span>
  952. <span class="sd"> more information.</span>
  953. <span class="sd"> .. versionchanged:: 0.6.1</span>
  954. <span class="sd"> :meth:`set` now accepts the same arguments as :meth:`add`.</span>
  955. <span class="sd"> :param key: The key to be inserted.</span>
  956. <span class="sd"> :param value: The value to be inserted.</span>
  957. <span class="sd"> &quot;&quot;&quot;</span>
  958. <span class="k">if</span> <span class="n">kw</span><span class="p">:</span>
  959. <span class="n">_value</span> <span class="o">=</span> <span class="n">_options_header_vkw</span><span class="p">(</span><span class="n">_value</span><span class="p">,</span> <span class="n">kw</span><span class="p">)</span>
  960. <span class="n">_value</span> <span class="o">=</span> <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="n">_value</span><span class="p">)</span>
  961. <span class="bp">self</span><span class="o">.</span><span class="n">_validate_value</span><span class="p">(</span><span class="n">_value</span><span class="p">)</span>
  962. <span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">:</span>
  963. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">))</span>
  964. <span class="k">return</span>
  965. <span class="n">listiter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span>
  966. <span class="n">ikey</span> <span class="o">=</span> <span class="n">_key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  967. <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="p">(</span><span class="n">old_key</span><span class="p">,</span> <span class="n">old_value</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">listiter</span><span class="p">):</span>
  968. <span class="k">if</span> <span class="n">old_key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">ikey</span><span class="p">:</span>
  969. <span class="c1"># replace first ocurrence</span>
  970. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">)</span>
  971. <span class="k">break</span>
  972. <span class="k">else</span><span class="p">:</span>
  973. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">_key</span><span class="p">,</span> <span class="n">_value</span><span class="p">))</span>
  974. <span class="k">return</span>
  975. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">idx</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:]</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">listiter</span> <span class="k">if</span> <span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">!=</span> <span class="n">ikey</span><span class="p">]</span>
  976. <span class="k">def</span> <span class="nf">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  977. <span class="sd">&quot;&quot;&quot;Returns the value for the key if it is in the dict, otherwise it</span>
  978. <span class="sd"> returns `default` and sets that value for `key`.</span>
  979. <span class="sd"> :param key: The key to be looked up.</span>
  980. <span class="sd"> :param default: The default value to be returned if the key is not</span>
  981. <span class="sd"> in the dict. If not further specified it&#39;s `None`.</span>
  982. <span class="sd"> &quot;&quot;&quot;</span>
  983. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  984. <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  985. <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  986. <span class="k">return</span> <span class="n">value</span>
  987. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  988. <span class="sd">&quot;&quot;&quot;Like :meth:`set` but also supports index/slice based setting.&quot;&quot;&quot;</span>
  989. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">(</span><span class="nb">slice</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">)):</span>
  990. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">):</span>
  991. <span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="n">value</span><span class="p">]</span>
  992. <span class="n">value</span> <span class="o">=</span> <span class="p">[(</span><span class="n">k</span><span class="p">,</span> <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="n">v</span><span class="p">))</span> <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
  993. <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_validate_value</span><span class="p">(</span><span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="ow">in</span> <span class="n">value</span><span class="p">]</span>
  994. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">integer_types</span><span class="p">):</span>
  995. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  996. <span class="k">else</span><span class="p">:</span>
  997. <span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
  998. <span class="k">else</span><span class="p">:</span>
  999. <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  1000. <span class="k">def</span> <span class="nf">to_list</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">charset</span><span class="o">=</span><span class="s1">&#39;iso-8859-1&#39;</span><span class="p">):</span>
  1001. <span class="sd">&quot;&quot;&quot;Convert the headers into a list suitable for WSGI.&quot;&quot;&quot;</span>
  1002. <span class="kn">from</span> <span class="nn">warnings</span> <span class="k">import</span> <span class="n">warn</span>
  1003. <span class="n">warn</span><span class="p">(</span><span class="ne">DeprecationWarning</span><span class="p">(</span><span class="s1">&#39;Method removed, use to_wsgi_list instead&#39;</span><span class="p">),</span>
  1004. <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
  1005. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_wsgi_list</span><span class="p">()</span>
  1006. <span class="k">def</span> <span class="nf">to_wsgi_list</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1007. <span class="sd">&quot;&quot;&quot;Convert the headers into a list suitable for WSGI.</span>
  1008. <span class="sd"> The values are byte strings in Python 2 converted to latin1 and unicode</span>
  1009. <span class="sd"> strings in Python 3 for the WSGI server to encode.</span>
  1010. <span class="sd"> :return: list</span>
  1011. <span class="sd"> &quot;&quot;&quot;</span>
  1012. <span class="k">if</span> <span class="n">PY2</span><span class="p">:</span>
  1013. <span class="k">return</span> <span class="p">[(</span><span class="n">to_native</span><span class="p">(</span><span class="n">k</span><span class="p">),</span> <span class="n">v</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;latin1&#39;</span><span class="p">))</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">]</span>
  1014. <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1015. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1016. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_list</span><span class="p">)</span>
  1017. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1018. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
  1019. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1020. <span class="sd">&quot;&quot;&quot;Returns formatted headers suitable for HTTP transmission.&quot;&quot;&quot;</span>
  1021. <span class="n">strs</span> <span class="o">=</span> <span class="p">[]</span>
  1022. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_wsgi_list</span><span class="p">():</span>
  1023. <span class="n">strs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
  1024. <span class="n">strs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</span><span class="p">)</span>
  1025. <span class="k">return</span> <span class="s1">&#39;</span><span class="se">\r\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">strs</span><span class="p">)</span>
  1026. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1027. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1028. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1029. <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1030. <span class="p">)</span>
  1031. <span class="k">class</span> <span class="nc">ImmutableHeadersMixin</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1032. <span class="sd">&quot;&quot;&quot;Makes a :class:`Headers` immutable. We do not mark them as</span>
  1033. <span class="sd"> hashable though since the only usecase for this datastructure</span>
  1034. <span class="sd"> in Werkzeug is a view on a mutable structure.</span>
  1035. <span class="sd"> .. versionadded:: 0.5</span>
  1036. <span class="sd"> :private:</span>
  1037. <span class="sd"> &quot;&quot;&quot;</span>
  1038. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1039. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1040. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  1041. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1042. <span class="nb">set</span> <span class="o">=</span> <span class="n">__setitem__</span>
  1043. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1044. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1045. <span class="n">remove</span> <span class="o">=</span> <span class="n">add_header</span> <span class="o">=</span> <span class="n">add</span>
  1046. <span class="k">def</span> <span class="nf">extend</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterable</span><span class="p">):</span>
  1047. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1048. <span class="k">def</span> <span class="nf">insert</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  1049. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1050. <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">index</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span>
  1051. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1052. <span class="k">def</span> <span class="nf">popitem</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1053. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1054. <span class="k">def</span> <span class="nf">setdefault</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="p">):</span>
  1055. <span class="n">is_immutable</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1056. <span class="k">class</span> <span class="nc">EnvironHeaders</span><span class="p">(</span><span class="n">ImmutableHeadersMixin</span><span class="p">,</span> <span class="n">Headers</span><span class="p">):</span>
  1057. <span class="sd">&quot;&quot;&quot;Read only version of the headers from a WSGI environment. This</span>
  1058. <span class="sd"> provides the same interface as `Headers` and is constructed from</span>
  1059. <span class="sd"> a WSGI environment.</span>
  1060. <span class="sd"> From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a</span>
  1061. <span class="sd"> subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will</span>
  1062. <span class="sd"> render a page for a ``400 BAD REQUEST`` if caught in a catch-all for</span>
  1063. <span class="sd"> HTTP exceptions.</span>
  1064. <span class="sd"> &quot;&quot;&quot;</span>
  1065. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">environ</span><span class="p">):</span>
  1066. <span class="bp">self</span><span class="o">.</span><span class="n">environ</span> <span class="o">=</span> <span class="n">environ</span>
  1067. <span class="k">def</span> <span class="nf">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
  1068. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">environ</span> <span class="ow">is</span> <span class="n">other</span><span class="o">.</span><span class="n">environ</span>
  1069. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">_get_mode</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1070. <span class="c1"># _get_mode is a no-op for this class as there is no index but</span>
  1071. <span class="c1"># used because get() calls it.</span>
  1072. <span class="n">key</span> <span class="o">=</span> <span class="n">key</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
  1073. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;CONTENT_TYPE&#39;</span><span class="p">,</span> <span class="s1">&#39;CONTENT_LENGTH&#39;</span><span class="p">):</span>
  1074. <span class="k">return</span> <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
  1075. <span class="k">return</span> <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">&#39;HTTP_&#39;</span> <span class="o">+</span> <span class="n">key</span><span class="p">])</span>
  1076. <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1077. <span class="c1"># the iter is necessary because otherwise list calls our</span>
  1078. <span class="c1"># len which would call list again and so forth.</span>
  1079. <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="p">)))</span>
  1080. <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1081. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">environ</span><span class="p">):</span>
  1082. <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;HTTP_&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> \
  1083. <span class="p">(</span><span class="s1">&#39;HTTP_CONTENT_TYPE&#39;</span><span class="p">,</span> <span class="s1">&#39;HTTP_CONTENT_LENGTH&#39;</span><span class="p">):</span>
  1084. <span class="k">yield</span> <span class="p">(</span><span class="n">key</span><span class="p">[</span><span class="mi">5</span><span class="p">:]</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">title</span><span class="p">(),</span>
  1085. <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
  1086. <span class="k">elif</span> <span class="n">key</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;CONTENT_TYPE&#39;</span><span class="p">,</span> <span class="s1">&#39;CONTENT_LENGTH&#39;</span><span class="p">):</span>
  1087. <span class="k">yield</span> <span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;_&#39;</span><span class="p">,</span> <span class="s1">&#39;-&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">title</span><span class="p">(),</span>
  1088. <span class="n">_unicodify_header_value</span><span class="p">(</span><span class="n">value</span><span class="p">))</span>
  1089. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1090. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;cannot create </span><span class="si">%r</span><span class="s1"> copies&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
  1091. <span class="nd">@native_itermethods</span><span class="p">([</span><span class="s1">&#39;keys&#39;</span><span class="p">,</span> <span class="s1">&#39;values&#39;</span><span class="p">,</span> <span class="s1">&#39;items&#39;</span><span class="p">,</span> <span class="s1">&#39;lists&#39;</span><span class="p">,</span> <span class="s1">&#39;listvalues&#39;</span><span class="p">])</span>
  1092. <span class="k">class</span> <span class="nc">CombinedMultiDict</span><span class="p">(</span><span class="n">ImmutableMultiDictMixin</span><span class="p">,</span> <span class="n">MultiDict</span><span class="p">):</span>
  1093. <span class="sd">&quot;&quot;&quot;A read only :class:`MultiDict` that you can pass multiple :class:`MultiDict`</span>
  1094. <span class="sd"> instances as sequence and it will combine the return values of all wrapped</span>
  1095. <span class="sd"> dicts:</span>
  1096. <span class="sd"> &gt;&gt;&gt; from werkzeug.datastructures import CombinedMultiDict, MultiDict</span>
  1097. <span class="sd"> &gt;&gt;&gt; post = MultiDict([(&#39;foo&#39;, &#39;bar&#39;)])</span>
  1098. <span class="sd"> &gt;&gt;&gt; get = MultiDict([(&#39;blub&#39;, &#39;blah&#39;)])</span>
  1099. <span class="sd"> &gt;&gt;&gt; combined = CombinedMultiDict([get, post])</span>
  1100. <span class="sd"> &gt;&gt;&gt; combined[&#39;foo&#39;]</span>
  1101. <span class="sd"> &#39;bar&#39;</span>
  1102. <span class="sd"> &gt;&gt;&gt; combined[&#39;blub&#39;]</span>
  1103. <span class="sd"> &#39;blah&#39;</span>
  1104. <span class="sd"> This works for all read operations and will raise a `TypeError` for</span>
  1105. <span class="sd"> methods that usually change data which isn&#39;t possible.</span>
  1106. <span class="sd"> From Werkzeug 0.3 onwards, the `KeyError` raised by this class is also a</span>
  1107. <span class="sd"> subclass of the :exc:`~exceptions.BadRequest` HTTP exception and will</span>
  1108. <span class="sd"> render a page for a ``400 BAD REQUEST`` if caught in a catch-all for HTTP</span>
  1109. <span class="sd"> exceptions.</span>
  1110. <span class="sd"> &quot;&quot;&quot;</span>
  1111. <span class="k">def</span> <span class="nf">__reduce_ex__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">protocol</span><span class="p">):</span>
  1112. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">,)</span>
  1113. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dicts</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1114. <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span> <span class="o">=</span> <span class="n">dicts</span> <span class="ow">or</span> <span class="p">[]</span>
  1115. <span class="nd">@classmethod</span>
  1116. <span class="k">def</span> <span class="nf">fromkeys</span><span class="p">(</span><span class="n">cls</span><span class="p">):</span>
  1117. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;cannot create </span><span class="si">%r</span><span class="s1"> instances by fromkeys&#39;</span> <span class="o">%</span>
  1118. <span class="n">cls</span><span class="o">.</span><span class="n">__name__</span><span class="p">)</span>
  1119. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1120. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1121. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
  1122. <span class="k">return</span> <span class="n">d</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  1123. <span class="k">raise</span> <span class="n">exceptions</span><span class="o">.</span><span class="n">BadRequestKeyError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1124. <span class="k">def</span> <span class="nf">get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1125. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1126. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
  1127. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1128. <span class="k">try</span><span class="p">:</span>
  1129. <span class="k">return</span> <span class="nb">type</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">key</span><span class="p">])</span>
  1130. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  1131. <span class="k">continue</span>
  1132. <span class="k">return</span> <span class="n">d</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  1133. <span class="k">return</span> <span class="n">default</span>
  1134. <span class="k">def</span> <span class="nf">getlist</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1135. <span class="n">rv</span> <span class="o">=</span> <span class="p">[]</span>
  1136. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1137. <span class="n">rv</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">getlist</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="nb">type</span><span class="p">))</span>
  1138. <span class="k">return</span> <span class="n">rv</span>
  1139. <span class="k">def</span> <span class="nf">_keys_impl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1140. <span class="sd">&quot;&quot;&quot;This function exists so __len__ can be implemented more efficiently,</span>
  1141. <span class="sd"> saving one list creation from an iterator.</span>
  1142. <span class="sd"> Using this for Python 2&#39;s ``dict.keys`` behavior would be useless since</span>
  1143. <span class="sd"> `dict.keys` in Python 2 returns a list, while we have a set here.</span>
  1144. <span class="sd"> &quot;&quot;&quot;</span>
  1145. <span class="n">rv</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
  1146. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1147. <span class="n">rv</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">iterkeys</span><span class="p">(</span><span class="n">d</span><span class="p">))</span>
  1148. <span class="k">return</span> <span class="n">rv</span>
  1149. <span class="k">def</span> <span class="nf">keys</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1150. <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys_impl</span><span class="p">())</span>
  1151. <span class="n">__iter__</span> <span class="o">=</span> <span class="n">keys</span>
  1152. <span class="k">def</span> <span class="nf">items</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1153. <span class="n">found</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
  1154. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1155. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">multi</span><span class="p">):</span>
  1156. <span class="k">if</span> <span class="n">multi</span><span class="p">:</span>
  1157. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  1158. <span class="k">elif</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">found</span><span class="p">:</span>
  1159. <span class="n">found</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1160. <span class="k">yield</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span>
  1161. <span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1162. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1163. <span class="k">yield</span> <span class="n">value</span>
  1164. <span class="k">def</span> <span class="nf">lists</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1165. <span class="n">rv</span> <span class="o">=</span> <span class="p">{}</span>
  1166. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1167. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">values</span> <span class="ow">in</span> <span class="n">iterlists</span><span class="p">(</span><span class="n">d</span><span class="p">):</span>
  1168. <span class="n">rv</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="p">[])</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
  1169. <span class="k">return</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">rv</span><span class="p">)</span>
  1170. <span class="k">def</span> <span class="nf">listvalues</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1171. <span class="k">return</span> <span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">lists</span><span class="p">())</span>
  1172. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1173. <span class="sd">&quot;&quot;&quot;Return a shallow copy of this object.&quot;&quot;&quot;</span>
  1174. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">[:])</span>
  1175. <span class="k">def</span> <span class="nf">to_dict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">flat</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
  1176. <span class="sd">&quot;&quot;&quot;Return the contents as regular dict. If `flat` is `True` the</span>
  1177. <span class="sd"> returned dict will only have the first item present, if `flat` is</span>
  1178. <span class="sd"> `False` all values will be returned as lists.</span>
  1179. <span class="sd"> :param flat: If set to `False` the dict returned will have lists</span>
  1180. <span class="sd"> with all the values in it. Otherwise it will only</span>
  1181. <span class="sd"> contain the first item for each key.</span>
  1182. <span class="sd"> :return: a :class:`dict`</span>
  1183. <span class="sd"> &quot;&quot;&quot;</span>
  1184. <span class="n">rv</span> <span class="o">=</span> <span class="p">{}</span>
  1185. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">):</span>
  1186. <span class="n">rv</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">d</span><span class="o">.</span><span class="n">to_dict</span><span class="p">(</span><span class="n">flat</span><span class="p">))</span>
  1187. <span class="k">return</span> <span class="n">rv</span>
  1188. <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1189. <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_keys_impl</span><span class="p">())</span>
  1190. <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1191. <span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">:</span>
  1192. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
  1193. <span class="k">return</span> <span class="kc">True</span>
  1194. <span class="k">return</span> <span class="kc">False</span>
  1195. <span class="n">has_key</span> <span class="o">=</span> <span class="n">__contains__</span>
  1196. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1197. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dicts</span><span class="p">)</span>
  1198. <span class="k">class</span> <span class="nc">FileMultiDict</span><span class="p">(</span><span class="n">MultiDict</span><span class="p">):</span>
  1199. <span class="sd">&quot;&quot;&quot;A special :class:`MultiDict` that has convenience methods to add</span>
  1200. <span class="sd"> files to it. This is used for :class:`EnvironBuilder` and generally</span>
  1201. <span class="sd"> useful for unittesting.</span>
  1202. <span class="sd"> .. versionadded:: 0.5</span>
  1203. <span class="sd"> &quot;&quot;&quot;</span>
  1204. <span class="k">def</span> <span class="nf">add_file</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_type</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1205. <span class="sd">&quot;&quot;&quot;Adds a new file to the dict. `file` can be a file name or</span>
  1206. <span class="sd"> a :class:`file`-like or a :class:`FileStorage` object.</span>
  1207. <span class="sd"> :param name: the name of the field.</span>
  1208. <span class="sd"> :param file: a filename or :class:`file`-like object</span>
  1209. <span class="sd"> :param filename: an optional filename</span>
  1210. <span class="sd"> :param content_type: an optional content type</span>
  1211. <span class="sd"> &quot;&quot;&quot;</span>
  1212. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">FileStorage</span><span class="p">):</span>
  1213. <span class="n">value</span> <span class="o">=</span> <span class="n">file</span>
  1214. <span class="k">else</span><span class="p">:</span>
  1215. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
  1216. <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1217. <span class="n">filename</span> <span class="o">=</span> <span class="n">file</span>
  1218. <span class="n">file</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="s1">&#39;rb&#39;</span><span class="p">)</span>
  1219. <span class="k">if</span> <span class="n">filename</span> <span class="ow">and</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1220. <span class="n">content_type</span> <span class="o">=</span> <span class="n">mimetypes</span><span class="o">.</span><span class="n">guess_type</span><span class="p">(</span><span class="n">filename</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">or</span> \
  1221. <span class="s1">&#39;application/octet-stream&#39;</span>
  1222. <span class="n">value</span> <span class="o">=</span> <span class="n">FileStorage</span><span class="p">(</span><span class="n">file</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">content_type</span><span class="p">)</span>
  1223. <span class="bp">self</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  1224. <span class="k">class</span> <span class="nc">ImmutableDict</span><span class="p">(</span><span class="n">ImmutableDictMixin</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  1225. <span class="sd">&quot;&quot;&quot;An immutable :class:`dict`.</span>
  1226. <span class="sd"> .. versionadded:: 0.5</span>
  1227. <span class="sd"> &quot;&quot;&quot;</span>
  1228. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1229. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1230. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1231. <span class="nb">dict</span><span class="o">.</span><span class="n">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">),</span>
  1232. <span class="p">)</span>
  1233. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1234. <span class="sd">&quot;&quot;&quot;Return a shallow mutable copy of this object. Keep in mind that</span>
  1235. <span class="sd"> the standard library&#39;s :func:`copy` function is a no-op for this class</span>
  1236. <span class="sd"> like for any other python immutable type (eg: :class:`tuple`).</span>
  1237. <span class="sd"> &quot;&quot;&quot;</span>
  1238. <span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1239. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1240. <span class="k">return</span> <span class="bp">self</span>
  1241. <span class="k">class</span> <span class="nc">ImmutableMultiDict</span><span class="p">(</span><span class="n">ImmutableMultiDictMixin</span><span class="p">,</span> <span class="n">MultiDict</span><span class="p">):</span>
  1242. <span class="sd">&quot;&quot;&quot;An immutable :class:`MultiDict`.</span>
  1243. <span class="sd"> .. versionadded:: 0.5</span>
  1244. <span class="sd"> &quot;&quot;&quot;</span>
  1245. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1246. <span class="sd">&quot;&quot;&quot;Return a shallow mutable copy of this object. Keep in mind that</span>
  1247. <span class="sd"> the standard library&#39;s :func:`copy` function is a no-op for this class</span>
  1248. <span class="sd"> like for any other python immutable type (eg: :class:`tuple`).</span>
  1249. <span class="sd"> &quot;&quot;&quot;</span>
  1250. <span class="k">return</span> <span class="n">MultiDict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1251. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1252. <span class="k">return</span> <span class="bp">self</span>
  1253. <span class="k">class</span> <span class="nc">ImmutableOrderedMultiDict</span><span class="p">(</span><span class="n">ImmutableMultiDictMixin</span><span class="p">,</span> <span class="n">OrderedMultiDict</span><span class="p">):</span>
  1254. <span class="sd">&quot;&quot;&quot;An immutable :class:`OrderedMultiDict`.</span>
  1255. <span class="sd"> .. versionadded:: 0.6</span>
  1256. <span class="sd"> &quot;&quot;&quot;</span>
  1257. <span class="k">def</span> <span class="nf">_iter_hashitems</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1258. <span class="k">return</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">iteritems</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">multi</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
  1259. <span class="k">def</span> <span class="nf">copy</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1260. <span class="sd">&quot;&quot;&quot;Return a shallow mutable copy of this object. Keep in mind that</span>
  1261. <span class="sd"> the standard library&#39;s :func:`copy` function is a no-op for this class</span>
  1262. <span class="sd"> like for any other python immutable type (eg: :class:`tuple`).</span>
  1263. <span class="sd"> &quot;&quot;&quot;</span>
  1264. <span class="k">return</span> <span class="n">OrderedMultiDict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1265. <span class="k">def</span> <span class="nf">__copy__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1266. <span class="k">return</span> <span class="bp">self</span>
  1267. <span class="nd">@native_itermethods</span><span class="p">([</span><span class="s1">&#39;values&#39;</span><span class="p">])</span>
  1268. <span class="k">class</span> <span class="nc">Accept</span><span class="p">(</span><span class="n">ImmutableList</span><span class="p">):</span>
  1269. <span class="sd">&quot;&quot;&quot;An :class:`Accept` object is just a list subclass for lists of</span>
  1270. <span class="sd"> ``(value, quality)`` tuples. It is automatically sorted by quality.</span>
  1271. <span class="sd"> All :class:`Accept` objects work similar to a list but provide extra</span>
  1272. <span class="sd"> functionality for working with the data. Containment checks are</span>
  1273. <span class="sd"> normalized to the rules of that header:</span>
  1274. <span class="sd"> &gt;&gt;&gt; a = CharsetAccept([(&#39;ISO-8859-1&#39;, 1), (&#39;utf-8&#39;, 0.7)])</span>
  1275. <span class="sd"> &gt;&gt;&gt; a.best</span>
  1276. <span class="sd"> &#39;ISO-8859-1&#39;</span>
  1277. <span class="sd"> &gt;&gt;&gt; &#39;iso-8859-1&#39; in a</span>
  1278. <span class="sd"> True</span>
  1279. <span class="sd"> &gt;&gt;&gt; &#39;UTF8&#39; in a</span>
  1280. <span class="sd"> True</span>
  1281. <span class="sd"> &gt;&gt;&gt; &#39;utf7&#39; in a</span>
  1282. <span class="sd"> False</span>
  1283. <span class="sd"> To get the quality for an item you can use normal item lookup:</span>
  1284. <span class="sd"> &gt;&gt;&gt; print a[&#39;utf-8&#39;]</span>
  1285. <span class="sd"> 0.7</span>
  1286. <span class="sd"> &gt;&gt;&gt; a[&#39;utf7&#39;]</span>
  1287. <span class="sd"> 0</span>
  1288. <span class="sd"> .. versionchanged:: 0.5</span>
  1289. <span class="sd"> :class:`Accept` objects are forced immutable now.</span>
  1290. <span class="sd"> &quot;&quot;&quot;</span>
  1291. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="p">()):</span>
  1292. <span class="k">if</span> <span class="n">values</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1293. <span class="nb">list</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1294. <span class="bp">self</span><span class="o">.</span><span class="n">provided</span> <span class="o">=</span> <span class="kc">False</span>
  1295. <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="n">Accept</span><span class="p">):</span>
  1296. <span class="bp">self</span><span class="o">.</span><span class="n">provided</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">provided</span>
  1297. <span class="nb">list</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span>
  1298. <span class="k">else</span><span class="p">:</span>
  1299. <span class="bp">self</span><span class="o">.</span><span class="n">provided</span> <span class="o">=</span> <span class="kc">True</span>
  1300. <span class="n">values</span> <span class="o">=</span> <span class="p">[(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">values</span><span class="p">]</span>
  1301. <span class="n">values</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
  1302. <span class="n">values</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
  1303. <span class="nb">list</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">[(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">for</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="ow">in</span> <span class="n">values</span><span class="p">])</span>
  1304. <span class="k">def</span> <span class="nf">_value_matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1305. <span class="sd">&quot;&quot;&quot;Check if a value matches a given accept item.&quot;&quot;&quot;</span>
  1306. <span class="k">return</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span> <span class="n">item</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">value</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1307. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1308. <span class="sd">&quot;&quot;&quot;Besides index lookup (getting item n) you can also pass it a string</span>
  1309. <span class="sd"> to get the quality for the item. If the item is not in the list, the</span>
  1310. <span class="sd"> returned quality is ``0``.</span>
  1311. <span class="sd"> &quot;&quot;&quot;</span>
  1312. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
  1313. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">quality</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1314. <span class="k">return</span> <span class="nb">list</span><span class="o">.</span><span class="n">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  1315. <span class="k">def</span> <span class="nf">quality</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1316. <span class="sd">&quot;&quot;&quot;Returns the quality of the key.</span>
  1317. <span class="sd"> .. versionadded:: 0.6</span>
  1318. <span class="sd"> In previous versions you had to use the item-lookup syntax</span>
  1319. <span class="sd"> (eg: ``obj[key]`` instead of ``obj.quality(key)``)</span>
  1320. <span class="sd"> &quot;&quot;&quot;</span>
  1321. <span class="k">for</span> <span class="n">item</span><span class="p">,</span> <span class="n">quality</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1322. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value_matches</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1323. <span class="k">return</span> <span class="n">quality</span>
  1324. <span class="k">return</span> <span class="mi">0</span>
  1325. <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  1326. <span class="k">for</span> <span class="n">item</span><span class="p">,</span> <span class="n">quality</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1327. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value_matches</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1328. <span class="k">return</span> <span class="kc">True</span>
  1329. <span class="k">return</span> <span class="kc">False</span>
  1330. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1331. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">([</span><span class="si">%s</span><span class="s1">])&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1332. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1333. <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s1">&#39;(</span><span class="si">%r</span><span class="s1">, </span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">)</span>
  1334. <span class="p">)</span>
  1335. <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1336. <span class="sd">&quot;&quot;&quot;Get the position of an entry or raise :exc:`ValueError`.</span>
  1337. <span class="sd"> :param key: The key to be looked up.</span>
  1338. <span class="sd"> .. versionchanged:: 0.5</span>
  1339. <span class="sd"> This used to raise :exc:`IndexError`, which was inconsistent</span>
  1340. <span class="sd"> with the list API.</span>
  1341. <span class="sd"> &quot;&quot;&quot;</span>
  1342. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
  1343. <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">quality</span><span class="p">)</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1344. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value_matches</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1345. <span class="k">return</span> <span class="n">idx</span>
  1346. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1347. <span class="k">return</span> <span class="nb">list</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">)</span>
  1348. <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1349. <span class="sd">&quot;&quot;&quot;Get the position of an entry or return -1.</span>
  1350. <span class="sd"> :param key: The key to be looked up.</span>
  1351. <span class="sd"> &quot;&quot;&quot;</span>
  1352. <span class="k">try</span><span class="p">:</span>
  1353. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1354. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  1355. <span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
  1356. <span class="k">def</span> <span class="nf">values</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1357. <span class="sd">&quot;&quot;&quot;Iterate over all values.&quot;&quot;&quot;</span>
  1358. <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1359. <span class="k">yield</span> <span class="n">item</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  1360. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1361. <span class="sd">&quot;&quot;&quot;Convert the header set into an HTTP header string.&quot;&quot;&quot;</span>
  1362. <span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
  1363. <span class="k">for</span> <span class="n">value</span><span class="p">,</span> <span class="n">quality</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1364. <span class="k">if</span> <span class="n">quality</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
  1365. <span class="n">value</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">;q=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">quality</span><span class="p">)</span>
  1366. <span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  1367. <span class="k">return</span> <span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
  1368. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1369. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1370. <span class="k">def</span> <span class="nf">best_match</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">matches</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1371. <span class="sd">&quot;&quot;&quot;Returns the best match from a list of possible matches based</span>
  1372. <span class="sd"> on the quality of the client. If two items have the same quality,</span>
  1373. <span class="sd"> the one is returned that comes first.</span>
  1374. <span class="sd"> :param matches: a list of matches to check for</span>
  1375. <span class="sd"> :param default: the value that is returned if none match</span>
  1376. <span class="sd"> &quot;&quot;&quot;</span>
  1377. <span class="n">best_quality</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
  1378. <span class="n">result</span> <span class="o">=</span> <span class="n">default</span>
  1379. <span class="k">for</span> <span class="n">server_item</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">:</span>
  1380. <span class="k">for</span> <span class="n">client_item</span><span class="p">,</span> <span class="n">quality</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1381. <span class="k">if</span> <span class="n">quality</span> <span class="o">&lt;=</span> <span class="n">best_quality</span><span class="p">:</span>
  1382. <span class="k">break</span>
  1383. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_value_matches</span><span class="p">(</span><span class="n">server_item</span><span class="p">,</span> <span class="n">client_item</span><span class="p">)</span> \
  1384. <span class="ow">and</span> <span class="n">quality</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
  1385. <span class="n">best_quality</span> <span class="o">=</span> <span class="n">quality</span>
  1386. <span class="n">result</span> <span class="o">=</span> <span class="n">server_item</span>
  1387. <span class="k">return</span> <span class="n">result</span>
  1388. <span class="nd">@property</span>
  1389. <span class="k">def</span> <span class="nf">best</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1390. <span class="sd">&quot;&quot;&quot;The best match as value.&quot;&quot;&quot;</span>
  1391. <span class="k">if</span> <span class="bp">self</span><span class="p">:</span>
  1392. <span class="k">return</span> <span class="bp">self</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
  1393. <span class="k">class</span> <span class="nc">MIMEAccept</span><span class="p">(</span><span class="n">Accept</span><span class="p">):</span>
  1394. <span class="sd">&quot;&quot;&quot;Like :class:`Accept` but with special methods and behavior for</span>
  1395. <span class="sd"> mimetypes.</span>
  1396. <span class="sd"> &quot;&quot;&quot;</span>
  1397. <span class="k">def</span> <span class="nf">_value_matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1398. <span class="k">def</span> <span class="nf">_normalize</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
  1399. <span class="n">x</span> <span class="o">=</span> <span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1400. <span class="k">return</span> <span class="n">x</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">and</span> <span class="p">(</span><span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">x</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
  1401. <span class="c1"># this is from the application which is trusted. to avoid developer</span>
  1402. <span class="c1"># frustration we actually check these for valid values</span>
  1403. <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
  1404. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;invalid mimetype </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
  1405. <span class="n">value_type</span><span class="p">,</span> <span class="n">value_subtype</span> <span class="o">=</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  1406. <span class="k">if</span> <span class="n">value_type</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">and</span> <span class="n">value_subtype</span> <span class="o">!=</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
  1407. <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;invalid mimetype </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">value</span><span class="p">)</span>
  1408. <span class="k">if</span> <span class="s1">&#39;/&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">item</span><span class="p">:</span>
  1409. <span class="k">return</span> <span class="kc">False</span>
  1410. <span class="n">item_type</span><span class="p">,</span> <span class="n">item_subtype</span> <span class="o">=</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
  1411. <span class="k">if</span> <span class="n">item_type</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">and</span> <span class="n">item_subtype</span> <span class="o">!=</span> <span class="s1">&#39;*&#39;</span><span class="p">:</span>
  1412. <span class="k">return</span> <span class="kc">False</span>
  1413. <span class="k">return</span> <span class="p">(</span>
  1414. <span class="p">(</span><span class="n">item_type</span> <span class="o">==</span> <span class="n">item_subtype</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span>
  1415. <span class="n">value_type</span> <span class="o">==</span> <span class="n">value_subtype</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span><span class="p">)</span> <span class="ow">or</span>
  1416. <span class="p">(</span><span class="n">item_type</span> <span class="o">==</span> <span class="n">value_type</span> <span class="ow">and</span> <span class="p">(</span><span class="n">item_subtype</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span>
  1417. <span class="n">value_subtype</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span>
  1418. <span class="n">item_subtype</span> <span class="o">==</span> <span class="n">value_subtype</span><span class="p">))</span>
  1419. <span class="p">)</span>
  1420. <span class="nd">@property</span>
  1421. <span class="k">def</span> <span class="nf">accept_html</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1422. <span class="sd">&quot;&quot;&quot;True if this object accepts HTML.&quot;&quot;&quot;</span>
  1423. <span class="k">return</span> <span class="p">(</span>
  1424. <span class="s1">&#39;text/html&#39;</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">or</span>
  1425. <span class="s1">&#39;application/xhtml+xml&#39;</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">or</span>
  1426. <span class="bp">self</span><span class="o">.</span><span class="n">accept_xhtml</span>
  1427. <span class="p">)</span>
  1428. <span class="nd">@property</span>
  1429. <span class="k">def</span> <span class="nf">accept_xhtml</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1430. <span class="sd">&quot;&quot;&quot;True if this object accepts XHTML.&quot;&quot;&quot;</span>
  1431. <span class="k">return</span> <span class="p">(</span>
  1432. <span class="s1">&#39;application/xhtml+xml&#39;</span> <span class="ow">in</span> <span class="bp">self</span> <span class="ow">or</span>
  1433. <span class="s1">&#39;application/xml&#39;</span> <span class="ow">in</span> <span class="bp">self</span>
  1434. <span class="p">)</span>
  1435. <span class="nd">@property</span>
  1436. <span class="k">def</span> <span class="nf">accept_json</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1437. <span class="sd">&quot;&quot;&quot;True if this object accepts JSON.&quot;&quot;&quot;</span>
  1438. <span class="k">return</span> <span class="s1">&#39;application/json&#39;</span> <span class="ow">in</span> <span class="bp">self</span>
  1439. <span class="k">class</span> <span class="nc">LanguageAccept</span><span class="p">(</span><span class="n">Accept</span><span class="p">):</span>
  1440. <span class="sd">&quot;&quot;&quot;Like :class:`Accept` but with normalization for languages.&quot;&quot;&quot;</span>
  1441. <span class="k">def</span> <span class="nf">_value_matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1442. <span class="k">def</span> <span class="nf">_normalize</span><span class="p">(</span><span class="n">language</span><span class="p">):</span>
  1443. <span class="k">return</span> <span class="n">_locale_delim_re</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">language</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
  1444. <span class="k">return</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
  1445. <span class="k">class</span> <span class="nc">CharsetAccept</span><span class="p">(</span><span class="n">Accept</span><span class="p">):</span>
  1446. <span class="sd">&quot;&quot;&quot;Like :class:`Accept` but with normalization for charsets.&quot;&quot;&quot;</span>
  1447. <span class="k">def</span> <span class="nf">_value_matches</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">item</span><span class="p">):</span>
  1448. <span class="k">def</span> <span class="nf">_normalize</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
  1449. <span class="k">try</span><span class="p">:</span>
  1450. <span class="k">return</span> <span class="n">codecs</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">name</span><span class="p">)</span><span class="o">.</span><span class="n">name</span>
  1451. <span class="k">except</span> <span class="ne">LookupError</span><span class="p">:</span>
  1452. <span class="k">return</span> <span class="n">name</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1453. <span class="k">return</span> <span class="n">item</span> <span class="o">==</span> <span class="s1">&#39;*&#39;</span> <span class="ow">or</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="n">_normalize</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
  1454. <span class="k">def</span> <span class="nf">cache_property</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">empty</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
  1455. <span class="sd">&quot;&quot;&quot;Return a new property object for a cache header. Useful if you</span>
  1456. <span class="sd"> want to add support for a cache extension in a subclass.&quot;&quot;&quot;</span>
  1457. <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">_get_cache_value</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">empty</span><span class="p">,</span> <span class="nb">type</span><span class="p">),</span>
  1458. <span class="k">lambda</span> <span class="n">x</span><span class="p">,</span> <span class="n">v</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">_set_cache_value</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="nb">type</span><span class="p">),</span>
  1459. <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">_del_cache_value</span><span class="p">(</span><span class="n">key</span><span class="p">),</span>
  1460. <span class="s1">&#39;accessor for </span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">key</span><span class="p">)</span>
  1461. <span class="k">class</span> <span class="nc">_CacheControl</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  1462. <span class="sd">&quot;&quot;&quot;Subclass of a dict that stores values for a Cache-Control header. It</span>
  1463. <span class="sd"> has accessors for all the cache-control directives specified in RFC 2616.</span>
  1464. <span class="sd"> The class does not differentiate between request and response directives.</span>
  1465. <span class="sd"> Because the cache-control directives in the HTTP header use dashes the</span>
  1466. <span class="sd"> python descriptors use underscores for that.</span>
  1467. <span class="sd"> To get a header of the :class:`CacheControl` object again you can convert</span>
  1468. <span class="sd"> the object into a string or call the :meth:`to_header` method. If you plan</span>
  1469. <span class="sd"> to subclass it and add your own items have a look at the sourcecode for</span>
  1470. <span class="sd"> that class.</span>
  1471. <span class="sd"> .. versionchanged:: 0.4</span>
  1472. <span class="sd"> Setting `no_cache` or `private` to boolean `True` will set the implicit</span>
  1473. <span class="sd"> none-value which is ``*``:</span>
  1474. <span class="sd"> &gt;&gt;&gt; cc = ResponseCacheControl()</span>
  1475. <span class="sd"> &gt;&gt;&gt; cc.no_cache = True</span>
  1476. <span class="sd"> &gt;&gt;&gt; cc</span>
  1477. <span class="sd"> &lt;ResponseCacheControl &#39;no-cache&#39;&gt;</span>
  1478. <span class="sd"> &gt;&gt;&gt; cc.no_cache</span>
  1479. <span class="sd"> &#39;*&#39;</span>
  1480. <span class="sd"> &gt;&gt;&gt; cc.no_cache = None</span>
  1481. <span class="sd"> &gt;&gt;&gt; cc</span>
  1482. <span class="sd"> &lt;ResponseCacheControl &#39;&#39;&gt;</span>
  1483. <span class="sd"> In versions before 0.5 the behavior documented here affected the now</span>
  1484. <span class="sd"> no longer existing `CacheControl` class.</span>
  1485. <span class="sd"> &quot;&quot;&quot;</span>
  1486. <span class="n">no_cache</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;no-cache&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1487. <span class="n">no_store</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;no-store&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
  1488. <span class="n">max_age</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;max-age&#39;</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
  1489. <span class="n">no_transform</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;no-transform&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1490. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="p">(),</span> <span class="n">on_update</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1491. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span> <span class="ow">or</span> <span class="p">())</span>
  1492. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="o">=</span> <span class="n">on_update</span>
  1493. <span class="bp">self</span><span class="o">.</span><span class="n">provided</span> <span class="o">=</span> <span class="n">values</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
  1494. <span class="k">def</span> <span class="nf">_get_cache_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">empty</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
  1495. <span class="sd">&quot;&quot;&quot;Used internally by the accessor properties.&quot;&quot;&quot;</span>
  1496. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="nb">bool</span><span class="p">:</span>
  1497. <span class="k">return</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span>
  1498. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1499. <span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  1500. <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1501. <span class="k">return</span> <span class="n">empty</span>
  1502. <span class="k">elif</span> <span class="nb">type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1503. <span class="k">try</span><span class="p">:</span>
  1504. <span class="n">value</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  1505. <span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
  1506. <span class="k">pass</span>
  1507. <span class="k">return</span> <span class="n">value</span>
  1508. <span class="k">def</span> <span class="nf">_set_cache_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="nb">type</span><span class="p">):</span>
  1509. <span class="sd">&quot;&quot;&quot;Used internally by the accessor properties.&quot;&quot;&quot;</span>
  1510. <span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="nb">bool</span><span class="p">:</span>
  1511. <span class="k">if</span> <span class="n">value</span><span class="p">:</span>
  1512. <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
  1513. <span class="k">else</span><span class="p">:</span>
  1514. <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1515. <span class="k">else</span><span class="p">:</span>
  1516. <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1517. <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1518. <span class="k">elif</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">True</span><span class="p">:</span>
  1519. <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
  1520. <span class="k">else</span><span class="p">:</span>
  1521. <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
  1522. <span class="k">def</span> <span class="nf">_del_cache_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
  1523. <span class="sd">&quot;&quot;&quot;Used internally by the accessor properties.&quot;&quot;&quot;</span>
  1524. <span class="k">if</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1525. <span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
  1526. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1527. <span class="sd">&quot;&quot;&quot;Convert the stored values into a cache control header.&quot;&quot;&quot;</span>
  1528. <span class="k">return</span> <span class="n">dump_header</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1529. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1530. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1531. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1532. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1533. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1534. <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
  1535. <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">=</span><span class="si">%r</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
  1536. <span class="p">),</span>
  1537. <span class="p">)</span>
  1538. <span class="k">class</span> <span class="nc">RequestCacheControl</span><span class="p">(</span><span class="n">ImmutableDictMixin</span><span class="p">,</span> <span class="n">_CacheControl</span><span class="p">):</span>
  1539. <span class="sd">&quot;&quot;&quot;A cache control for requests. This is immutable and gives access</span>
  1540. <span class="sd"> to all the request-relevant cache control headers.</span>
  1541. <span class="sd"> To get a header of the :class:`RequestCacheControl` object again you can</span>
  1542. <span class="sd"> convert the object into a string or call the :meth:`to_header` method. If</span>
  1543. <span class="sd"> you plan to subclass it and add your own items have a look at the sourcecode</span>
  1544. <span class="sd"> for that class.</span>
  1545. <span class="sd"> .. versionadded:: 0.5</span>
  1546. <span class="sd"> In previous versions a `CacheControl` class existed that was used</span>
  1547. <span class="sd"> both for request and response.</span>
  1548. <span class="sd"> &quot;&quot;&quot;</span>
  1549. <span class="n">max_stale</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;max-stale&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
  1550. <span class="n">min_fresh</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;min-fresh&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
  1551. <span class="n">no_transform</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;no-transform&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1552. <span class="n">only_if_cached</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;only-if-cached&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
  1553. <span class="k">class</span> <span class="nc">ResponseCacheControl</span><span class="p">(</span><span class="n">_CacheControl</span><span class="p">):</span>
  1554. <span class="sd">&quot;&quot;&quot;A cache control for responses. Unlike :class:`RequestCacheControl`</span>
  1555. <span class="sd"> this is mutable and gives access to response-relevant cache control</span>
  1556. <span class="sd"> headers.</span>
  1557. <span class="sd"> To get a header of the :class:`ResponseCacheControl` object again you can</span>
  1558. <span class="sd"> convert the object into a string or call the :meth:`to_header` method. If</span>
  1559. <span class="sd"> you plan to subclass it and add your own items have a look at the sourcecode</span>
  1560. <span class="sd"> for that class.</span>
  1561. <span class="sd"> .. versionadded:: 0.5</span>
  1562. <span class="sd"> In previous versions a `CacheControl` class existed that was used</span>
  1563. <span class="sd"> both for request and response.</span>
  1564. <span class="sd"> &quot;&quot;&quot;</span>
  1565. <span class="n">public</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;public&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
  1566. <span class="n">private</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;private&#39;</span><span class="p">,</span> <span class="s1">&#39;*&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1567. <span class="n">must_revalidate</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;must-revalidate&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
  1568. <span class="n">proxy_revalidate</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;proxy-revalidate&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span>
  1569. <span class="n">s_maxage</span> <span class="o">=</span> <span class="n">cache_property</span><span class="p">(</span><span class="s1">&#39;s-maxage&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  1570. <span class="c1"># attach cache_property to the _CacheControl as staticmethod</span>
  1571. <span class="c1"># so that others can reuse it.</span>
  1572. <span class="n">_CacheControl</span><span class="o">.</span><span class="n">cache_property</span> <span class="o">=</span> <span class="nb">staticmethod</span><span class="p">(</span><span class="n">cache_property</span><span class="p">)</span>
  1573. <span class="k">class</span> <span class="nc">CallbackDict</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  1574. <span class="sd">&quot;&quot;&quot;A dict that calls a function passed every time something is changed.</span>
  1575. <span class="sd"> The function is passed the dict instance.</span>
  1576. <span class="sd"> &quot;&quot;&quot;</span>
  1577. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">initial</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">on_update</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1578. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">initial</span> <span class="ow">or</span> <span class="p">())</span>
  1579. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="o">=</span> <span class="n">on_update</span>
  1580. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1581. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1582. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1583. <span class="nb">dict</span><span class="o">.</span><span class="n">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1584. <span class="p">)</span>
  1585. <span class="k">class</span> <span class="nc">HeaderSet</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1586. <span class="sd">&quot;&quot;&quot;Similar to the :class:`ETags` class this implements a set-like structure.</span>
  1587. <span class="sd"> Unlike :class:`ETags` this is case insensitive and used for vary, allow, and</span>
  1588. <span class="sd"> content-language headers.</span>
  1589. <span class="sd"> If not constructed using the :func:`parse_set_header` function the</span>
  1590. <span class="sd"> instantiation works like this:</span>
  1591. <span class="sd"> &gt;&gt;&gt; hs = HeaderSet([&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;])</span>
  1592. <span class="sd"> &gt;&gt;&gt; hs</span>
  1593. <span class="sd"> HeaderSet([&#39;foo&#39;, &#39;bar&#39;, &#39;baz&#39;])</span>
  1594. <span class="sd"> &quot;&quot;&quot;</span>
  1595. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">on_update</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1596. <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">headers</span> <span class="ow">or</span> <span class="p">())</span>
  1597. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span> <span class="o">=</span> <span class="nb">set</span><span class="p">([</span><span class="n">x</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">])</span>
  1598. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="o">=</span> <span class="n">on_update</span>
  1599. <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1600. <span class="sd">&quot;&quot;&quot;Add a new header to the set.&quot;&quot;&quot;</span>
  1601. <span class="bp">self</span><span class="o">.</span><span class="n">update</span><span class="p">((</span><span class="n">header</span><span class="p">,))</span>
  1602. <span class="k">def</span> <span class="nf">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1603. <span class="sd">&quot;&quot;&quot;Remove a header from the set. This raises an :exc:`KeyError` if the</span>
  1604. <span class="sd"> header is not in the set.</span>
  1605. <span class="sd"> .. versionchanged:: 0.5</span>
  1606. <span class="sd"> In older versions a :exc:`IndexError` was raised instead of a</span>
  1607. <span class="sd"> :exc:`KeyError` if the object was missing.</span>
  1608. <span class="sd"> :param header: the header to be removed.</span>
  1609. <span class="sd"> &quot;&quot;&quot;</span>
  1610. <span class="n">key</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1611. <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">:</span>
  1612. <span class="k">raise</span> <span class="ne">KeyError</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
  1613. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1614. <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">):</span>
  1615. <span class="k">if</span> <span class="n">key</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">header</span><span class="p">:</span>
  1616. <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
  1617. <span class="k">break</span>
  1618. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1619. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1620. <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">iterable</span><span class="p">):</span>
  1621. <span class="sd">&quot;&quot;&quot;Add all the headers from the iterable to the set.</span>
  1622. <span class="sd"> :param iterable: updates the set with the items from the iterable.</span>
  1623. <span class="sd"> &quot;&quot;&quot;</span>
  1624. <span class="n">inserted_any</span> <span class="o">=</span> <span class="kc">False</span>
  1625. <span class="k">for</span> <span class="n">header</span> <span class="ow">in</span> <span class="n">iterable</span><span class="p">:</span>
  1626. <span class="n">key</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1627. <span class="k">if</span> <span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">:</span>
  1628. <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
  1629. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
  1630. <span class="n">inserted_any</span> <span class="o">=</span> <span class="kc">True</span>
  1631. <span class="k">if</span> <span class="n">inserted_any</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1632. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1633. <span class="k">def</span> <span class="nf">discard</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1634. <span class="sd">&quot;&quot;&quot;Like :meth:`remove` but ignores errors.</span>
  1635. <span class="sd"> :param header: the header to be discarded.</span>
  1636. <span class="sd"> &quot;&quot;&quot;</span>
  1637. <span class="k">try</span><span class="p">:</span>
  1638. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
  1639. <span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
  1640. <span class="k">pass</span>
  1641. <span class="k">def</span> <span class="nf">find</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1642. <span class="sd">&quot;&quot;&quot;Return the index of the header in the set or return -1 if not found.</span>
  1643. <span class="sd"> :param header: the header to be looked up.</span>
  1644. <span class="sd"> &quot;&quot;&quot;</span>
  1645. <span class="n">header</span> <span class="o">=</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  1646. <span class="k">for</span> <span class="n">idx</span><span class="p">,</span> <span class="n">item</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">):</span>
  1647. <span class="k">if</span> <span class="n">item</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">header</span><span class="p">:</span>
  1648. <span class="k">return</span> <span class="n">idx</span>
  1649. <span class="k">return</span> <span class="o">-</span><span class="mi">1</span>
  1650. <span class="k">def</span> <span class="nf">index</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1651. <span class="sd">&quot;&quot;&quot;Return the index of the header in the set or raise an</span>
  1652. <span class="sd"> :exc:`IndexError`.</span>
  1653. <span class="sd"> :param header: the header to be looked up.</span>
  1654. <span class="sd"> &quot;&quot;&quot;</span>
  1655. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
  1656. <span class="k">if</span> <span class="n">rv</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
  1657. <span class="k">raise</span> <span class="ne">IndexError</span><span class="p">(</span><span class="n">header</span><span class="p">)</span>
  1658. <span class="k">return</span> <span class="n">rv</span>
  1659. <span class="k">def</span> <span class="nf">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1660. <span class="sd">&quot;&quot;&quot;Clear the set.&quot;&quot;&quot;</span>
  1661. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
  1662. <span class="k">del</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">[:]</span>
  1663. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1664. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1665. <span class="k">def</span> <span class="nf">as_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">preserve_casing</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1666. <span class="sd">&quot;&quot;&quot;Return the set as real python set type. When calling this, all</span>
  1667. <span class="sd"> the items are converted to lowercase and the ordering is lost.</span>
  1668. <span class="sd"> :param preserve_casing: if set to `True` the items in the set returned</span>
  1669. <span class="sd"> will have the original case like in the</span>
  1670. <span class="sd"> :class:`HeaderSet`, otherwise they will</span>
  1671. <span class="sd"> be lowercase.</span>
  1672. <span class="sd"> &quot;&quot;&quot;</span>
  1673. <span class="k">if</span> <span class="n">preserve_casing</span><span class="p">:</span>
  1674. <span class="k">return</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">)</span>
  1675. <span class="k">return</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">)</span>
  1676. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1677. <span class="sd">&quot;&quot;&quot;Convert the header set into an HTTP header string.&quot;&quot;&quot;</span>
  1678. <span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">quote_header_value</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">))</span>
  1679. <span class="k">def</span> <span class="nf">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
  1680. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
  1681. <span class="k">def</span> <span class="nf">__delitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">):</span>
  1682. <span class="n">rv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">idx</span><span class="p">)</span>
  1683. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">rv</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
  1684. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1685. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1686. <span class="k">def</span> <span class="nf">__setitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">idx</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  1687. <span class="n">old</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span>
  1688. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">old</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
  1689. <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">[</span><span class="n">idx</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
  1690. <span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">lower</span><span class="p">())</span>
  1691. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1692. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1693. <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">header</span><span class="p">):</span>
  1694. <span class="k">return</span> <span class="n">header</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_set</span>
  1695. <span class="k">def</span> <span class="nf">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1696. <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">)</span>
  1697. <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1698. <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_headers</span><span class="p">)</span>
  1699. <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1700. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_set</span><span class="p">)</span>
  1701. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1702. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1703. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1704. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%r</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1705. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  1706. <span class="bp">self</span><span class="o">.</span><span class="n">_headers</span>
  1707. <span class="p">)</span>
  1708. <span class="k">class</span> <span class="nc">ETags</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1709. <span class="sd">&quot;&quot;&quot;A set that can be used to check if one etag is present in a collection</span>
  1710. <span class="sd"> of etags.</span>
  1711. <span class="sd"> &quot;&quot;&quot;</span>
  1712. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">strong_etags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">weak_etags</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">star_tag</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1713. <span class="bp">self</span><span class="o">.</span><span class="n">_strong</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="ow">not</span> <span class="n">star_tag</span> <span class="ow">and</span> <span class="n">strong_etags</span> <span class="ow">or</span> <span class="p">())</span>
  1714. <span class="bp">self</span><span class="o">.</span><span class="n">_weak</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">(</span><span class="n">weak_etags</span> <span class="ow">or</span> <span class="p">())</span>
  1715. <span class="bp">self</span><span class="o">.</span><span class="n">star_tag</span> <span class="o">=</span> <span class="n">star_tag</span>
  1716. <span class="k">def</span> <span class="nf">as_set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">include_weak</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1717. <span class="sd">&quot;&quot;&quot;Convert the `ETags` object into a python set. Per default all the</span>
  1718. <span class="sd"> weak etags are not part of this set.&quot;&quot;&quot;</span>
  1719. <span class="n">rv</span> <span class="o">=</span> <span class="nb">set</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_strong</span><span class="p">)</span>
  1720. <span class="k">if</span> <span class="n">include_weak</span><span class="p">:</span>
  1721. <span class="n">rv</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_weak</span><span class="p">)</span>
  1722. <span class="k">return</span> <span class="n">rv</span>
  1723. <span class="k">def</span> <span class="nf">is_weak</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="p">):</span>
  1724. <span class="sd">&quot;&quot;&quot;Check if an etag is weak.&quot;&quot;&quot;</span>
  1725. <span class="k">return</span> <span class="n">etag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_weak</span>
  1726. <span class="k">def</span> <span class="nf">contains_weak</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="p">):</span>
  1727. <span class="sd">&quot;&quot;&quot;Check if an etag is part of the set including weak and strong tags.&quot;&quot;&quot;</span>
  1728. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">is_weak</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span>
  1729. <span class="k">def</span> <span class="nf">contains</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="p">):</span>
  1730. <span class="sd">&quot;&quot;&quot;Check if an etag is part of the set ignoring weak tags.</span>
  1731. <span class="sd"> It is also possible to use the ``in`` operator.</span>
  1732. <span class="sd"> &quot;&quot;&quot;</span>
  1733. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">star_tag</span><span class="p">:</span>
  1734. <span class="k">return</span> <span class="kc">True</span>
  1735. <span class="k">return</span> <span class="n">etag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_strong</span>
  1736. <span class="k">def</span> <span class="nf">contains_raw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="p">):</span>
  1737. <span class="sd">&quot;&quot;&quot;When passed a quoted tag it will check if this tag is part of the</span>
  1738. <span class="sd"> set. If the tag is weak it is checked against weak and strong tags,</span>
  1739. <span class="sd"> otherwise strong only.&quot;&quot;&quot;</span>
  1740. <span class="n">etag</span><span class="p">,</span> <span class="n">weak</span> <span class="o">=</span> <span class="n">unquote_etag</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span>
  1741. <span class="k">if</span> <span class="n">weak</span><span class="p">:</span>
  1742. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">contains_weak</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span>
  1743. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span>
  1744. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1745. <span class="sd">&quot;&quot;&quot;Convert the etags set into a HTTP header string.&quot;&quot;&quot;</span>
  1746. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">star_tag</span><span class="p">:</span>
  1747. <span class="k">return</span> <span class="s1">&#39;*&#39;</span>
  1748. <span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span>
  1749. <span class="p">[</span><span class="s1">&#39;&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_strong</span><span class="p">]</span> <span class="o">+</span>
  1750. <span class="p">[</span><span class="s1">&#39;W/&quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_weak</span><span class="p">]</span>
  1751. <span class="p">)</span>
  1752. <span class="k">def</span> <span class="nf">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">include_weak</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1753. <span class="k">if</span> <span class="p">[</span><span class="n">etag</span><span class="p">,</span> <span class="n">data</span><span class="p">]</span><span class="o">.</span><span class="n">count</span><span class="p">(</span><span class="kc">None</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
  1754. <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;either tag or data required, but at least one&#39;</span><span class="p">)</span>
  1755. <span class="k">if</span> <span class="n">etag</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1756. <span class="n">etag</span> <span class="o">=</span> <span class="n">generate_etag</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
  1757. <span class="k">if</span> <span class="n">include_weak</span><span class="p">:</span>
  1758. <span class="k">if</span> <span class="n">etag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_weak</span><span class="p">:</span>
  1759. <span class="k">return</span> <span class="kc">True</span>
  1760. <span class="k">return</span> <span class="n">etag</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_strong</span>
  1761. <span class="k">def</span> <span class="nf">__bool__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1762. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">star_tag</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_strong</span> <span class="ow">or</span> <span class="bp">self</span><span class="o">.</span><span class="n">_weak</span><span class="p">)</span>
  1763. <span class="n">__nonzero__</span> <span class="o">=</span> <span class="n">__bool__</span>
  1764. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1765. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1766. <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1767. <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_strong</span><span class="p">)</span>
  1768. <span class="k">def</span> <span class="nf">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="p">):</span>
  1769. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">contains</span><span class="p">(</span><span class="n">etag</span><span class="p">)</span>
  1770. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1771. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  1772. <span class="k">class</span> <span class="nc">IfRange</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1773. <span class="sd">&quot;&quot;&quot;Very simple object that represents the `If-Range` header in parsed</span>
  1774. <span class="sd"> form. It will either have neither a etag or date or one of either but</span>
  1775. <span class="sd"> never both.</span>
  1776. <span class="sd"> .. versionadded:: 0.7</span>
  1777. <span class="sd"> &quot;&quot;&quot;</span>
  1778. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">etag</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">date</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1779. <span class="c1">#: The etag parsed and unquoted. Ranges always operate on strong</span>
  1780. <span class="c1">#: etags so the weakness information is not necessary.</span>
  1781. <span class="bp">self</span><span class="o">.</span><span class="n">etag</span> <span class="o">=</span> <span class="n">etag</span>
  1782. <span class="c1">#: The date in parsed format or `None`.</span>
  1783. <span class="bp">self</span><span class="o">.</span><span class="n">date</span> <span class="o">=</span> <span class="n">date</span>
  1784. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1785. <span class="sd">&quot;&quot;&quot;Converts the object back into an HTTP header.&quot;&quot;&quot;</span>
  1786. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">date</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1787. <span class="k">return</span> <span class="n">http_date</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">date</span><span class="p">)</span>
  1788. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">etag</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1789. <span class="k">return</span> <span class="n">quote_etag</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">etag</span><span class="p">)</span>
  1790. <span class="k">return</span> <span class="s1">&#39;&#39;</span>
  1791. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1792. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1793. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1794. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  1795. <span class="k">class</span> <span class="nc">Range</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1796. <span class="sd">&quot;&quot;&quot;Represents a range header. All the methods are only supporting bytes</span>
  1797. <span class="sd"> as unit. It does store multiple ranges but :meth:`range_for_length` will</span>
  1798. <span class="sd"> only work if only one range is provided.</span>
  1799. <span class="sd"> .. versionadded:: 0.7</span>
  1800. <span class="sd"> &quot;&quot;&quot;</span>
  1801. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">units</span><span class="p">,</span> <span class="n">ranges</span><span class="p">):</span>
  1802. <span class="c1">#: The units of this range. Usually &quot;bytes&quot;.</span>
  1803. <span class="bp">self</span><span class="o">.</span><span class="n">units</span> <span class="o">=</span> <span class="n">units</span>
  1804. <span class="c1">#: A list of ``(begin, end)`` tuples for the range header provided.</span>
  1805. <span class="c1">#: The ranges are non-inclusive.</span>
  1806. <span class="bp">self</span><span class="o">.</span><span class="n">ranges</span> <span class="o">=</span> <span class="n">ranges</span>
  1807. <span class="k">def</span> <span class="nf">range_for_length</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
  1808. <span class="sd">&quot;&quot;&quot;If the range is for bytes, the length is not None and there is</span>
  1809. <span class="sd"> exactly one range and it is satisfiable it returns a ``(start, stop)``</span>
  1810. <span class="sd"> tuple, otherwise `None`.</span>
  1811. <span class="sd"> &quot;&quot;&quot;</span>
  1812. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">units</span> <span class="o">!=</span> <span class="s1">&#39;bytes&#39;</span> <span class="ow">or</span> <span class="n">length</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">ranges</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
  1813. <span class="k">return</span> <span class="kc">None</span>
  1814. <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ranges</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
  1815. <span class="k">if</span> <span class="n">end</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1816. <span class="n">end</span> <span class="o">=</span> <span class="n">length</span>
  1817. <span class="k">if</span> <span class="n">start</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
  1818. <span class="n">start</span> <span class="o">+=</span> <span class="n">length</span>
  1819. <span class="k">if</span> <span class="n">is_byte_range_valid</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
  1820. <span class="k">return</span> <span class="n">start</span><span class="p">,</span> <span class="nb">min</span><span class="p">(</span><span class="n">end</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
  1821. <span class="k">def</span> <span class="nf">make_content_range</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">length</span><span class="p">):</span>
  1822. <span class="sd">&quot;&quot;&quot;Creates a :class:`~werkzeug.datastructures.ContentRange` object</span>
  1823. <span class="sd"> from the current range and given content length.</span>
  1824. <span class="sd"> &quot;&quot;&quot;</span>
  1825. <span class="n">rng</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">range_for_length</span><span class="p">(</span><span class="n">length</span><span class="p">)</span>
  1826. <span class="k">if</span> <span class="n">rng</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1827. <span class="k">return</span> <span class="n">ContentRange</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">units</span><span class="p">,</span> <span class="n">rng</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">rng</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">length</span><span class="p">)</span>
  1828. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1829. <span class="sd">&quot;&quot;&quot;Converts the object back into an HTTP header.&quot;&quot;&quot;</span>
  1830. <span class="n">ranges</span> <span class="o">=</span> <span class="p">[]</span>
  1831. <span class="k">for</span> <span class="n">begin</span><span class="p">,</span> <span class="n">end</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ranges</span><span class="p">:</span>
  1832. <span class="k">if</span> <span class="n">end</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1833. <span class="n">ranges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">begin</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="ow">and</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">-&#39;</span> <span class="o">%</span> <span class="n">begin</span> <span class="ow">or</span> <span class="nb">str</span><span class="p">(</span><span class="n">begin</span><span class="p">))</span>
  1834. <span class="k">else</span><span class="p">:</span>
  1835. <span class="n">ranges</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">-</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">begin</span><span class="p">,</span> <span class="n">end</span> <span class="o">-</span> <span class="mi">1</span><span class="p">))</span>
  1836. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">units</span><span class="p">,</span> <span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">ranges</span><span class="p">))</span>
  1837. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1838. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1839. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1840. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  1841. <span class="k">class</span> <span class="nc">ContentRange</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  1842. <span class="sd">&quot;&quot;&quot;Represents the content range header.</span>
  1843. <span class="sd"> .. versionadded:: 0.7</span>
  1844. <span class="sd"> &quot;&quot;&quot;</span>
  1845. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">units</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">length</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">on_update</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1846. <span class="k">assert</span> <span class="n">is_byte_range_valid</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">length</span><span class="p">),</span> \
  1847. <span class="s1">&#39;Bad range provided&#39;</span>
  1848. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="o">=</span> <span class="n">on_update</span>
  1849. <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">length</span><span class="p">,</span> <span class="n">units</span><span class="p">)</span>
  1850. <span class="k">def</span> <span class="nf">_callback_property</span><span class="p">(</span><span class="n">name</span><span class="p">):</span>
  1851. <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1852. <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
  1853. <span class="k">def</span> <span class="nf">fset</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  1854. <span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
  1855. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1856. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1857. <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">fget</span><span class="p">,</span> <span class="n">fset</span><span class="p">)</span>
  1858. <span class="c1">#: The units to use, usually &quot;bytes&quot;</span>
  1859. <span class="n">units</span> <span class="o">=</span> <span class="n">_callback_property</span><span class="p">(</span><span class="s1">&#39;_units&#39;</span><span class="p">)</span>
  1860. <span class="c1">#: The start point of the range or `None`.</span>
  1861. <span class="n">start</span> <span class="o">=</span> <span class="n">_callback_property</span><span class="p">(</span><span class="s1">&#39;_start&#39;</span><span class="p">)</span>
  1862. <span class="c1">#: The stop point of the range (non-inclusive) or `None`. Can only be</span>
  1863. <span class="c1">#: `None` if also start is `None`.</span>
  1864. <span class="n">stop</span> <span class="o">=</span> <span class="n">_callback_property</span><span class="p">(</span><span class="s1">&#39;_stop&#39;</span><span class="p">)</span>
  1865. <span class="c1">#: The length of the range or `None`.</span>
  1866. <span class="n">length</span> <span class="o">=</span> <span class="n">_callback_property</span><span class="p">(</span><span class="s1">&#39;_length&#39;</span><span class="p">)</span>
  1867. <span class="k">def</span> <span class="nf">set</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">length</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">&#39;bytes&#39;</span><span class="p">):</span>
  1868. <span class="sd">&quot;&quot;&quot;Simple method to update the ranges.&quot;&quot;&quot;</span>
  1869. <span class="k">assert</span> <span class="n">is_byte_range_valid</span><span class="p">(</span><span class="n">start</span><span class="p">,</span> <span class="n">stop</span><span class="p">,</span> <span class="n">length</span><span class="p">),</span> \
  1870. <span class="s1">&#39;Bad range provided&#39;</span>
  1871. <span class="bp">self</span><span class="o">.</span><span class="n">_units</span> <span class="o">=</span> <span class="n">units</span>
  1872. <span class="bp">self</span><span class="o">.</span><span class="n">_start</span> <span class="o">=</span> <span class="n">start</span>
  1873. <span class="bp">self</span><span class="o">.</span><span class="n">_stop</span> <span class="o">=</span> <span class="n">stop</span>
  1874. <span class="bp">self</span><span class="o">.</span><span class="n">_length</span> <span class="o">=</span> <span class="n">length</span>
  1875. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1876. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1877. <span class="k">def</span> <span class="nf">unset</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1878. <span class="sd">&quot;&quot;&quot;Sets the units to `None` which indicates that the header should</span>
  1879. <span class="sd"> no longer be used.</span>
  1880. <span class="sd"> &quot;&quot;&quot;</span>
  1881. <span class="bp">self</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
  1882. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1883. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">units</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1884. <span class="k">return</span> <span class="s1">&#39;&#39;</span>
  1885. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">length</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1886. <span class="n">length</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span>
  1887. <span class="k">else</span><span class="p">:</span>
  1888. <span class="n">length</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">length</span>
  1889. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">start</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  1890. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> */</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">units</span><span class="p">,</span> <span class="n">length</span><span class="p">)</span>
  1891. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">-</span><span class="si">%s</span><span class="s1">/</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span>
  1892. <span class="bp">self</span><span class="o">.</span><span class="n">units</span><span class="p">,</span>
  1893. <span class="bp">self</span><span class="o">.</span><span class="n">start</span><span class="p">,</span>
  1894. <span class="bp">self</span><span class="o">.</span><span class="n">stop</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span>
  1895. <span class="n">length</span>
  1896. <span class="p">)</span>
  1897. <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1898. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">units</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
  1899. <span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
  1900. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1901. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1902. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1903. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
  1904. <span class="k">class</span> <span class="nc">Authorization</span><span class="p">(</span><span class="n">ImmutableDictMixin</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  1905. <span class="sd">&quot;&quot;&quot;Represents an `Authorization` header sent by the client. You should</span>
  1906. <span class="sd"> not create this kind of object yourself but use it when it&#39;s returned by</span>
  1907. <span class="sd"> the `parse_authorization_header` function.</span>
  1908. <span class="sd"> This object is a dict subclass and can be altered by setting dict items</span>
  1909. <span class="sd"> but it should be considered immutable as it&#39;s returned by the client and</span>
  1910. <span class="sd"> not meant for modifications.</span>
  1911. <span class="sd"> .. versionchanged:: 0.5</span>
  1912. <span class="sd"> This object became immutable.</span>
  1913. <span class="sd"> &quot;&quot;&quot;</span>
  1914. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_type</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1915. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span> <span class="ow">or</span> <span class="p">{})</span>
  1916. <span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="n">auth_type</span>
  1917. <span class="n">username</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;username&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1918. <span class="s1"> The username transmitted. This is set for both basic and digest</span>
  1919. <span class="s1"> auth all the time.&#39;&#39;&#39;</span><span class="p">)</span>
  1920. <span class="n">password</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;password&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1921. <span class="s1"> When the authentication type is basic this is the password</span>
  1922. <span class="s1"> transmitted by the client, else `None`.&#39;&#39;&#39;</span><span class="p">)</span>
  1923. <span class="n">realm</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;realm&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1924. <span class="s1"> This is the server realm sent back for HTTP digest auth.&#39;&#39;&#39;</span><span class="p">)</span>
  1925. <span class="n">nonce</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;nonce&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1926. <span class="s1"> The nonce the server sent for digest auth, sent back by the client.</span>
  1927. <span class="s1"> A nonce should be unique for every 401 response for HTTP digest</span>
  1928. <span class="s1"> auth.&#39;&#39;&#39;</span><span class="p">)</span>
  1929. <span class="n">uri</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;uri&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1930. <span class="s1"> The URI from Request-URI of the Request-Line; duplicated because</span>
  1931. <span class="s1"> proxies are allowed to change the Request-Line in transit. HTTP</span>
  1932. <span class="s1"> digest auth only.&#39;&#39;&#39;</span><span class="p">)</span>
  1933. <span class="n">nc</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;nc&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1934. <span class="s1"> The nonce count value transmitted by clients if a qop-header is</span>
  1935. <span class="s1"> also transmitted. HTTP digest auth only.&#39;&#39;&#39;</span><span class="p">)</span>
  1936. <span class="n">cnonce</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;cnonce&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1937. <span class="s1"> If the server sent a qop-header in the ``WWW-Authenticate``</span>
  1938. <span class="s1"> header, the client has to provide this value for HTTP digest auth.</span>
  1939. <span class="s1"> See the RFC for more details.&#39;&#39;&#39;</span><span class="p">)</span>
  1940. <span class="n">response</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;response&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1941. <span class="s1"> A string of 32 hex digits computed as defined in RFC 2617, which</span>
  1942. <span class="s1"> proves that the user knows a password. Digest auth only.&#39;&#39;&#39;</span><span class="p">)</span>
  1943. <span class="n">opaque</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;opaque&#39;</span><span class="p">),</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  1944. <span class="s1"> The opaque header from the server returned unchanged by the client.</span>
  1945. <span class="s1"> It is recommended that this string be base64 or hexadecimal data.</span>
  1946. <span class="s1"> Digest auth only.&#39;&#39;&#39;</span><span class="p">)</span>
  1947. <span class="nd">@property</span>
  1948. <span class="k">def</span> <span class="nf">qop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1949. <span class="sd">&quot;&quot;&quot;Indicates what &quot;quality of protection&quot; the client has applied to</span>
  1950. <span class="sd"> the message for HTTP digest auth.&quot;&quot;&quot;</span>
  1951. <span class="k">def</span> <span class="nf">on_update</span><span class="p">(</span><span class="n">header_set</span><span class="p">):</span>
  1952. <span class="k">if</span> <span class="ow">not</span> <span class="n">header_set</span> <span class="ow">and</span> <span class="s1">&#39;qop&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  1953. <span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="s1">&#39;qop&#39;</span><span class="p">]</span>
  1954. <span class="k">elif</span> <span class="n">header_set</span><span class="p">:</span>
  1955. <span class="bp">self</span><span class="p">[</span><span class="s1">&#39;qop&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">header_set</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  1956. <span class="k">return</span> <span class="n">parse_set_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;qop&#39;</span><span class="p">),</span> <span class="n">on_update</span><span class="p">)</span>
  1957. <span class="k">class</span> <span class="nc">WWWAuthenticate</span><span class="p">(</span><span class="n">UpdateDictMixin</span><span class="p">,</span> <span class="nb">dict</span><span class="p">):</span>
  1958. <span class="sd">&quot;&quot;&quot;Provides simple access to `WWW-Authenticate` headers.&quot;&quot;&quot;</span>
  1959. <span class="c1">#: list of keys that require quoting in the generated header</span>
  1960. <span class="n">_require_quoting</span> <span class="o">=</span> <span class="nb">frozenset</span><span class="p">([</span><span class="s1">&#39;domain&#39;</span><span class="p">,</span> <span class="s1">&#39;nonce&#39;</span><span class="p">,</span> <span class="s1">&#39;opaque&#39;</span><span class="p">,</span> <span class="s1">&#39;realm&#39;</span><span class="p">,</span> <span class="s1">&#39;qop&#39;</span><span class="p">])</span>
  1961. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">on_update</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  1962. <span class="nb">dict</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">values</span> <span class="ow">or</span> <span class="p">())</span>
  1963. <span class="k">if</span> <span class="n">auth_type</span><span class="p">:</span>
  1964. <span class="bp">self</span><span class="p">[</span><span class="s1">&#39;__auth_type__&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">auth_type</span>
  1965. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span> <span class="o">=</span> <span class="n">on_update</span>
  1966. <span class="k">def</span> <span class="nf">set_basic</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="o">=</span><span class="s1">&#39;authentication required&#39;</span><span class="p">):</span>
  1967. <span class="sd">&quot;&quot;&quot;Clear the auth info and enable basic auth.&quot;&quot;&quot;</span>
  1968. <span class="nb">dict</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1969. <span class="nb">dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="p">{</span><span class="s1">&#39;__auth_type__&#39;</span><span class="p">:</span> <span class="s1">&#39;basic&#39;</span><span class="p">,</span> <span class="s1">&#39;realm&#39;</span><span class="p">:</span> <span class="n">realm</span><span class="p">})</span>
  1970. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">:</span>
  1971. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1972. <span class="k">def</span> <span class="nf">set_digest</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">realm</span><span class="p">,</span> <span class="n">nonce</span><span class="p">,</span> <span class="n">qop</span><span class="o">=</span><span class="p">(</span><span class="s1">&#39;auth&#39;</span><span class="p">,),</span> <span class="n">opaque</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
  1973. <span class="n">algorithm</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">stale</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
  1974. <span class="sd">&quot;&quot;&quot;Clear the auth info and enable digest auth.&quot;&quot;&quot;</span>
  1975. <span class="n">d</span> <span class="o">=</span> <span class="p">{</span>
  1976. <span class="s1">&#39;__auth_type__&#39;</span><span class="p">:</span> <span class="s1">&#39;digest&#39;</span><span class="p">,</span>
  1977. <span class="s1">&#39;realm&#39;</span><span class="p">:</span> <span class="n">realm</span><span class="p">,</span>
  1978. <span class="s1">&#39;nonce&#39;</span><span class="p">:</span> <span class="n">nonce</span><span class="p">,</span>
  1979. <span class="s1">&#39;qop&#39;</span><span class="p">:</span> <span class="n">dump_header</span><span class="p">(</span><span class="n">qop</span><span class="p">)</span>
  1980. <span class="p">}</span>
  1981. <span class="k">if</span> <span class="n">stale</span><span class="p">:</span>
  1982. <span class="n">d</span><span class="p">[</span><span class="s1">&#39;stale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;TRUE&#39;</span>
  1983. <span class="k">if</span> <span class="n">opaque</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1984. <span class="n">d</span><span class="p">[</span><span class="s1">&#39;opaque&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">opaque</span>
  1985. <span class="k">if</span> <span class="n">algorithm</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  1986. <span class="n">d</span><span class="p">[</span><span class="s1">&#39;algorithm&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">algorithm</span>
  1987. <span class="nb">dict</span><span class="o">.</span><span class="n">clear</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1988. <span class="nb">dict</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
  1989. <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">:</span>
  1990. <span class="bp">self</span><span class="o">.</span><span class="n">on_update</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1991. <span class="k">def</span> <span class="nf">to_header</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  1992. <span class="sd">&quot;&quot;&quot;Convert the stored values into a WWW-Authenticate header.&quot;&quot;&quot;</span>
  1993. <span class="n">d</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
  1994. <span class="n">auth_type</span> <span class="o">=</span> <span class="n">d</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;__auth_type__&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">or</span> <span class="s1">&#39;basic&#39;</span>
  1995. <span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">auth_type</span><span class="o">.</span><span class="n">title</span><span class="p">(),</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span>
  1996. <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">key</span><span class="p">,</span> <span class="n">quote_header_value</span><span class="p">(</span><span class="n">value</span><span class="p">,</span>
  1997. <span class="n">allow_token</span><span class="o">=</span><span class="n">key</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_require_quoting</span><span class="p">))</span>
  1998. <span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">iteritems</span><span class="p">(</span><span class="n">d</span><span class="p">)</span>
  1999. <span class="p">]))</span>
  2000. <span class="k">def</span> <span class="nf">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2001. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  2002. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2003. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%r</span><span class="s1">&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span>
  2004. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  2005. <span class="bp">self</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  2006. <span class="p">)</span>
  2007. <span class="k">def</span> <span class="nf">auth_property</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  2008. <span class="sd">&quot;&quot;&quot;A static helper function for subclasses to add extra authentication</span>
  2009. <span class="sd"> system properties onto a class::</span>
  2010. <span class="sd"> class FooAuthenticate(WWWAuthenticate):</span>
  2011. <span class="sd"> special_realm = auth_property(&#39;special_realm&#39;)</span>
  2012. <span class="sd"> For more information have a look at the sourcecode to see how the</span>
  2013. <span class="sd"> regular properties (:attr:`realm` etc.) are implemented.</span>
  2014. <span class="sd"> &quot;&quot;&quot;</span>
  2015. <span class="k">def</span> <span class="nf">_set_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  2016. <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  2017. <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  2018. <span class="k">else</span><span class="p">:</span>
  2019. <span class="bp">self</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
  2020. <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="n">_set_value</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="n">doc</span><span class="p">)</span>
  2021. <span class="k">def</span> <span class="nf">_set_property</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  2022. <span class="k">def</span> <span class="nf">fget</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2023. <span class="k">def</span> <span class="nf">on_update</span><span class="p">(</span><span class="n">header_set</span><span class="p">):</span>
  2024. <span class="k">if</span> <span class="ow">not</span> <span class="n">header_set</span> <span class="ow">and</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
  2025. <span class="k">del</span> <span class="bp">self</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
  2026. <span class="k">elif</span> <span class="n">header_set</span><span class="p">:</span>
  2027. <span class="bp">self</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">header_set</span><span class="o">.</span><span class="n">to_header</span><span class="p">()</span>
  2028. <span class="k">return</span> <span class="n">parse_set_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="n">on_update</span><span class="p">)</span>
  2029. <span class="k">return</span> <span class="nb">property</span><span class="p">(</span><span class="n">fget</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="n">doc</span><span class="p">)</span>
  2030. <span class="nb">type</span> <span class="o">=</span> <span class="n">auth_property</span><span class="p">(</span><span class="s1">&#39;__auth_type__&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2031. <span class="s1"> The type of the auth mechanism. HTTP currently specifies</span>
  2032. <span class="s1"> `Basic` and `Digest`.&#39;&#39;&#39;</span><span class="p">)</span>
  2033. <span class="n">realm</span> <span class="o">=</span> <span class="n">auth_property</span><span class="p">(</span><span class="s1">&#39;realm&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2034. <span class="s1"> A string to be displayed to users so they know which username and</span>
  2035. <span class="s1"> password to use. This string should contain at least the name of</span>
  2036. <span class="s1"> the host performing the authentication and might additionally</span>
  2037. <span class="s1"> indicate the collection of users who might have access.&#39;&#39;&#39;</span><span class="p">)</span>
  2038. <span class="n">domain</span> <span class="o">=</span> <span class="n">_set_property</span><span class="p">(</span><span class="s1">&#39;domain&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2039. <span class="s1"> A list of URIs that define the protection space. If a URI is an</span>
  2040. <span class="s1"> absolute path, it is relative to the canonical root URL of the</span>
  2041. <span class="s1"> server being accessed.&#39;&#39;&#39;</span><span class="p">)</span>
  2042. <span class="n">nonce</span> <span class="o">=</span> <span class="n">auth_property</span><span class="p">(</span><span class="s1">&#39;nonce&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2043. <span class="s1"> A server-specified data string which should be uniquely generated</span>
  2044. <span class="s1"> each time a 401 response is made. It is recommended that this</span>
  2045. <span class="s1"> string be base64 or hexadecimal data.&#39;&#39;&#39;</span><span class="p">)</span>
  2046. <span class="n">opaque</span> <span class="o">=</span> <span class="n">auth_property</span><span class="p">(</span><span class="s1">&#39;opaque&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2047. <span class="s1"> A string of data, specified by the server, which should be returned</span>
  2048. <span class="s1"> by the client unchanged in the Authorization header of subsequent</span>
  2049. <span class="s1"> requests with URIs in the same protection space. It is recommended</span>
  2050. <span class="s1"> that this string be base64 or hexadecimal data.&#39;&#39;&#39;</span><span class="p">)</span>
  2051. <span class="n">algorithm</span> <span class="o">=</span> <span class="n">auth_property</span><span class="p">(</span><span class="s1">&#39;algorithm&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2052. <span class="s1"> A string indicating a pair of algorithms used to produce the digest</span>
  2053. <span class="s1"> and a checksum. If this is not present it is assumed to be &quot;MD5&quot;.</span>
  2054. <span class="s1"> If the algorithm is not understood, the challenge should be ignored</span>
  2055. <span class="s1"> (and a different one used, if there is more than one).&#39;&#39;&#39;</span><span class="p">)</span>
  2056. <span class="n">qop</span> <span class="o">=</span> <span class="n">_set_property</span><span class="p">(</span><span class="s1">&#39;qop&#39;</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2057. <span class="s1"> A set of quality-of-privacy directives such as auth and auth-int.&#39;&#39;&#39;</span><span class="p">)</span>
  2058. <span class="k">def</span> <span class="nf">_get_stale</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2059. <span class="n">val</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;stale&#39;</span><span class="p">)</span>
  2060. <span class="k">if</span> <span class="n">val</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  2061. <span class="k">return</span> <span class="n">val</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s1">&#39;true&#39;</span>
  2062. <span class="k">def</span> <span class="nf">_set_stale</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
  2063. <span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  2064. <span class="bp">self</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;stale&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  2065. <span class="k">else</span><span class="p">:</span>
  2066. <span class="bp">self</span><span class="p">[</span><span class="s1">&#39;stale&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span> <span class="ow">and</span> <span class="s1">&#39;TRUE&#39;</span> <span class="ow">or</span> <span class="s1">&#39;FALSE&#39;</span>
  2067. <span class="n">stale</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_stale</span><span class="p">,</span> <span class="n">_set_stale</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s1">&#39;&#39;&#39;</span>
  2068. <span class="s1"> A flag, indicating that the previous request from the client was</span>
  2069. <span class="s1"> rejected because the nonce value was stale.&#39;&#39;&#39;</span><span class="p">)</span>
  2070. <span class="k">del</span> <span class="n">_get_stale</span><span class="p">,</span> <span class="n">_set_stale</span>
  2071. <span class="c1"># make auth_property a staticmethod so that subclasses of</span>
  2072. <span class="c1"># `WWWAuthenticate` can use it for new properties.</span>
  2073. <span class="n">auth_property</span> <span class="o">=</span> <span class="nb">staticmethod</span><span class="p">(</span><span class="n">auth_property</span><span class="p">)</span>
  2074. <span class="k">del</span> <span class="n">_set_property</span>
  2075. <span class="k">class</span> <span class="nc">FileStorage</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
  2076. <span class="sd">&quot;&quot;&quot;The :class:`FileStorage` class is a thin wrapper over incoming files.</span>
  2077. <span class="sd"> It is used by the request object to represent uploaded files. All the</span>
  2078. <span class="sd"> attributes of the wrapper stream are proxied by the file storage so</span>
  2079. <span class="sd"> it&#39;s possible to do ``storage.read()`` instead of the long form</span>
  2080. <span class="sd"> ``storage.stream.read()``.</span>
  2081. <span class="sd"> &quot;&quot;&quot;</span>
  2082. <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">filename</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
  2083. <span class="n">content_type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">content_length</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
  2084. <span class="n">headers</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
  2085. <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
  2086. <span class="bp">self</span><span class="o">.</span><span class="n">stream</span> <span class="o">=</span> <span class="n">stream</span> <span class="ow">or</span> <span class="n">_empty_stream</span>
  2087. <span class="c1"># if no filename is provided we can attempt to get the filename</span>
  2088. <span class="c1"># from the stream object passed. There we have to be careful to</span>
  2089. <span class="c1"># skip things like &lt;fdopen&gt;, &lt;stderr&gt; etc. Python marks these</span>
  2090. <span class="c1"># special filenames with angular brackets.</span>
  2091. <span class="k">if</span> <span class="n">filename</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  2092. <span class="n">filename</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">stream</span><span class="p">,</span> <span class="s1">&#39;name&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
  2093. <span class="n">s</span> <span class="o">=</span> <span class="n">make_literal_wrapper</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
  2094. <span class="k">if</span> <span class="n">filename</span> <span class="ow">and</span> <span class="n">filename</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">s</span><span class="p">(</span><span class="s1">&#39;&lt;&#39;</span><span class="p">)</span> <span class="ow">and</span> <span class="n">filename</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">s</span><span class="p">(</span><span class="s1">&#39;&gt;&#39;</span><span class="p">):</span>
  2095. <span class="n">filename</span> <span class="o">=</span> <span class="kc">None</span>
  2096. <span class="c1"># On Python 3 we want to make sure the filename is always unicode.</span>
  2097. <span class="c1"># This might not be if the name attribute is bytes due to the</span>
  2098. <span class="c1"># file being opened from the bytes API.</span>
  2099. <span class="k">if</span> <span class="ow">not</span> <span class="n">PY2</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
  2100. <span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">get_filesystem_encoding</span><span class="p">(),</span>
  2101. <span class="s1">&#39;replace&#39;</span><span class="p">)</span>
  2102. <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
  2103. <span class="k">if</span> <span class="n">headers</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
  2104. <span class="n">headers</span> <span class="o">=</span> <span class="n">Headers</span><span class="p">()</span>
  2105. <span class="bp">self</span><span class="o">.</span><span class="n">headers</span> <span class="o">=</span> <span class="n">headers</span>
  2106. <span class="k">if</span> <span class="n">content_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  2107. <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Content-Type&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">content_type</span>
  2108. <span class="k">if</span> <span class="n">content_length</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
  2109. <span class="n">headers</span><span class="p">[</span><span class="s1">&#39;Content-Length&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">content_length</span><span class="p">)</span>
  2110. <span class="k">def</span> <span class="nf">_parse_content_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2111. <span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s1">&#39;_parsed_content_type&#39;</span><span class="p">):</span>
  2112. <span class="bp">self</span><span class="o">.</span><span class="n">_parsed_content_type</span> <span class="o">=</span> \
  2113. <span class="n">parse_options_header</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">content_type</span><span class="p">)</span>
  2114. <span class="nd">@property</span>
  2115. <span class="k">def</span> <span class="nf">content_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2116. <span class="sd">&quot;&quot;&quot;The content-type sent in the header. Usually not available&quot;&quot;&quot;</span>
  2117. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;content-type&#39;</span><span class="p">)</span>
  2118. <span class="nd">@property</span>
  2119. <span class="k">def</span> <span class="nf">content_length</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2120. <span class="sd">&quot;&quot;&quot;The content-length sent in the header. Usually not available&quot;&quot;&quot;</span>
  2121. <span class="k">return</span> <span class="nb">int</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;content-length&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="mi">0</span><span class="p">)</span>
  2122. <span class="nd">@property</span>
  2123. <span class="k">def</span> <span class="nf">mimetype</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2124. <span class="sd">&quot;&quot;&quot;Like :attr:`content_type`, but without parameters (eg, without</span>
  2125. <span class="sd"> charset, type etc.) and always lowercase. For example if the content</span>
  2126. <span class="sd"> type is ``text/HTML; charset=utf-8`` the mimetype would be</span>
  2127. <span class="sd"> ``&#39;text/html&#39;``.</span>
  2128. <span class="sd"> .. versionadded:: 0.7</span>
  2129. <span class="sd"> &quot;&quot;&quot;</span>
  2130. <span class="bp">self</span><span class="o">.</span><span class="n">_parse_content_type</span><span class="p">()</span>
  2131. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parsed_content_type</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
  2132. <span class="nd">@property</span>
  2133. <span class="k">def</span> <span class="nf">mimetype_params</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2134. <span class="sd">&quot;&quot;&quot;The mimetype parameters as dict. For example if the content</span>
  2135. <span class="sd"> type is ``text/html; charset=utf-8`` the params would be</span>
  2136. <span class="sd"> ``{&#39;charset&#39;: &#39;utf-8&#39;}``.</span>
  2137. <span class="sd"> .. versionadded:: 0.7</span>
  2138. <span class="sd"> &quot;&quot;&quot;</span>
  2139. <span class="bp">self</span><span class="o">.</span><span class="n">_parse_content_type</span><span class="p">()</span>
  2140. <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parsed_content_type</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
  2141. <span class="k">def</span> <span class="nf">save</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">buffer_size</span><span class="o">=</span><span class="mi">16384</span><span class="p">):</span>
  2142. <span class="sd">&quot;&quot;&quot;Save the file to a destination path or file object. If the</span>
  2143. <span class="sd"> destination is a file object you have to close it yourself after the</span>
  2144. <span class="sd"> call. The buffer size is the number of bytes held in memory during</span>
  2145. <span class="sd"> the copy process. It defaults to 16KB.</span>
  2146. <span class="sd"> For secure file saving also have a look at :func:`secure_filename`.</span>
  2147. <span class="sd"> :param dst: a filename or open file object the uploaded file</span>
  2148. <span class="sd"> is saved to.</span>
  2149. <span class="sd"> :param buffer_size: the size of the buffer. This works the same as</span>
  2150. <span class="sd"> the `length` parameter of</span>
  2151. <span class="sd"> :func:`shutil.copyfileobj`.</span>
  2152. <span class="sd"> &quot;&quot;&quot;</span>
  2153. <span class="kn">from</span> <span class="nn">shutil</span> <span class="k">import</span> <span class="n">copyfileobj</span>
  2154. <span class="n">close_dst</span> <span class="o">=</span> <span class="kc">False</span>
  2155. <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="n">string_types</span><span class="p">):</span>
  2156. <span class="n">dst</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span> <span class="s1">&#39;wb&#39;</span><span class="p">)</span>
  2157. <span class="n">close_dst</span> <span class="o">=</span> <span class="kc">True</span>
  2158. <span class="k">try</span><span class="p">:</span>
  2159. <span class="n">copyfileobj</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="p">,</span> <span class="n">dst</span><span class="p">,</span> <span class="n">buffer_size</span><span class="p">)</span>
  2160. <span class="k">finally</span><span class="p">:</span>
  2161. <span class="k">if</span> <span class="n">close_dst</span><span class="p">:</span>
  2162. <span class="n">dst</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
  2163. <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2164. <span class="sd">&quot;&quot;&quot;Close the underlying file if possible.&quot;&quot;&quot;</span>
  2165. <span class="k">try</span><span class="p">:</span>
  2166. <span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
  2167. <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
  2168. <span class="k">pass</span>
  2169. <span class="k">def</span> <span class="nf">__nonzero__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2170. <span class="k">return</span> <span class="nb">bool</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
  2171. <span class="n">__bool__</span> <span class="o">=</span> <span class="n">__nonzero__</span>
  2172. <span class="k">def</span> <span class="nf">__getattr__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
  2173. <span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">stream</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
  2174. <span class="k">def</span> <span class="nf">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2175. <span class="k">return</span> <span class="nb">iter</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">readline</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
  2176. <span class="k">def</span> <span class="nf">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
  2177. <span class="k">return</span> <span class="s1">&#39;&lt;</span><span class="si">%s</span><span class="s1">: </span><span class="si">%r</span><span class="s1"> (</span><span class="si">%r</span><span class="s1">)&gt;&#39;</span> <span class="o">%</span> <span class="p">(</span>
  2178. <span class="bp">self</span><span class="o">.</span><span class="n">__class__</span><span class="o">.</span><span class="n">__name__</span><span class="p">,</span>
  2179. <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span>
  2180. <span class="bp">self</span><span class="o">.</span><span class="n">content_type</span>
  2181. <span class="p">)</span>
  2182. <span class="c1"># circular dependencies</span>
  2183. <span class="kn">from</span> <span class="nn">werkzeug.http</span> <span class="k">import</span> <span class="n">dump_options_header</span><span class="p">,</span> <span class="n">dump_header</span><span class="p">,</span> <span class="n">generate_etag</span><span class="p">,</span> \
  2184. <span class="n">quote_header_value</span><span class="p">,</span> <span class="n">parse_set_header</span><span class="p">,</span> <span class="n">unquote_etag</span><span class="p">,</span> <span class="n">quote_etag</span><span class="p">,</span> \
  2185. <span class="n">parse_options_header</span><span class="p">,</span> <span class="n">http_date</span><span class="p">,</span> <span class="n">is_byte_range_valid</span>
  2186. <span class="kn">from</span> <span class="nn">werkzeug</span> <span class="k">import</span> <span class="n">exceptions</span>
  2187. </pre></div>
  2188. </div>
  2189. </div>
  2190. </div>
  2191. <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
  2192. <div class="sphinxsidebarwrapper"><div class="relations">
  2193. <h3>Related Topics</h3>
  2194. <ul>
  2195. <li><a href="../../index.html">Documentation overview</a><ul>
  2196. <li><a href="../index.html">Module code</a><ul>
  2197. </ul></li>
  2198. </ul></li>
  2199. </ul>
  2200. </div>
  2201. <div id="searchbox" style="display: none" role="search">
  2202. <h3>Quick search</h3>
  2203. <form class="search" action="../../search.html" method="get">
  2204. <div><input type="text" name="q" /></div>
  2205. <div><input type="submit" value="Go" /></div>
  2206. <input type="hidden" name="check_keywords" value="yes" />
  2207. <input type="hidden" name="area" value="default" />
  2208. </form>
  2209. </div>
  2210. <script type="text/javascript">$('#searchbox').show(0);</script>
  2211. </div>
  2212. </div>
  2213. <div class="clearer"></div>
  2214. </div>
  2215. <div class="footer">
  2216. &copy;2016, Author.
  2217. |
  2218. Powered by <a href="http://sphinx-doc.org/">Sphinx 1.4.8</a>
  2219. &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.9</a>
  2220. </div>
  2221. </body>
  2222. </html>