Author: markt
Date: Tue Jan 16 20:01:04 2018
New Revision: 1821297

URL: http://svn.apache.org/viewvc?rev=1821297&view=rev
Log:
Clean-up prior to fixing BZ 61993

Added:
    tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java
      - copied, changed from r1821197, 
tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java
Modified:
    tomcat/tc8.5.x/trunk/   (props changed)
    tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
    tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java
    tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java

Propchange: tomcat/tc8.5.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan 16 20:01:04 2018
@@ -1,2 +1,2 @@
 /tomcat/tc8.0.x/trunk:1809644
-/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409
 
,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747
 
404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1
 
756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205
 
3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176
 
8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-
 
1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885
 
50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17
 
95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297
 
,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811
 
329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1
 
820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1821157,1821167
+/tomcat/trunk:1734785,1734799,1734845,1734928,1735041,1735044,1735480,1735577,1735597,1735599-1735600,1735615,1736145,1736162,1736209,1736280,1736297,1736299,1736489,1736646,1736703,1736836,1736849,1737104-1737105,1737112,1737117,1737119-1737120,1737155,1737157,1737192,1737280,1737339,1737632,1737664,1737715,1737748,1737785,1737834,1737860,1737903,1737959,1738005,1738007,1738014-1738015,1738018,1738022,1738039,1738043,1738059-1738060,1738147,1738149,1738174-1738175,1738261,1738589,1738623-1738625,1738643,1738816,1738850,1738855,1738946-1738948,1738953-1738954,1738979,1738982,1739079-1739081,1739087,1739113,1739153,1739172,1739176,1739191,1739474,1739492,1739726,1739762,1739775,1739814,1739817-1739818,1739975,1740131,1740324,1740465,1740495,1740508-1740509,1740520,1740535,1740707,1740803,1740810,1740969,1740980,1740991,1740997,1741015,1741033,1741036,1741058,1741060,1741080,1741147,1741159,1741164,1741173,1741181,1741190,1741197,1741202,1741208,1741213,1741221,1741225,1741232,1741409
 
,1741501,1741677,1741892,1741896,1741984,1742023,1742042,1742071,1742090,1742093,1742101,1742105,1742111,1742139,1742146,1742148,1742166,1742181,1742184,1742187,1742246,1742248-1742251,1742263-1742264,1742268,1742276,1742369,1742387,1742448,1742509-1742512,1742917,1742919,1742933,1742975-1742976,1742984,1742986,1743019,1743115,1743117,1743124-1743125,1743134,1743425,1743554,1743679,1743696-1743698,1743700-1743701,1744058,1744064-1744065,1744125,1744149,1744194,1744229,1744270,1744323,1744432,1744684,1744697,1744705,1744713,1744760,1744786,1745083,1745142-1745143,1745145,1745177,1745179-1745180,1745227,1745248,1745254,1745337,1745467,1745473,1745535,1745576,1745735,1745744,1746304,1746306-1746307,1746319,1746327,1746338,1746340-1746341,1746344,1746427,1746441,1746473,1746490,1746492,1746495-1746496,1746499-1746501,1746503-1746507,1746509,1746549,1746551,1746554,1746556,1746558,1746584,1746620,1746649,1746724,1746939,1746989,1747014,1747028,1747035,1747210,1747225,1747234,1747253,1747
 
404,1747506,1747536,1747924,1747980,1747993,1748001,1748253,1748452,1748547,1748629,1748676,1748715,1749287,1749296,1749328,1749373,1749465,1749506,1749508,1749665-1749666,1749763,1749865-1749866,1749898,1749978,1749980,1750011,1750015,1750056,1750480,1750617,1750634,1750692,1750697,1750700,1750703,1750707,1750714,1750718,1750723,1750774,1750899,1750975,1750995,1751061,1751097,1751173,1751438,1751447,1751463,1751702,1752212,1752737,1752745,1753078,1753080,1753358,1753363,1754111,1754140-1754141,1754281,1754310,1754445,1754467,1754494,1754496,1754528,1754532-1754533,1754613,1754714,1754874,1754941,1754944,1754950-1754951,1755005,1755007,1755009,1755132,1755180-1755181,1755185,1755190,1755204-1755206,1755208,1755214,1755224,1755227,1755230,1755629,1755646-1755647,1755650,1755653,1755675,1755680,1755683,1755693,1755717,1755731-1755737,1755812,1755828,1755884,1755890,1755918-1755919,1755942,1755958,1755960,1755970,1755993,1756013,1756019,1756039,1756056,1756083-1756114,1756175,1756288-1
 
756289,1756408-1756410,1756778,1756798,1756878,1756898,1756939,1757123-1757124,1757126,1757128,1757132-1757133,1757136,1757145,1757167-1757168,1757175,1757180,1757182,1757195,1757271,1757278,1757347,1757353-1757354,1757363,1757374,1757399,1757406,1757408,1757485,1757495,1757499,1757527,1757578,1757684,1757722,1757727,1757790,1757799,1757813,1757853,1757883,1757903,1757976,1757997,1758000,1758058,1758072-1758075,1758078-1758079,1758223,1758257,1758261,1758276,1758292,1758369,1758378-1758383,1758421,1758423,1758425-1758427,1758430,1758443,1758448,1758459,1758483,1758486-1758487,1758499,1758525,1758556,1758580,1758582,1758584,1758588,1758842,1759019,1759212,1759224,1759227,1759252,1759274,1759513-1759516,1759611,1759757,1759785-1759790,1760005,1760022,1760109-1760110,1760135,1760200-1760201,1760227,1760300,1760397,1760446,1760454,1760640,1760648,1761057,1761422,1761491,1761498,1761500-1761501,1761550,1761553,1761572,1761574,1761625-1761626,1761628,1761682,1761740,1761752,1762051-176205
 
3,1762123,1762168,1762172,1762182,1762201-1762202,1762204,1762208,1762288,1762296,1762324,1762348,1762353,1762362,1762374,1762492,1762503,1762505,1762541,1762608,1762710,1762753,1762766,1762769,1762944,1762947,1762953,1763167,1763179,1763232,1763259,1763271-1763272,1763276-1763277,1763319-1763320,1763370,1763372,1763375,1763377,1763393,1763412,1763430,1763450,1763462,1763505,1763511-1763512,1763516,1763518,1763520,1763529,1763559,1763565,1763568,1763574,1763619,1763634-1763635,1763718,1763748,1763786,1763798-1763799,1763810,1763813,1763815,1763819,1763831,1764083,1764425,1764646,1764648-1764649,1764659,1764663,1764682,1764862,1764866-1764867,1764870,1764897,1765133,1765299,1765358,1765439,1765447,1765495,1765502,1765569-1765571,1765579,1765582,1765589-1765590,1765794,1765801,1765813,1765815,1766276,1766514,1766533,1766535,1766664,1766675,1766698,1766700,1766822,1766834,1766840,1767047,1767328,1767362,1767368,1767429,1767471,1767505,1767641-1767644,1767903,1767945-1767946,1768123,176
 
8283,1768520,1768569,1768651,1768762,1768922,1769191,1769263,1769630,1769833,1769975,1770047,1770140,1770180,1770258,1770389,1770656,1770666,1770718,1770762,1770952,1770954,1770956,1770961,1771087,1771126,1771139,1771143,1771149,1771156,1771266,1771316,1771386,1771611,1771613,1771711,1771718,1771723-1771724,1771730,1771743,1771752,1771853,1771963,1772170,1772174,1772223,1772229,1772318-1772319,1772353,1772355,1772554,1772603-1772609,1772849,1772865,1772870,1772872,1772875-1772876,1772881,1772886,1772947,1773306,1773344,1773418,1773756,1773813-1773814,1774052,1774102,1774131,1774161,1774164,1774248,1774253,1774257,1774259,1774262,1774267,1774271,1774303,1774340,1774406,1774412,1774426,1774433,1774522-1774523,1774526,1774528-1774529,1774531,1774732-1774736,1774738-1774739,1774741-1774742,1774749,1774755,1774789,1774858,1774867,1775596,1775985-1775986,1776540,1776937,1776954,1777011,1777173,1777189,1777211,1777524,1777546,1777605,1777619,1777647,1777721-1777722,1777967,1778061,1778138-
 
1778139,1778141-1778150,1778154,1778275-1778276,1778295,1778342,1778348,1778404,1778424,1778426,1778575,1778582,1778600,1778603,1779312,1779370,1779545,1779612,1779622,1779641,1779654,1779708,1779718,1779897,1779899,1779932,1780109,1780120,1780189,1780196,1780488,1780514-1780516,1780601,1780606,1780609-1780610,1780652,1780991,1780995-1780996,1781174,1781569,1781975,1781986,1782116,1782383-1782384,1782566,1782572,1782775,1782779,1782814,1782857,1782868,1782934,1782946-1782947,1782956,1783144-1783147,1783155,1783408,1784182,1784565,1784583,1784657,1784669,1784712,1784723,1784751,1784767,1784806,1784818,1784911,1784926,1784956,1784963,1785032,1785037,1785245,1785271,1785310,1785317,1785643,1785667,1785762,1785774,1785823,1785935,1786051,1786070,1786123-1786124,1786127,1786129,1786341,1786378,1786844,1787200,1787250,1787405,1787701,1787703,1787938,1787959,1787973,1788223-1788224,1788228,1788232,1788241-1788242,1788248,1788323,1788328,1788455,1788460,1788473,1788543-1788544,1788548,17885
 
50,1788554,1788558,1788560,1788567,1788569,1788572,1788647,1788732,1788741,1788747,1788753,1788764,1788771,1788834,1788841,1788852,1788860,1788883,1788890,1789051,1789400,1789415,1789442-1789443,1789447,1789453,1789456,1789458,1789461-1789463,1789465-1789467,1789470,1789472,1789474,1789476,1789479-1789480,1789733,1789735,1789744-1789745,1789937,1789984,1790119,1790180,1790183,1790213,1790376,1790443,1790614,1790983,1790991,1791027-1791028,1791050,1791090,1791095-1791096,1791099,1791101-1791103,1791124,1791129,1791134,1791137,1791298,1791527,1791557,1791970,1792033,1792038,1792055,1792093,1792140,1792460,1792468,1792791,1792957,1793095,1793121,1793123,1793127,1793136,1793139,1793147-1793148,1793266,1793437,1793449,1793460,1793468,1793487,1793498,1793502,1793514,1793682-1793683,1793711-1793712,1793716,1793719,1793736,1793746,1793758,1793771,1793776,1793798,1793802,1793812,1793819,1793844,1793854,1793887,1793891,1793898,1793901-1793902,1793907,1793910,1793980,1794674,1794941-1794942,17
 
95278,1795289,1795298,1795305,1795813,1795893,1796090,1796275,1796693-1796695,1796729,1796806,1796836,1796873,1796878,1797197,1797338,1797344,1797354-1797355,1797516,1797528,1797532,1797536,1797540,1797543,1797677-1797678,1797692,1797694,1797748,1797828,1798126,1798238,1798280,1798371,1798379,1798384,1798390,1798395,1798419,1798505,1798507,1798509,1798533,1798546,1798561,1798977,1799115,1799126,1799164,1799190,1799194,1799216,1799231,1799250,1799253,1799285,1799368,1799412,1799515,1799701-1799702,1799704,1799709,1799885,1799893,1799895,1799916,1800136-1800138,1800202,1800309,1800390,1800617,1800629,1800791,1800816,1800850,1800864,1800867,1800874,1800885,1800981,1800984,1800988,1800992,1801195,1801686,1801688,1801709,1801717,1801774,1801778,1802083,1802195,1802204-1802205,1802210,1802225-1802226,1802229,1802403,1802475,1802490,1802788,1802796,1802803,1802820,1802828,1802833,1802836,1803030,1803038,1803055,1803135,1803165,1803174,1803193,1803205,1803224,1803278,1803281,1803295,1803297
 
,1803446,1803451,1803456,1803459,1803616,1803636,1803828,1803901,1803972,1804040,1804094,1804306,1804461-1804463,1804501,1804506-1804507,1804754,1804813,1804888,1804890,1804903-1804908,1804915,1804917,1805523-1805530,1805550,1805612-1805613,1805637,1805645,1805652,1805726,1805752,1805782,1805826,1806307,1806356,1806445,1806736,1806794,1806798,1806801,1806807,1806873,1806966,1806973,1807004,1807093,1807135,1807205-1807206,1807237,1807242,1807251,1807282,1807455,1807686,1807698,1807713,1807715,1807729,1807742,1807747,1807751,1807755,1808116,1808156,1808266,1808433,1808438-1808439,1808466,1808481-1808482,1808695,1808701,1808766,1809011,1809025,1809141,1809143-1809144,1809146,1809158,1809212,1809214,1809239,1809248,1809263,1809265,1809317,1809434,1809669,1809671,1809674,1809684,1809711,1809828,1809830,1809908-1809909,1809922,1810106,1810110,1810280,1810300,1811031,1811119,1811122,1811132,1811137,1811139,1811174,1811176,1811198-1811201,1811203-1811206,1811220,1811235,1811246,1811327-1811
 
329,1811350,1811560,1811704,1811837-1811839,1811861,1811932,1812087-1812088,1812092,1812094,1812103,1812107,1812113,1812129,1812134-1812136,1812184,1812315,1812401,1812489,1812513,1812617,1813919,1814192,1814195,1814567,1814825,1814973,1814980,1815066,1815069,1815208,1815215,1815318-1815319,1815325,1815385,1815429,1815441-1815442,1815451,1815459,1815465,1815505,1815615,1815793,1815800,1815802,1815806,1815826,1815829,1815834,1815840,1815903,1815944,1815954,1816076,1816078,1816083,1816087,1816120,1816128,1816140,1816147,1816157,1816338,1816431,1816443,1816538,1816541,1816545,1816549-1816550,1816563,1816570,1816647,1816695-1816704,1816716,1816780,1816887,1817089,1817092,1817096,1817104,1817126,1817136-1817137,1817196,1817223,1817298,1817305,1817495,1817517,1817520,1817965,1817997,1817999-1818001,1818004,1818179,1818184,1818438,1818711,1818919,1818976,1819054,1819057,1819061,1819063,1819068,1819070-1819071,1819074,1819077,1819148,1819903,1820003,1820005,1820138,1820153,1820194,1820196-1
 
820197,1820202,1820206,1820222,1820265,1820272,1820276,1820279,1820281,1820302,1820634,1820701,1820705,1820981,1820994,1821157,1821167,1821197-1821203,1821225,1821234-1821235,1821251-1821252

Copied: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java 
(from r1821197, tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java)
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java?p2=tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&p1=tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java&r1=1821197&r2=1821297&rev=1821297&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java (original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/AbstractChunk.java Tue 
Jan 16 20:01:04 2018
@@ -25,4 +25,121 @@ public abstract class AbstractChunk impl
 
     private static final long serialVersionUID = 1L;
 
+
+    private int hashCode = 0;
+    protected boolean hasHashCode = false;
+
+    protected boolean isSet;
+
+    protected int start;
+    protected int end;
+
+
+    /**
+     * @return the start position of the data in the buffer
+     */
+    public int getStart() {
+        return start;
+    }
+
+
+    public int getEnd() {
+        return end;
+    }
+
+
+    public void setEnd(int i) {
+        end = i;
+    }
+
+
+    // TODO: Deprecate offset and use start
+
+    public int getOffset() {
+        return start;
+    }
+
+
+    public void setOffset(int off) {
+        if (end < off) {
+            end = off;
+        }
+        start = off;
+    }
+
+
+    /**
+     * @return the length of the data in the buffer
+     */
+    public int getLength() {
+        return end - start;
+    }
+
+
+    public boolean isNull() {
+        if (end > 0) {
+            return false;
+        }
+        return !isSet;
+    }
+
+
+    public int indexOf(String src, int srcOff, int srcLen, int myOff) {
+        char first = src.charAt(srcOff);
+
+        // Look for first char
+        int srcEnd = srcOff + srcLen;
+
+        mainLoop: for (int i = myOff + start; i <= (end - srcLen); i++) {
+            if (getBufferElement(i) != first) {
+                continue;
+            }
+            // found first char, now look for a match
+            int myPos = i + 1;
+            for (int srcPos = srcOff + 1; srcPos < srcEnd;) {
+                if (getBufferElement(myPos++) != src.charAt(srcPos++)) {
+                    continue mainLoop;
+                }
+            }
+            return i - start; // found it
+        }
+        return -1;
+    }
+
+
+    /**
+     * Resets the chunk to an uninitialized state.
+     */
+    public void recycle() {
+        hasHashCode = false;
+        isSet = false;
+        start = 0;
+        end = 0;
+    }
+
+
+    @Override
+    public int hashCode() {
+        if (hasHashCode) {
+            return hashCode;
+        }
+        int code = 0;
+
+        code = hash();
+        hashCode = code;
+        hasHashCode = true;
+        return code;
+    }
+
+
+    public int hash() {
+        int code = 0;
+        for (int i = start; i < end; i++) {
+            code = code * 37 + getBufferElement(i);
+        }
+        return code;
+    }
+
+
+    protected abstract int getBufferElement(int index);
 }

Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/ByteChunk.java Tue Jan 
16 20:01:04 2018
@@ -17,7 +17,6 @@
 package org.apache.tomcat.util.buf;
 
 import java.io.IOException;
-import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.nio.CharBuffer;
 import java.nio.charset.Charset;
@@ -41,16 +40,15 @@ import java.nio.charset.StandardCharsets
 // inside this way it could provide the search/etc on ByteBuffer, as a helper.
 
 /**
- * This class is used to represent a chunk of bytes, and
- * utilities to manipulate byte[].
+ * This class is used to represent a chunk of bytes, and utilities to 
manipulate
+ * byte[].
  *
  * The buffer can be modified and used for both input and output.
  *
  * There are 2 modes: The chunk can be associated with a sink - 
ByteInputChannel
  * or ByteOutputChannel, which will be used when the buffer is empty (on input)
- * or filled (on output).
- * For output, it can also grow. This operating mode is selected by calling
- * setLimit() or allocate(initial, limit) with limit != -1.
+ * or filled (on output). For output, it can also grow. This operating mode is
+ * selected by calling setLimit() or allocate(initial, limit) with limit != -1.
  *
  * Various search and append method are defined - similar with String and
  * StringBuffer, but operating on bytes.
@@ -65,43 +63,50 @@ import java.nio.charset.StandardCharsets
  * @author Costin Manolache
  * @author Remy Maucherat
  */
-public final class ByteChunk implements Cloneable, Serializable {
+public final class ByteChunk extends AbstractChunk {
 
     private static final long serialVersionUID = 1L;
 
-    /** Input interface, used when the buffer is empty
+    /**
+     * Input interface, used when the buffer is empty.
      *
-     * Same as java.nio.channel.ReadableByteChannel
+     * Same as java.nio.channels.ReadableByteChannel
      */
     public static interface ByteInputChannel {
+
         /**
          * Read new bytes.
          *
          * @return The number of bytes read
          *
-         * @throws IOException If an I/O occurs while reading the bytes
+         * @throws IOException If an I/O error occurs during reading
          */
         public int realReadBytes() throws IOException;
     }
 
-    /** Same as java.nio.channel.WritableByteChannel.
+    /**
+     * When we need more space we'll either grow the buffer ( up to the limit )
+     * or send it to a channel.
+     *
+     * Same as java.nio.channel.WritableByteChannel.
      */
     public static interface ByteOutputChannel {
+
         /**
-         * Send the bytes ( usually the internal conversion buffer ).
-         * Expect 8k output if the buffer is full.
+         * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+         * output if the buffer is full.
          *
-         * @param cbuf bytes that will be written
+         * @param buf bytes that will be written
          * @param off offset in the bytes array
          * @param len length that will be written
          * @throws IOException If an I/O occurs while writing the bytes
          */
-        public void realWriteBytes(byte cbuf[], int off, int len)
-            throws IOException;
+        public void realWriteBytes(byte buf[], int off, int len) throws 
IOException;
+
 
         /**
-         * Send the bytes ( usually the internal conversion buffer ).
-         * Expect 8k output if the buffer is full.
+         * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+         * output if the buffer is full.
          *
          * @param from bytes that will be written
          * @throws IOException If an I/O occurs while writing the bytes
@@ -111,41 +116,35 @@ public final class ByteChunk implements
 
     // --------------------
 
-    /** Default encoding used to convert to strings. It should be UTF8,
-        as most standards seem to converge, but the servlet API requires
-        8859_1, and this object is used mostly for servlets.
-    */
+    /**
+     * Default encoding used to convert to strings. It should be UTF8, as most
+     * standards seem to converge, but the servlet API requires 8859_1, and 
this
+     * object is used mostly for servlets.
+     */
     public static final Charset DEFAULT_CHARSET = StandardCharsets.ISO_8859_1;
 
-    private int hashCode=0;
-    // did we compute the hashcode ?
-    private boolean hasHashCode = false;
+    private transient Charset charset;
 
     // byte[]
     private byte[] buff;
 
-    private int start=0;
-    private int end;
-
-    private Charset charset;
-
-    private boolean isSet=false; // XXX
-
-    // How much can it grow, when data is added
-    private int limit=-1;
+    // -1: grow indefinitely
+    // maximum amount to be cached
+    private int limit = -1;
 
     private ByteInputChannel in = null;
     private ByteOutputChannel out = null;
 
+
     /**
      * Creates a new, uninitialized ByteChunk object.
      */
     public ByteChunk() {
-        // NO-OP
     }
 
-    public ByteChunk( int initial ) {
-        allocate( initial, -1 );
+
+    public ByteChunk(int initial) {
+        allocate(initial, -1);
     }
 
     @Override
@@ -153,36 +152,30 @@ public final class ByteChunk implements
         return super.clone();
     }
 
-    public boolean isNull() {
-        return ! isSet; // buff==null;
-    }
 
-    /**
-     * Resets the message buff to an uninitialized state.
-     */
+    @Override
     public void recycle() {
-        charset=null;
-        start=0;
-        end=0;
-        isSet=false;
-        hasHashCode = false;
+        super.recycle();
+        charset = null;
     }
 
+
     // -------------------- Setup --------------------
 
-    public void allocate( int initial, int limit  ) {
-        if( buff==null || buff.length < initial ) {
-            buff=new byte[initial];
-        }
-        this.limit=limit;
-        start=0;
-        end=0;
-        isSet=true;
+    public void allocate(int initial, int limit) {
+        if (buff == null || buff.length < initial) {
+            buff = new byte[initial];
+        }
+        this.limit = limit;
+        start = 0;
+        end = 0;
+        isSet = true;
         hasHashCode = false;
     }
 
+
     /**
-     * Sets the message bytes to the specified subarray of bytes.
+     * Sets the buffer to the specified subarray of bytes.
      *
      * @param b the ascii bytes
      * @param off the start offset of the bytes
@@ -191,15 +184,17 @@ public final class ByteChunk implements
     public void setBytes(byte[] b, int off, int len) {
         buff = b;
         start = off;
-        end = start+ len;
-        isSet=true;
+        end = start + len;
+        isSet = true;
         hasHashCode = false;
     }
 
+
     public void setCharset(Charset charset) {
         this.charset = charset;
     }
 
+
     public Charset getCharset() {
         if (charset == null) {
             charset = DEFAULT_CHARSET;
@@ -207,109 +202,84 @@ public final class ByteChunk implements
         return charset;
     }
 
+
     /**
-     * @return the message bytes.
+     * @return the buffer.
      */
     public byte[] getBytes() {
         return getBuffer();
     }
 
+
     /**
-     * @return the message bytes.
+     * @return the buffer.
      */
     public byte[] getBuffer() {
         return buff;
     }
 
-    /**
-     * @return the start offset of the bytes.
-     * For output this is the end of the buffer.
-     */
-    public int getStart() {
-        return start;
-    }
-
-    public int getOffset() {
-        return start;
-    }
-
-    public void setOffset(int off) {
-        if (end < off ) {
-            end=off;
-        }
-        start=off;
-    }
-
-    /**
-     * @return the length of the bytes.
-     */
-    public int getLength() {
-        return end-start;
-    }
 
     /**
-     * Maximum amount of data in this buffer.
-     * If -1 or not set, the buffer will grow indefinitely.
-     * Can be smaller than the current buffer size ( which will not shrink ).
-     * When the limit is reached, the buffer will be flushed ( if out is set )
-     * or throw exception.
+     * Maximum amount of data in this buffer. If -1 or not set, the buffer will
+     * grow indefinitely. Can be smaller than the current buffer size ( which
+     * will not shrink ). When the limit is reached, the buffer will be flushed
+     * ( if out is set ) or throw exception.
+     *
      * @param limit The new limit
      */
     public void setLimit(int limit) {
-        this.limit=limit;
+        this.limit = limit;
     }
 
+
     public int getLimit() {
         return limit;
     }
 
+
     /**
      * When the buffer is empty, read the data from the input channel.
+     *
      * @param in The input channel
      */
     public void setByteInputChannel(ByteInputChannel in) {
         this.in = in;
     }
 
+
     /**
-     * When the buffer is full, write the data to the output channel.
-     * Also used when large amount of data is appended.
-     * If not set, the buffer will grow to the limit.
+     * When the buffer is full, write the data to the output channel. Also used
+     * when large amount of data is appended. If not set, the buffer will grow
+     * to the limit.
+     *
      * @param out The output channel
      */
     public void setByteOutputChannel(ByteOutputChannel out) {
-        this.out=out;
+        this.out = out;
     }
 
-    public int getEnd() {
-        return end;
-    }
-
-    public void setEnd( int i ) {
-        end=i;
-    }
 
     // -------------------- Adding data to the buffer --------------------
-    public void append( byte b )
-        throws IOException
-    {
-        makeSpace( 1 );
+
+    public void append(byte b) throws IOException {
+        makeSpace(1);
 
         // couldn't make space
-        if( limit >0 && end >= limit ) {
+        if (limit > 0 && end >= limit) {
             flushBuffer();
         }
-        buff[end++]=b;
+        buff[end++] = b;
     }
 
-    public void append( ByteChunk src )
-        throws IOException
-    {
-        append( src.getBytes(), src.getStart(), src.getLength());
+
+    public void append(ByteChunk src) throws IOException {
+        append(src.getBytes(), src.getStart(), src.getLength());
     }
 
+
     /**
      * Add data to the buffer.
+     *
      * @param src Bytes array
      * @param off Offset
      * @param len Length
@@ -317,13 +287,13 @@ public final class ByteChunk implements
      */
     public void append(byte src[], int off, int len) throws IOException {
         // will grow, up to limit
-        makeSpace( len );
+        makeSpace(len);
 
         // if we don't have limit: makeSpace can grow as it wants
-        if( limit < 0 ) {
+        if (limit < 0) {
             // assert: makeSpace made enough space
-            System.arraycopy( src, off, buff, end, len );
-            end+=len;
+            System.arraycopy(src, off, buff, end, len);
+            end += len;
             return;
         }
 
@@ -331,16 +301,18 @@ public final class ByteChunk implements
         // If the buffer is empty and the source is going to fill up all the
         // space in buffer, may as well write it directly to the output,
         // and avoid an extra copy
-        if ( len == limit && end == start && out != null ) {
-            out.realWriteBytes( src, off, len );
+        if (len == limit && end == start && out != null) {
+            out.realWriteBytes(src, off, len);
             return;
         }
+
         // if we have limit and we're below
-        if( len <= limit - end ) {
+        if (len <= limit - end) {
             // makeSpace will grow the buffer to the limit,
             // so we have space
-            System.arraycopy( src, off, buff, end, len );
-            end+=len;
+            System.arraycopy(src, off, buff, end, len);
+
+            end += len;
             return;
         }
 
@@ -352,7 +324,7 @@ public final class ByteChunk implements
         // We chunk the data into slices fitting in the buffer limit, although
         // if the data is written directly if it doesn't fit
 
-        int avail=limit-end;
+        int avail = limit - end;
         System.arraycopy(src, off, buff, end, avail);
         end += avail;
 
@@ -361,7 +333,7 @@ public final class ByteChunk implements
         int remain = len - avail;
 
         while (remain > (limit - end)) {
-            out.realWriteBytes( src, (off + len) - remain, limit - end );
+            out.realWriteBytes(src, (off + len) - remain, limit - end);
             remain = remain - (limit - end);
         }
 
@@ -457,7 +429,7 @@ public final class ByteChunk implements
     }
 
 
-    public int substract(byte dest[], int off, int len ) throws IOException {
+    public int substract(byte dest[], int off, int len) throws IOException {
         if (checkEof()) {
             return -1;
         }
@@ -474,8 +446,8 @@ public final class ByteChunk implements
     /**
      * Transfers bytes from the buffer to the specified ByteBuffer. After the
      * operation the position of the ByteBuffer will be returned to the one
-     * before the operation, the limit will be the position incremented by
-     * the number of the transfered bytes.
+     * before the operation, the limit will be the position incremented by the
+     * number of the transfered bytes.
      *
      * @param to the ByteBuffer into which bytes are to be written.
      * @return an integer specifying the actual number of bytes read, or -1 if
@@ -515,53 +487,50 @@ public final class ByteChunk implements
      *
      * @throws IOException Writing overflow data to the output channel failed
      */
-    public void flushBuffer()
-        throws IOException
-    {
-        //assert out!=null
-        if( out==null ) {
-            throw new IOException( "Buffer overflow, no sink " + limit + " " +
-                                   buff.length  );
+    public void flushBuffer() throws IOException {
+        // assert out!=null
+        if (out == null) {
+            throw new IOException("Buffer overflow, no sink " + limit + " " + 
buff.length);
         }
-        out.realWriteBytes( buff, start, end-start );
-        end=start;
+        out.realWriteBytes(buff, start, end - start);
+        end = start;
     }
 
+
     /**
      * Make space for len bytes. If len is small, allocate a reserve space too.
      * Never grow bigger than limit.
+     *
      * @param count The size
      */
     public void makeSpace(int count) {
         byte[] tmp = null;
 
         int newSize;
-        int desiredSize=end + count;
+        int desiredSize = end + count;
 
         // Can't grow above the limit
-        if( limit > 0 &&
-            desiredSize > limit) {
-            desiredSize=limit;
+        if (limit > 0 && desiredSize > limit) {
+            desiredSize = limit;
         }
 
-        if( buff==null ) {
-            if( desiredSize < 256 )
-             {
-                desiredSize=256; // take a minimum
+        if (buff == null) {
+            if (desiredSize < 256) {
+                desiredSize = 256; // take a minimum
             }
-            buff=new byte[desiredSize];
+            buff = new byte[desiredSize];
         }
 
         // limit < buf.length ( the buffer is already big )
         // or we already have space XXX
-        if( desiredSize <= buff.length ) {
+        if (desiredSize <= buff.length) {
             return;
         }
         // grow in larger chunks
-        if( desiredSize < 2 * buff.length ) {
-            newSize= buff.length * 2;
+        if (desiredSize < 2 * buff.length) {
+            newSize = buff.length * 2;
         } else {
-            newSize= buff.length * 2 + count ;
+            newSize = buff.length * 2 + count;
         }
 
         if (limit > 0 && newSize > limit) {
@@ -569,25 +538,28 @@ public final class ByteChunk implements
         }
         tmp = new byte[newSize];
 
-        System.arraycopy(buff, start, tmp, 0, end-start);
+        // Compacts buffer
+        System.arraycopy(buff, start, tmp, 0, end - start);
         buff = tmp;
         tmp = null;
-        end=end-start;
-        start=0;
+        end = end - start;
+        start = 0;
     }
 
+
     // -------------------- Conversion and getters --------------------
 
     @Override
     public String toString() {
         if (null == buff) {
             return null;
-        } else if (end-start == 0) {
+        } else if (end - start == 0) {
             return "";
         }
         return StringCache.toString(this);
     }
 
+
     public String toStringInternal() {
         if (charset == null) {
             charset = DEFAULT_CHARSET;
@@ -595,12 +567,13 @@ public final class ByteChunk implements
         // new String(byte[], int, int, Charset) takes a defensive copy of the
         // entire byte array. This is expensive if only a small subset of the
         // bytes will be used. The code below is from Apache Harmony.
-        CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, 
end-start));
+        CharBuffer cb = charset.decode(ByteBuffer.wrap(buff, start, end - 
start));
         return new String(cb.array(), cb.arrayOffset(), cb.length());
     }
 
+
     public long getLong() {
-        return Ascii.parseLong(buff, start,end-start);
+        return Ascii.parseLong(buff, start, end - start);
     }
 
 
@@ -614,67 +587,75 @@ public final class ByteChunk implements
         return false;
     }
 
+
     /**
      * Compares the message bytes to the specified String object.
+     *
      * @param s the String to compare
-     * @return true if the comparison succeeded, false otherwise
+     * @return <code>true</code> if the comparison succeeded, 
<code>false</code>
+     *         otherwise
      */
     public boolean equals(String s) {
         // XXX ENCODING - this only works if encoding is UTF8-compat
         // ( ok for tomcat, where we compare ascii - header names, etc )!!!
 
         byte[] b = buff;
-        int blen = end-start;
-        if (b == null || blen != s.length()) {
+        int len = end - start;
+        if (b == null || len != s.length()) {
             return false;
         }
-        int boff = start;
-        for (int i = 0; i < blen; i++) {
-            if (b[boff++] != s.charAt(i)) {
+        int off = start;
+        for (int i = 0; i < len; i++) {
+            if (b[off++] != s.charAt(i)) {
                 return false;
             }
         }
         return true;
     }
 
+
     /**
      * Compares the message bytes to the specified String object.
+     *
      * @param s the String to compare
-     * @return true if the comparison succeeded, false otherwise
+     * @return <code>true</code> if the comparison succeeded, 
<code>false</code>
+     *         otherwise
      */
     public boolean equalsIgnoreCase(String s) {
         byte[] b = buff;
-        int blen = end-start;
-        if (b == null || blen != s.length()) {
+        int len = end - start;
+        if (b == null || len != s.length()) {
             return false;
         }
-        int boff = start;
-        for (int i = 0; i < blen; i++) {
-            if (Ascii.toLower(b[boff++]) != Ascii.toLower(s.charAt(i))) {
+        int off = start;
+        for (int i = 0; i < len; i++) {
+            if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) {
                 return false;
             }
         }
         return true;
     }
 
-    public boolean equals( ByteChunk bb ) {
-        return equals( bb.getBytes(), bb.getStart(), bb.getLength());
+
+    public boolean equals(ByteChunk bb) {
+        return equals(bb.getBytes(), bb.getStart(), bb.getLength());
     }
 
-    public boolean equals( byte b2[], int off2, int len2) {
-        byte b1[]=buff;
-        if( b1==null && b2==null ) {
+
+    public boolean equals(byte b2[], int off2, int len2) {
+        byte b1[] = buff;
+        if (b1 == null && b2 == null) {
             return true;
         }
 
-        int len=end-start;
-        if ( len2 != len || b1==null || b2==null ) {
+        int len = end - start;
+        if (len != len2 || b1 == null || b2 == null) {
             return false;
         }
 
         int off1 = start;
 
-        while ( len-- > 0) {
+        while (len-- > 0) {
             if (b1[off1++] != b2[off2++]) {
                 return false;
             }
@@ -682,116 +663,74 @@ public final class ByteChunk implements
         return true;
     }
 
-    public boolean equals( CharChunk cc ) {
-        return equals( cc.getChars(), cc.getStart(), cc.getLength());
+
+    public boolean equals(CharChunk cc) {
+        return equals(cc.getChars(), cc.getStart(), cc.getLength());
     }
 
-    public boolean equals( char c2[], int off2, int len2) {
+
+    public boolean equals(char c2[], int off2, int len2) {
         // XXX works only for enc compatible with ASCII/UTF !!!
-        byte b1[]=buff;
-        if( c2==null && b1==null ) {
+        byte b1[] = buff;
+        if (c2 == null && b1 == null) {
             return true;
         }
 
-        if (b1== null || c2==null || end-start != len2 ) {
+        if (b1 == null || c2 == null || end - start != len2) {
             return false;
         }
         int off1 = start;
-        int len=end-start;
+        int len = end - start;
 
-        while ( len-- > 0) {
-            if ( (char)b1[off1++] != c2[off2++]) {
+        while (len-- > 0) {
+            if ((char) b1[off1++] != c2[off2++]) {
                 return false;
             }
         }
         return true;
     }
 
+
     /**
-     * Returns true if the message bytes starts with the specified string.
+     * Returns true if the buffer starts with the specified string.
+     *
      * @param s the string
      * @param pos The position
+     *
      * @return <code>true</code> if the start matches
      */
     public boolean startsWithIgnoreCase(String s, int pos) {
         byte[] b = buff;
         int len = s.length();
-        if (b == null || len+pos > end-start) {
+        if (b == null || len + pos > end - start) {
             return false;
         }
-        int off = start+pos;
+        int off = start + pos;
         for (int i = 0; i < len; i++) {
-            if (Ascii.toLower( b[off++] ) != Ascii.toLower( s.charAt(i))) {
+            if (Ascii.toLower(b[off++]) != Ascii.toLower(s.charAt(i))) {
                 return false;
             }
         }
         return true;
     }
 
-    public int indexOf( String src, int srcOff, int srcLen, int myOff ) {
-        char first=src.charAt( srcOff );
-
-        // Look for first char
-        int srcEnd = srcOff + srcLen;
-
-        mainLoop:
-        for( int i=myOff+start; i <= (end - srcLen); i++ ) {
-            if( buff[i] != first ) {
-                continue;
-            }
-            // found first char, now look for a match
-            int myPos=i+1;
-            for( int srcPos=srcOff + 1; srcPos< srcEnd;) {
-                if( buff[myPos++] != src.charAt( srcPos++ )) {
-                    continue mainLoop;
-                }
-            }
-            return i-start; // found it
-        }
-        return -1;
-    }
-
-    // -------------------- Hash code  --------------------
 
     @Override
-    public int hashCode() {
-        if (hasHashCode) {
-            return hashCode;
-        }
-        int code = 0;
-
-        code = hash();
-        hashCode = code;
-        hasHashCode = true;
-        return code;
-    }
-
-    // normal hash.
-    public int hash() {
-        return hashBytes( buff, start, end-start);
+    protected int getBufferElement(int index) {
+        return buff[index];
     }
 
-    private static int hashBytes( byte buff[], int start, int bytesLen ) {
-        int max=start+bytesLen;
-        byte bb[]=buff;
-        int code=0;
-        for (int i = start; i < max ; i++) {
-            code = code * 37 + bb[i];
-        }
-        return code;
-    }
 
     /**
      * Returns the first instance of the given character in this ByteChunk
      * starting at the specified byte. If the character is not found, -1 is
-     * returned.
-     * <br>
+     * returned. <br>
      * NOTE: This only works for characters in the range 0-127.
      *
-     * @param c         The character
-     * @param starting  The start position
-     * @return          The position of the first instance of the character or
-     *                      -1 if the character is not found.
+     * @param c The character
+     * @param starting The start position
+     * @return The position of the first instance of the character or -1 if the
+     *         character is not found.
      */
     public int indexOf(char c, int starting) {
         int ret = indexOf(buff, start + starting, end, c);
@@ -800,23 +739,22 @@ public final class ByteChunk implements
 
     /**
      * Returns the first instance of the given character in the given byte 
array
-     * between the specified start and end.
-     * <br>
+     * between the specified start and end. <br>
      * NOTE: This only works for characters in the range 0-127.
      *
-     * @param bytes The byte array to search
-     * @param start The point to start searching from in the byte array
-     * @param end   The point to stop searching in the byte array
-     * @param c     The character to search for
-     * @return      The position of the first instance of the character or -1
-     *                  if the character is not found.
+     * @param bytes The array to search
+     * @param start The point to start searching from in the array
+     * @param end The point to stop searching in the array
+     * @param s The character to search for
+     * @return The position of the first instance of the character or -1 if the
+     *         character is not found.
      */
-    public static int indexOf(byte bytes[], int start, int end, char c) {
+    public static int indexOf(byte bytes[], int start, int end, char s) {
         int offset = start;
 
         while (offset < end) {
-            byte b=bytes[offset];
-            if (b == c) {
+            byte b = bytes[offset];
+            if (b == s) {
                 return offset;
             }
             offset++;
@@ -824,16 +762,17 @@ public final class ByteChunk implements
         return -1;
     }
 
+
     /**
      * Returns the first instance of the given byte in the byte array between
      * the specified start and end.
      *
      * @param bytes The byte array to search
      * @param start The point to start searching from in the byte array
-     * @param end   The point to stop searching in the byte array
-     * @param b     The byte to search for
-     * @return      The position of the first instance of the byte or -1 if the
-     *                  byte is not found.
+     * @param end The point to stop searching in the byte array
+     * @param b The byte to search for
+     * @return The position of the first instance of the byte or -1 if the byte
+     *         is not found.
      */
     public static int findByte(byte bytes[], int start, int end, byte b) {
         int offset = start;
@@ -846,22 +785,23 @@ public final class ByteChunk implements
         return -1;
     }
 
+
     /**
      * Returns the first instance of any of the given bytes in the byte array
      * between the specified start and end.
      *
      * @param bytes The byte array to search
      * @param start The point to start searching from in the byte array
-     * @param end   The point to stop searching in the byte array
-     * @param b     The array of bytes to search for
-     * @return      The position of the first instance of the byte or -1 if the
-     *                  byte is not found.
+     * @param end The point to stop searching in the byte array
+     * @param b The array of bytes to search for
+     * @return The position of the first instance of the byte or -1 if the byte
+     *         is not found.
      */
     public static int findBytes(byte bytes[], int start, int end, byte b[]) {
         int blen = b.length;
         int offset = start;
         while (offset < end) {
-            for (int i = 0;  i < blen; i++) {
+            for (int i = 0; i < blen; i++) {
                 if (bytes[offset] == b[i]) {
                     return offset;
                 }
@@ -871,6 +811,7 @@ public final class ByteChunk implements
         return -1;
     }
 
+
     /**
      * Convert specified String to a byte array. This ONLY WORKS for ascii, UTF
      * chars will be truncated.

Modified: tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java 
(original)
+++ tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/buf/CharChunk.java Tue Jan 
16 20:01:04 2018
@@ -17,74 +17,66 @@
 package org.apache.tomcat.util.buf;
 
 import java.io.IOException;
-import java.io.Serializable;
 
 /**
- * Utilities to manipulate char chunks. While String is
- * the easiest way to manipulate chars ( search, substrings, etc),
- * it is known to not be the most efficient solution - Strings are
- * designed as immutable and secure objects.
+ * Utilities to manipulate char chunks. While String is the easiest way to
+ * manipulate chars ( search, substrings, etc), it is known to not be the most
+ * efficient solution - Strings are designed as immutable and secure objects.
  *
  * @author d...@sun.com
  * @author James Todd [go...@sun.com]
  * @author Costin Manolache
  * @author Remy Maucherat
  */
-public final class CharChunk implements Cloneable, Serializable, CharSequence {
+public final class CharChunk extends AbstractChunk implements CharSequence {
 
     private static final long serialVersionUID = 1L;
 
-    // Input interface, used when the buffer is emptied.
+    /**
+     * Input interface, used when the buffer is empty.
+     */
     public static interface CharInputChannel {
+
         /**
          * Read new characters.
          *
          * @return The number of characters read
          *
-         * @throws IOException If an I/O error occurs reading the characters
+         * @throws IOException If an I/O error occurs during reading
          */
         public int realReadChars() throws IOException;
     }
+
     /**
-     *  When we need more space we'll either
-     *  grow the buffer ( up to the limit ) or send it to a channel.
+     * When we need more space we'll either grow the buffer ( up to the limit )
+     * or send it to a channel.
      */
     public static interface CharOutputChannel {
+
         /**
-         * Send the bytes ( usually the internal conversion buffer ).
-         * Expect 8k output if the buffer is full.
+         * Send the bytes ( usually the internal conversion buffer ). Expect 8k
+         * output if the buffer is full.
          *
-         * @param cbuf characters that will be written
+         * @param buf characters that will be written
          * @param off offset in the characters array
          * @param len length that will be written
          * @throws IOException If an I/O occurs while writing the characters
          */
-        public void realWriteChars(char cbuf[], int off, int len)
-            throws IOException;
+        public void realWriteChars(char buf[], int off, int len) throws 
IOException;
     }
 
     // --------------------
 
-    private int hashCode = 0;
-    // did we compute the hashcode ?
-    private boolean hasHashCode = false;
-
     // char[]
-    private char buff[];
-
-    private int start;
-    private int end;
-
-    private boolean isSet=false;  // XXX
+    private char[] buff;
 
     // -1: grow indefinitely
     // maximum amount to be cached
-    private int limit=-1;
+    private int limit = -1;
 
     private CharInputChannel in = null;
     private CharOutputChannel out = null;
 
-    private boolean optimizedWrite=true;
 
     /**
      * Creates a new, uninitialized CharChunk object.
@@ -92,10 +84,12 @@ public final class CharChunk implements
     public CharChunk() {
     }
 
-    public CharChunk(int size) {
-        allocate( size, -1 );
+
+    public CharChunk(int initial) {
+        allocate(initial, -1);
     }
 
+
     // --------------------
 
     @Override
@@ -103,186 +97,147 @@ public final class CharChunk implements
         return super.clone();
     }
 
-    public boolean isNull() {
-        if( end > 0 ) {
-            return false;
-        }
-        return !isSet; //XXX
-    }
 
-    /**
-     * Resets the message bytes to an uninitialized state.
-     */
-    public void recycle() {
-        //        buff=null;
-        isSet=false; // XXX
+    // -------------------- Setup --------------------
+
+    public void allocate(int initial, int limit) {
+        if (buff == null || buff.length < initial) {
+            buff = new char[initial];
+        }
+        this.limit = limit;
+        start = 0;
+        end = 0;
+        isSet = true;
         hasHashCode = false;
-        start=0;
-        end=0;
     }
 
-    // -------------------- Setup --------------------
 
-    public void allocate( int initial, int limit  ) {
-        if( buff==null || buff.length < initial ) {
-            buff=new char[initial];
-        }
-        this.limit=limit;
-        start=0;
-        end=0;
-        isSet=true;
+    /**
+     * Sets the buffer to the specified subarray of characters.
+     *
+     * @param c the characters
+     * @param off the start offset of the characters
+     * @param len the length of the characters
+     */
+    public void setChars(char[] c, int off, int len) {
+        buff = c;
+        start = off;
+        end = start + len;
+        isSet = true;
         hasHashCode = false;
     }
 
 
-    public void setOptimizedWrite(boolean optimizedWrite) {
-        this.optimizedWrite = optimizedWrite;
+    /**
+     * @return the buffer.
+     */
+    public char[] getChars() {
+        return getBuffer();
     }
 
-    public void setChars( char[] c, int off, int len ) {
-        buff=c;
-        start=off;
-        end=start + len;
-        isSet=true;
-        hasHashCode = false;
+
+    /**
+     * @return the buffer.
+     */
+    public char[] getBuffer() {
+        return buff;
     }
 
+
     /**
-     * Maximum amount of data in this buffer.
-     * If -1 or not set, the buffer will grow indefinitely.
-     * Can be smaller than the current buffer size ( which will not shrink ).
-     * When the limit is reached, the buffer will be flushed ( if out is set )
-     * or throw exception.
+     * Maximum amount of data in this buffer. If -1 or not set, the buffer will
+     * grow indefinitely. Can be smaller than the current buffer size ( which
+     * will not shrink ). When the limit is reached, the buffer will be flushed
+     * ( if out is set ) or throw exception.
+     *
      * @param limit The new limit
      */
     public void setLimit(int limit) {
-        this.limit=limit;
+        this.limit = limit;
     }
 
+
     public int getLimit() {
         return limit;
     }
 
+
     /**
      * When the buffer is empty, read the data from the input channel.
+     *
      * @param in The input channel
      */
     public void setCharInputChannel(CharInputChannel in) {
         this.in = in;
     }
 
+
     /**
-     * When the buffer is full, write the data to the output channel.
-     * Also used when large amount of data is appended.
-     * If not set, the buffer will grow to the limit.
+     * When the buffer is full, write the data to the output channel. Also used
+     * when large amount of data is appended. If not set, the buffer will grow
+     * to the limit.
+     *
      * @param out The output channel
      */
     public void setCharOutputChannel(CharOutputChannel out) {
-        this.out=out;
-    }
-
-    // compat
-    public char[] getChars()
-    {
-        return getBuffer();
-    }
-
-    public char[] getBuffer()
-    {
-        return buff;
-    }
-
-    /**
-     * @return the start offset of the chars.
-     * For output this is the end of the buffer.
-     */
-    public int getStart() {
-        return start;
-    }
-
-    public int getOffset() {
-        return start;
-    }
-
-    /**
-     * @param off The offset
-     */
-    public void setOffset(int off) {
-        start=off;
-    }
-
-    /**
-     * @return the length of the bytes.
-     */
-    public int getLength() {
-        return end-start;
+        this.out = out;
     }
 
 
-    public int getEnd() {
-        return end;
-    }
+    // -------------------- Adding data to the buffer --------------------
 
-    public void setEnd( int i ) {
-        end=i;
-    }
-
-    // -------------------- Adding data --------------------
-
-    public void append( char b )
-        throws IOException
-    {
-        makeSpace( 1 );
+    public void append(char b) throws IOException {
+        makeSpace(1);
 
         // couldn't make space
-        if( limit >0 && end >= limit ) {
+        if (limit > 0 && end >= limit) {
             flushBuffer();
         }
-        buff[end++]=b;
+        buff[end++] = b;
     }
 
-    public void append( CharChunk src )
-        throws IOException
-    {
-        append( src.getBuffer(), src.getOffset(), src.getLength());
+
+    public void append(CharChunk src) throws IOException {
+        append(src.getBuffer(), src.getOffset(), src.getLength());
     }
 
+
     /**
      * Add data to the buffer.
+     *
      * @param src Char array
      * @param off Offset
      * @param len Length
      * @throws IOException Writing overflow data to the output channel failed
      */
-    public void append( char src[], int off, int len )
-        throws IOException
-    {
+    public void append(char src[], int off, int len) throws IOException {
         // will grow, up to limit
-        makeSpace( len );
+        makeSpace(len);
 
         // if we don't have limit: makeSpace can grow as it wants
-        if( limit < 0 ) {
+        if (limit < 0) {
             // assert: makeSpace made enough space
-            System.arraycopy( src, off, buff, end, len );
-            end+=len;
+            System.arraycopy(src, off, buff, end, len);
+            end += len;
             return;
         }
 
         // Optimize on a common case.
-        // If the source is going to fill up all the space in buffer, may
-        // as well write it directly to the output, and avoid an extra copy
-        if ( optimizedWrite && len == limit && end == start && out != null ) {
-            out.realWriteChars( src, off, len );
+        // If the buffer is empty and the source is going to fill up all the
+        // space in buffer, may as well write it directly to the output,
+        // and avoid an extra copy
+        if (len == limit && end == start && out != null) {
+            out.realWriteChars(src, off, len);
             return;
         }
 
         // if we have limit and we're below
-        if( len <= limit - end ) {
+        if (len <= limit - end) {
             // makeSpace will grow the buffer to the limit,
             // so we have space
-            System.arraycopy( src, off, buff, end, len );
+            System.arraycopy(src, off, buff, end, len);
 
-            end+=len;
+            end += len;
             return;
         }
 
@@ -298,32 +253,34 @@ public final class CharChunk implements
         // and still have some space for more. We'll still have 2 writes, but
         // we write more on the first.
 
-        if( len + end < 2 * limit ) {
-            /* If the request length exceeds the size of the output buffer,
-               flush the output buffer and then write the data directly.
-               We can't avoid 2 writes, but we can write more on the second
-            */
-            int avail=limit-end;
+        if (len + end < 2 * limit) {
+            /*
+             * If the request length exceeds the size of the output buffer,
+             * flush the output buffer and then write the data directly. We
+             * can't avoid 2 writes, but we can write more on the second
+             */
+            int avail = limit - end;
             System.arraycopy(src, off, buff, end, avail);
             end += avail;
 
             flushBuffer();
 
-            System.arraycopy(src, off+avail, buff, end, len - avail);
-            end+= len - avail;
+            System.arraycopy(src, off + avail, buff, end, len - avail);
+            end += len - avail;
 
-        } else {        // len > buf.length + avail
+        } else { // len > buf.length + avail
             // long write - flush the buffer and write the rest
             // directly from source
             flushBuffer();
 
-            out.realWriteChars( src, off, len );
+            out.realWriteChars(src, off, len);
         }
     }
 
 
     /**
      * Append a string to the buffer.
+     *
      * @param s The string
      * @throws IOException Writing overflow data to the output channel failed
      */
@@ -331,26 +288,28 @@ public final class CharChunk implements
         append(s, 0, s.length());
     }
 
+
     /**
      * Append a string to the buffer.
+     *
      * @param s The string
      * @param off Offset
      * @param len Length
      * @throws IOException Writing overflow data to the output channel failed
      */
     public void append(String s, int off, int len) throws IOException {
-        if (s==null) {
+        if (s == null) {
             return;
         }
 
         // will grow, up to limit
-        makeSpace( len );
+        makeSpace(len);
 
         // if we don't have limit: makeSpace can grow as it wants
-        if( limit < 0 ) {
+        if (limit < 0) {
             // assert: makeSpace made enough space
-            s.getChars(off, off+len, buff, end );
-            end+=len;
+            s.getChars(off, off + len, buff, end);
+            end += len;
             return;
         }
 
@@ -358,7 +317,7 @@ public final class CharChunk implements
         int sEnd = off + len;
         while (sOff < sEnd) {
             int d = min(limit - end, sEnd - sOff);
-            s.getChars( sOff, sOff+d, buff, end);
+            s.getChars(sOff, sOff + d, buff, end);
             sOff += d;
             end += d;
             if (end >= limit) {
@@ -367,32 +326,21 @@ public final class CharChunk implements
         }
     }
 
+
     // -------------------- Removing data from the buffer --------------------
 
     public int substract() throws IOException {
-        if ((end - start) == 0) {
-            if (in == null) {
-                return -1;
-            }
-            int n = in.realReadChars();
-            if (n < 0) {
-                return -1;
-            }
+        if (checkEof()) {
+            return -1;
         }
-        return (buff[start++]);
+        return buff[start++];
     }
 
+
     public int substract(char dest[], int off, int len) throws IOException {
-        if ((end - start) == 0) {
-            if (in == null) {
-                return -1;
-            }
-            int n = in.realReadChars();
-            if (n < 0) {
-                return -1;
-            }
+        if (checkEof()) {
+            return -1;
         }
-
         int n = len;
         if (len > getLength()) {
             n = getLength();
@@ -403,52 +351,70 @@ public final class CharChunk implements
     }
 
 
+    private boolean checkEof() throws IOException {
+        if ((end - start) == 0) {
+            if (in == null) {
+                return true;
+            }
+            int n = in.realReadChars();
+            if (n < 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+    /**
+     * Send the buffer to the sink. Called by append() when the limit is
+     * reached. You can also call it explicitly to force the data to be 
written.
+     *
+     * @throws IOException Writing overflow data to the output channel failed
+     */
     public void flushBuffer() throws IOException {
-        //assert out!=null
-        if( out==null ) {
-            throw new IOException( "Buffer overflow, no sink " + limit + " " +
-                                   buff.length  );
+        // assert out!=null
+        if (out == null) {
+            throw new IOException("Buffer overflow, no sink " + limit + " " + 
buff.length);
         }
-        out.realWriteChars( buff, start, end - start );
-        end=start;
+        out.realWriteChars(buff, start, end - start);
+        end = start;
     }
 
+
     /**
-     * Make space for len chars. If len is small, allocate
-     * a reserve space too. Never grow bigger than limit.
+     * Make space for len chars. If len is small, allocate a reserve space too.
+     * Never grow bigger than limit.
+     *
      * @param count The size
      */
-    public void makeSpace(int count)
-    {
+    public void makeSpace(int count) {
         char[] tmp = null;
 
         int newSize;
-        int desiredSize=end + count;
+        int desiredSize = end + count;
 
         // Can't grow above the limit
-        if( limit > 0 &&
-            desiredSize > limit) {
-            desiredSize=limit;
+        if (limit > 0 && desiredSize > limit) {
+            desiredSize = limit;
         }
 
-        if( buff==null ) {
-            if( desiredSize < 256 )
-             {
-                desiredSize=256; // take a minimum
+        if (buff == null) {
+            if (desiredSize < 256) {
+                desiredSize = 256; // take a minimum
             }
-            buff=new char[desiredSize];
+            buff = new char[desiredSize];
         }
 
         // limit < buf.length ( the buffer is already big )
         // or we already have space XXX
-        if( desiredSize <= buff.length) {
+        if (desiredSize <= buff.length) {
             return;
         }
         // grow in larger chunks
-        if( desiredSize < 2 * buff.length ) {
-            newSize= buff.length * 2;
+        if (desiredSize < 2 * buff.length) {
+            newSize = buff.length * 2;
         } else {
-            newSize= buff.length * 2 + count ;
+            newSize = buff.length * 2 + count;
         }
 
         if (limit > 0 && newSize > limit) {
@@ -456,27 +422,31 @@ public final class CharChunk implements
         }
         tmp = new char[newSize];
 
+        // Some calling code assumes buffer will not be compacted
         System.arraycopy(buff, 0, tmp, 0, end);
         buff = tmp;
         tmp = null;
     }
 
+
     // -------------------- Conversion and getters --------------------
 
     @Override
     public String toString() {
         if (null == buff) {
             return null;
-        } else if (end-start == 0) {
+        } else if (end - start == 0) {
             return "";
         }
         return StringCache.toString(this);
     }
 
+
     public String toStringInternal() {
-        return new String(buff, start, end-start);
+        return new String(buff, start, end - start);
     }
 
+
     // -------------------- equals --------------------
 
     @Override
@@ -487,14 +457,17 @@ public final class CharChunk implements
         return false;
     }
 
+
     /**
      * Compares the message bytes to the specified String object.
+     *
      * @param s the String to compare
-     * @return <code>true</code> if the comparison succeeded, 
<code>false</code> otherwise
+     * @return <code>true</code> if the comparison succeeded, 
<code>false</code>
+     *         otherwise
      */
     public boolean equals(String s) {
         char[] c = buff;
-        int len = end-start;
+        int len = end - start;
         if (c == null || len != s.length()) {
             return false;
         }
@@ -507,42 +480,49 @@ public final class CharChunk implements
         return true;
     }
 
+
     /**
      * Compares the message bytes to the specified String object.
+     *
      * @param s the String to compare
-     * @return <code>true</code> if the comparison succeeded, 
<code>false</code> otherwise
+     * @return <code>true</code> if the comparison succeeded, 
<code>false</code>
+     *         otherwise
      */
     public boolean equalsIgnoreCase(String s) {
         char[] c = buff;
-        int len = end-start;
+        int len = end - start;
         if (c == null || len != s.length()) {
             return false;
         }
         int off = start;
         for (int i = 0; i < len; i++) {
-            if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) {
+            if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) {
                 return false;
             }
         }
         return true;
     }
 
+
     public boolean equals(CharChunk cc) {
-        return equals( cc.getChars(), cc.getOffset(), cc.getLength());
+        return equals(cc.getChars(), cc.getOffset(), cc.getLength());
     }
 
+
     public boolean equals(char b2[], int off2, int len2) {
-        char b1[]=buff;
-        if( b1==null && b2==null ) {
+        char b1[] = buff;
+        if (b1 == null && b2 == null) {
             return true;
         }
 
-        if (b1== null || b2==null || end-start != len2) {
+        int len = end - start;
+        if (len != len2 || b1 == null || b2 == null) {
             return false;
         }
+
         int off1 = start;
-        int len=end-start;
-        while ( len-- > 0) {
+
+        while (len-- > 0) {
             if (b1[off1++] != b2[off2++]) {
                 return false;
             }
@@ -550,14 +530,16 @@ public final class CharChunk implements
         return true;
     }
 
+
     /**
-     * @return <code>true</code> if the message bytes starts with the 
specified string.
+     * @return <code>true</code> if the message bytes starts with the specified
+     *         string.
      * @param s The string
      */
     public boolean startsWith(String s) {
         char[] c = buff;
         int len = s.length();
-        if (c == null || len > end-start) {
+        if (c == null || len > end - start) {
             return false;
         }
         int off = start;
@@ -569,20 +551,24 @@ public final class CharChunk implements
         return true;
     }
 
+
     /**
-     * @return <code>true</code> if the message bytes starts with the 
specified string.
-     * @param s The string
-     * @param pos The position at which the comparison will be made
+     * Returns true if the buffer starts with the specified string.
+     *
+     * @param s the string
+     * @param pos The position
+     *
+     * @return <code>true</code> if the start matches
      */
     public boolean startsWithIgnoreCase(String s, int pos) {
         char[] c = buff;
         int len = s.length();
-        if (c == null || len+pos > end-start) {
+        if (c == null || len + pos > end - start) {
             return false;
         }
-        int off = start+pos;
+        int off = start + pos;
         for (int i = 0; i < len; i++) {
-            if (Ascii.toLower( c[off++] ) != Ascii.toLower( s.charAt(i))) {
+            if (Ascii.toLower(c[off++]) != Ascii.toLower(s.charAt(i))) {
                 return false;
             }
         }
@@ -591,13 +577,14 @@ public final class CharChunk implements
 
 
     /**
-     * @return <code>true</code> if the message bytes end with the specified 
string.
+     * @return <code>true</code> if the message bytes end with the specified
+     *         string.
      * @param s The string
      */
     public boolean endsWith(String s) {
         char[] c = buff;
         int len = s.length();
-        if (c == null || len > end-start) {
+        if (c == null || len > end - start) {
             return false;
         }
         int off = end - len;
@@ -609,82 +596,59 @@ public final class CharChunk implements
         return true;
     }
 
-    // -------------------- Hash code  --------------------
 
     @Override
-    public int hashCode() {
-        if (hasHashCode) {
-            return hashCode;
-        }
-        int code = 0;
-
-        code = hash();
-        hashCode = code;
-        hasHashCode = true;
-        return code;
+    protected int getBufferElement(int index) {
+        return buff[index];
     }
 
-    // normal hash.
-    public int hash() {
-        int code=0;
-        for (int i = start; i < start + end-start; i++) {
-            code = code * 37 + buff[i];
-        }
-        return code;
-    }
 
     public int indexOf(char c) {
-        return indexOf( c, start);
+        return indexOf(c, start);
     }
 
+
     /**
-     * @return <code>true</code> if the message bytes starts with the 
specified string.
-     * @param c the character
-     * @param starting Start position
+     * Returns the first instance of the given character in this CharChunk
+     * starting at the specified char. If the character is not found, -1 is
+     * returned. <br>
+     *
+     * @param c The character
+     * @param starting The start position
+     * @return The position of the first instance of the character or -1 if the
+     *         character is not found.
      */
     public int indexOf(char c, int starting) {
-        int ret = indexOf( buff, start+starting, end, c );
+        int ret = indexOf(buff, start + starting, end, c);
         return (ret >= start) ? ret - start : -1;
     }
 
-    public static int indexOf( char chars[], int off, int cend, char qq )
-    {
-        while( off < cend ) {
-            char b=chars[off];
-            if( b==qq ) {
-                return off;
-            }
-            off++;
-        }
-        return -1;
-    }
-
 
-    public int indexOf( String src, int srcOff, int srcLen, int myOff ) {
-        char first=src.charAt( srcOff );
-
-        // Look for first char
-        int srcEnd = srcOff + srcLen;
-
-        for( int i=myOff+start; i <= (end - srcLen); i++ ) {
-            if( buff[i] != first ) {
-                continue;
-            }
-            // found first char, now look for a match
-            int myPos=i+1;
-            for( int srcPos=srcOff + 1; srcPos< srcEnd;) {
-                if( buff[myPos++] != src.charAt( srcPos++ )) {
-                    break;
-                }
-                if( srcPos==srcEnd )
-                 {
-                    return i-start; // found it
-                }
+    /**
+     * Returns the first instance of the given character in the given char 
array
+     * between the specified start and end. <br>
+     *
+     * @param chars The array to search
+     * @param start The point to start searching from in the array
+     * @param end The point to stop searching in the array
+     * @param s The character to search for
+     * @return The position of the first instance of the character or -1 if the
+     *         character is not found.
+     */
+    public static int indexOf(char chars[], int start, int end, char s) {
+        int offset = start;
+
+        while (offset < end) {
+            char c = chars[offset];
+            if (c == s) {
+                return offset;
             }
+            offset++;
         }
         return -1;
     }
 
+
     // -------------------- utils
     private int min(int a, int b) {
         if (a < b) {
@@ -693,6 +657,7 @@ public final class CharChunk implements
         return b;
     }
 
+
     // Char sequence impl
 
     @Override
@@ -700,6 +665,7 @@ public final class CharChunk implements
         return buff[index + start];
     }
 
+
     @Override
     public CharSequence subSequence(int start, int end) {
         try {
@@ -713,9 +679,21 @@ public final class CharChunk implements
         }
     }
 
+
     @Override
     public int length() {
         return end - start;
     }
 
+    /**
+     * NO-OP.
+     *
+     * @param optimizedWrite Ignored
+     *
+     * @deprecated Unused code. This is now a NO-OP and will be removed without
+     *             replacement in Tomcat 10.
+     */
+    @Deprecated
+    public void setOptimizedWrite(boolean optimizedWrite) {
+    }
 }

Modified: 
tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java?rev=1821297&r1=1821296&r2=1821297&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java 
(original)
+++ tomcat/tc8.5.x/trunk/test/org/apache/tomcat/util/buf/TestCharChunk.java Tue 
Jan 16 20:01:04 2018
@@ -36,4 +36,30 @@ public class TestCharChunk {
         Assert.assertFalse(cc.endsWith("x"));
         Assert.assertFalse(cc.endsWith("xxtest"));
     }
+
+    @Test
+    public void testIndexOf_String() {
+        char[] chars = "Hello\u00a0world".toCharArray();
+        final int len = chars.length;
+
+        CharChunk cc = new CharChunk();
+        cc.setChars(chars, 0, len);
+
+        Assert.assertEquals(0, cc.indexOf("Hello", 0, "Hello".length(), 0));
+        Assert.assertEquals(2, cc.indexOf("ll", 0, 2, 0));
+        Assert.assertEquals(2, cc.indexOf("Hello", 2, 2, 0));
+
+        Assert.assertEquals(7, cc.indexOf("o", 0, 1, 5));
+
+        // Does work outside of 0-127 (unlike ByteChunk)
+        Assert.assertEquals(5, cc.indexOf("\u00a0", 0, 1, 0));
+
+        cc.setChars(chars, 6, 5);
+        Assert.assertEquals(1, cc.indexOf("o", 0, 1, 0));
+
+        cc.setChars(chars, 6, 2);
+        Assert.assertEquals(0, cc.indexOf("wo", 0, 1, 0));
+        Assert.assertEquals(-1, cc.indexOf("d", 0, 1, 0));
+    }
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to