Author: markt
Date: Mon Aug 15 20:42:09 2016
New Revision: 1756430

URL: http://svn.apache.org/viewvc?rev=1756430&view=rev
Log:
Switch the CGI servlet to the standard logging mechanism and remove support for 
the debug attribute.
Align 6.0.x with 7.0.x

Modified:
    tomcat/tc6.0.x/trunk/   (props changed)
    tomcat/tc6.0.x/trunk/conf/web.xml
    tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/CGIServlet.java
    
tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/LocalStrings.properties
    tomcat/tc6.0.x/trunk/webapps/docs/cgi-howto.xml
    tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml

Propchange: tomcat/tc6.0.x/trunk/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Aug 15 20:42:09 2016
@@ -1,4 +1,4 @@
-/tomcat/tc7.0.x/trunk:1190476,1224802,1243045,1298635,1304471,1311997,1312007,1331772,1333164,1333176,1348992,1354866,1371298,1371302,1371620,1402110,1409014,1413553,1413557,1413563,1430083,1438415,1446641-1446660,1447013,1453106,1453119,1484919,1486877,1500065,1503852,1505844,1513151,1521040,1526470,1536524,1539176-1539177,1544469,1544473,1552805,1558894,1558917,1561368,1561382,1561386,1561552,1561561,1561636,1561641,1561643,1561737,1562748,1564317,1568922,1570163,1577328,1577464-1577465,1578814,1586659,1586897,1586960,1588199,1588997,1589740,1589851,1589997,1590019,1590028,1590337,1590492,1590651,1590838,1590845,1590848,1590912,1593262,1593288,1593371,1593835,1594230,1595174,1595366,1600956,1601333,1601856,1601909,1609079,1609606,1617364,1617374,1617433,1617457-1617458,1624249,1626579,1627420,1627469,1632586,1637686,1637711,1640675,1642045,1643515,1643540,1643572,1643585-1643586,1643642,1643647,1644019,1648817,1656301,1658815,1659523,1659564,1664001,1664176,1665087,1666968,1666989
 
,1668541,1668635,1669802,1676557,1681183,1681841,1681865,1681867,1685829,1693109,1694293,1694433,1694875,1696381,1701945,1710353,1712656,1713873,1714000,1714005,1714540,1715213,1716221,1716417,1717107,1717210,1717212,1720236,1720398,1720443,1720464,1721814,1721883,1722645,1722801,1723151,1724435,1724553,1724675,1724797,1724806,1725931,1726631,1726808,1726813,1726815,1726817,1726819,1726917,1726919,1726922-1726924,1727031,1727034,1727043,1727158,1727672,1727903,1728450,1729363,1731010,1731119,1731956,1731978,1732362,1732674-1732675,1733942,1734116,1734134,1734532,1737249,1737253,1737968,1738049,1738186,1739778,1741178,1741184,1741193,1741211,1741218,1741228,1741235,1742281,1743121,1743142,1743649,1744061,1744129,1744155,1744241,1744383,1744689,1745230,1746942,1746994,1749377,1750018,1750980,1751066,1754114,1754147,1754728,1754880,1754891,1754898,1754902,1756030
+/tomcat/tc7.0.x/trunk:1190476,1224802,1243045,1298635,1304471,1311997,1312007,1331772,1333164,1333176,1348992,1354866,1371298,1371302,1371620,1402110,1409014,1413553,1413557,1413563,1430083,1438415,1446641-1446660,1447013,1453106,1453119,1484919,1486877,1500065,1503852,1505844,1513151,1521040,1526470,1536524,1539176-1539177,1544469,1544473,1552805,1558894,1558917,1561368,1561382,1561386,1561552,1561561,1561636,1561641,1561643,1561737,1562748,1564317,1568922,1570163,1577328,1577464-1577465,1578814,1586659,1586897,1586960,1588199,1588997,1589740,1589851,1589997,1590019,1590028,1590337,1590492,1590651,1590838,1590845,1590848,1590912,1593262,1593288,1593371,1593835,1594230,1595174,1595366,1600956,1601333,1601856,1601909,1609079,1609606,1617364,1617374,1617433,1617457-1617458,1624249,1626579,1627420,1627469,1632586,1637686,1637711,1640675,1642045,1643515,1643540,1643572,1643585-1643586,1643642,1643647,1644019,1648817,1656301,1658815,1659523,1659564,1664001,1664176,1665087,1666968,1666989
 
,1668541,1668635,1669802,1676557,1681183,1681841,1681865,1681867,1685829,1693109,1694293,1694433,1694875,1696381,1701945,1710353,1712656,1713873,1714000,1714005,1714540,1715213,1716221,1716417,1717107,1717210,1717212,1720236,1720398,1720443,1720464,1721814,1721883,1722645,1722801,1723151,1724435,1724553,1724675,1724797,1724806,1725931,1726631,1726808,1726813,1726815,1726817,1726819,1726917,1726919,1726922-1726924,1727031,1727034,1727043,1727158,1727672,1727903,1728450,1729363,1731010,1731119,1731956,1731978,1732362,1732674-1732675,1733942,1734116,1734134,1734532,1737249,1737253,1737968,1738049,1738186,1739778,1741178,1741184,1741193,1741211,1741218,1741228,1741235,1742281,1743121,1743142,1743649,1744061,1744129,1744155,1744241,1744383,1744689,1745230,1746942,1746994,1749377,1750018,1750980,1751066,1754114,1754147,1754728,1754880,1754891,1754898,1754902,1756030,1756417,1756420,1756423
 
/tomcat/tc8.0.x/trunk:1637685,1637709,1640674,1641726,1641729-1641730,1643513,1643539,1643571,1643581-1643582,1644018,1648816,1656300,1658801-1658803,1658811,1659522,1663997,1664175,1665086,1666967,1666988,1668634,1669801,1676556,1681182,1681840,1681864,1685827,1689921,1693108,1694291,1694427,1694873,1696379,1701944,1710347,1712618,1712655,1713872,1713998,1714004,1714538,1715207,1715866,1716216-1716217,1716414,1717208-1717209,1720235,1720396,1720442,1720463,1721813,1721882,1722800,1723130,1724434,1724674,1724792,1724803,1725929,1725963-1725965,1725970,1725974,1726172,1726175,1726179-1726182,1726195-1726198,1726200,1726203,1726226,1726576,1726630,1727029,1727037,1727671,1727900,1728449,1729362,1731009,1731955,1731977,1732360,1732672,1733941,1734115,1734133,1734531,1737967,1738173,1739777,1741217,1743647,1744152,1756018
-/tomcat/tc8.5.x/trunk:1737199,1737966,1738044,1741174,1741182,1741191,1741209,1741226,1741233,1742277,1743118,1743139-1743140,1744059,1744127,1744151,1744232,1744377,1744687,1745228,1746940,1749375,1750016,1750976,1751062,1754112,1754144,1754726,1754806,1754878,1754889,1754894,1754900
-/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,656018,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770
 
809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,890139,890265
 
,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907727,907819,907825,907864,908002,908721,908754,908759,909097,909206,909212,909525,909636,909869,909875,909887,910266,910370,910442,910471,910485,910974,915226,915737,915861,916097,916141,916157,916170,917598,917633,918093,918489,918594,918684,918787,918792,918799,918803,918885,919851,919914,920025,920055,920298,920449,920596,920824,920840,921444,922010,926716,927062,927621,928482,928695,928732,928798,931709,932357,932967,935105,935983,939491,939551,940064,941356,941463,943112,944409,944416,945231,945808,945835,945841,946686,94
 
8057,950164,950596,950614,950851,950905,951615,953434,954435,955648,955655,956832,957130,957830,958192,960701,961948,962865,962872,962881,962900,963106,963865,963868,964614,966177-966178,966292,966692,966863,981815,988448,991837,993042,1001955,1002185,1002263,1002274,1002349,1002359,1002362,1002481,1002514,1003461,1003481,1003488,1003556,1003572,1003581,1003861,1004393,1004409,1004415,1004868-1004869,1004912,1005452,1005467,1005647,1005802,1022120,1022134,1022323,1022415,1022606,1022623,1024224,1024251,1026042,1026784,1026912,1026920,1029767,1033415,1033448,1033842,1033897,1037715,1037794,1037887,1037924,1038041,1041892,1042022,1042029,1042447,1042452,1042494,1043983,1044944,1044987,1049264,1050249,1055055,1055236,1055458,1055975,1056264,1056828,1056889,1059881,1060486,1061412,1061442,1061446,1061503,1062398,1064652,1066244,1066772,1067039,1067139,1069824,1070139,1070420,1070609,1072042,1073184,1073393,1075458,1076212,1078409,1078412,1079801,1081118,1081334,1088179,1088460,1090022,1
 
094069,1094089,1095138,1097899,1099575,1099586,1099772,1099789,1100145,1100822,1101094,1101144,1124680,1130774,1133014,1137862,1137996,1138950,1138953,1139280,1140693,1141104,1141441,1142043,1142904,1143134,1143150,1145137,1148216,1148471,1152601,1156171,1156519,1164567,1167394,1172233-1172234,1172236,1173614,1174353,1174882,1174884,1175158,1175190,1176799,1177125,1177245,1177850,1177862,1178228,1178233,1178684,1181028,1181136,1184917,1184919,1185200,1185588,1186011,1186104,1186123,1186137,1186153,1186378,1186712,1186763,1186949,1187381,1189240,1189386,1190388-1190389,1190474,1198622,1201576,1203091,1224801,1233426,1243034,1243038,1244567,1298140,1298628-1298629,1304468,1311997,1331766,1333161,1333173,1342498,1342503,1348425,1348461-1348495,1348989,1350294,1351056,1351636-1351640,1352011,1354685,1354847,1354856,1356125,1359981,1371283,1409007,1413552,1413556,1413562,1417282,1430079,1430481,1430567,1435606,1435636,1435642,1438411,1439054,1441348,1446640,1446650,1447012,1453105,145311
 
2,1456666-1456678,1456713,1456721,1457968,1460342,1460533,1484862,1486875,1492570,1494143,1500062,1503851,1505843,1513148-1513149,1526469,1533312,1536520,1539157,1539173,1540374,1552804,1555163,1558811,1561054-1561065,1561067-1561070,1561072-1561075,1561083,1561190-1561192,1561635,1561640,1561732,1562742,1562746,1564309,1564312,1568921,1574004,1577315,1577324,1577463,1578812-1578813,1586658,1586894,1586959,1588193,1588197,1589737-1589738,1589763,1589837,1589842,1589980,1590018,1590302,1590646,1590648,1590835,1590842,1590911,1593259,1593261,1593335,1593834,1594229,1595171,1595289,1597532,1600955,1600963,1600978,1600984,1601329-1601330,1601332,1601855,1608963,1609061,1609593,1617362,1617365,1617383,1617456,1623392,1624247,1626579,1627033,1628978,1631155,1631520,1632584,1634117,1634130,1637684,1637695,1640655-1640658,1641656,1641660,1641692,1641707-1641718,1641721-1641722,1642564,1642606,1643045,1643054,1643570,1644017,1648815,1656299,1658799,1658802,1659521,1663995,1664174,1665085,166
 
6966,1666985,1668630,1669800,1676552,1681837-1681838,1681854,1685826,1687242,1689918,1693105,1694290,1694872,1696378,1701940,1710346,1712617,1712654,1713871,1713997,1714002,1715188,1715206,1716213-1716214,1716413,1716640,1716856,1716858,1716881-1716882,1716886,1716894,1720234,1720394,1720439,1720462,1721812,1721881,1722532,1722799,1722807,1722824,1722828-1722829,1722831,1722859,1723127,1723707,1723736,1724427,1724433,1724673,1724788,1724863,1725113,1725183,1725199,1725202,1725204,1725207,1725263-1725264,1725266,1725278,1725282,1725405,1725646,1725649-1725652,1725696-1725697,1725914,1725926,1726177,1726202,1726628,1726676,1726926,1727162,1727670,1727899,1728448,1729361,1731008,1731953,1731976,1732359,1733940,1734113,1734128,1734192,1737119,1737715,1737834,1737959,1738039,1738043,1739775,1741173,1741181,1741190,1741208,1741213,1741225,1741232,1742090,1742276,1743115,1743117,1743554,1744058,1744125,1744229,1744323,1744684,1745227,1745337,1746939,1748629,1750015,1750975,1751061,1754111,
 1754140-1754141,1754445,1754494,1754496,1754528,1754532-1754533,1754714,1756013
+/tomcat/tc8.5.x/trunk:1737199,1737966,1738044,1741174,1741182,1741191,1741209,1741226,1741233,1742277,1743118,1743139-1743140,1744059,1744127,1744151,1744232,1744377,1744687,1745228,1746940,1749375,1750016,1750976,1751062,1754112,1754144,1754726,1754806,1754878,1754889,1754894,1754900,1756412
+/tomcat/trunk:601180,606992,612607,630314,640888,652744,653247,656018,666232,673796,673820,677910,683969,683982,684001,684081,684234,684269-684270,685177,687503,687645,689402,690781,691392,691805,692748,693378,694992,695053,695311,696780,696782,698012,698227,698236,698613,699427,699634,701355,709294,709811,709816,710063,710066,710125,710205,711126,711600,712461,712467,713953,714002,718360,719119,719124,719602,719626,719628,720046,720069,721040,721286,721708,721886,723404,723738,726052,727303,728032,728768,728947,729057,729567,729569,729571,729681,729809,729815,729934,730250,730590,731651,732859,732863,734734,740675,740684,742677,742697,742714,744160,744238,746321,746384,746425,747834,747863,748344,750258,750291,750921,751286-751287,751289,751295,752323,753039,757335,757774,758249,758365,758596,758616,758664,759074,761601,762868,762929,762936-762937,763166,763183,763193,763228,763262,763298,763302,763325,763599,763611,763654,763681,763706,764985,764997,765662,768335,769979,770716,770
 
809,770876,772872,776921,776924,776935,776945,777464,777466,777576,777625,778379,778523-778524,781528,781779,782145,782791,783316,783696,783724,783756,783762,783766,783863,783934,784453,784602,784614,785381,785688,785768,785859,786468,786487,786490,786496,786667,787627,787770,787985,789389,790405,791041,791184,791194,791224,791243,791326,791328,791789,792740,793372,793757,793882,793981,794082,794673,794822,795043,795152,795210,795457,795466,797168,797425,797596,797607,802727,802940,804462,804544,804734,805153,809131,809603,810916,810977,812125,812137,812432,813001,813013,813866,814180,814708,814876,815972,816252,817442,817822,819339,819361,820110,820132,820874,820954,821397,828196,828201,828210,828225,828759,830378-830379,830999,831106,831774,831785,831828,831850,831860,832214,832218,833121,833545,834047,835036,835336,836405,881396,881412,883130,883134,883146,883165,883177,883362,883565,884341,885038,885231,885241,885260,885901,885991,886019,888072,889363,889606,889716,890139,890265
 
,890349-890350,890417,891185-891187,891583,892198,892341,892415,892464,892555,892812,892814,892817,892843,892887,893321,893493,894580,894586,894805,894831,895013,895045,895057,895191,895392,895703,896370,896384,897380-897381,897776,898126,898256,898468,898527,898555,898558,898718,898836,898906,899284,899348,899420,899653,899769-899770,899783,899788,899792,899916,899918-899919,899935,899949,903916,905020,905151,905722,905728,905735,907311,907513,907538,907652,907727,907819,907825,907864,908002,908721,908754,908759,909097,909206,909212,909525,909636,909869,909875,909887,910266,910370,910442,910471,910485,910974,915226,915737,915861,916097,916141,916157,916170,917598,917633,918093,918489,918594,918684,918787,918792,918799,918803,918885,919851,919914,920025,920055,920298,920449,920596,920824,920840,921444,922010,926716,927062,927621,928482,928695,928732,928798,931709,932357,932967,935105,935983,939491,939551,940064,941356,941463,943112,944409,944416,945231,945808,945835,945841,946686,94
 
8057,950164,950596,950614,950851,950905,951615,953434,954435,955648,955655,956832,957130,957830,958192,960701,961948,962865,962872,962881,962900,963106,963865,963868,964614,966177-966178,966292,966692,966863,981815,988448,991837,993042,1001955,1002185,1002263,1002274,1002349,1002359,1002362,1002481,1002514,1003461,1003481,1003488,1003556,1003572,1003581,1003861,1004393,1004409,1004415,1004868-1004869,1004912,1005452,1005467,1005647,1005802,1022120,1022134,1022323,1022415,1022606,1022623,1024224,1024251,1026042,1026784,1026912,1026920,1029767,1033415,1033448,1033842,1033897,1037715,1037794,1037887,1037924,1038041,1041892,1042022,1042029,1042447,1042452,1042494,1043983,1044944,1044987,1049264,1050249,1055055,1055236,1055458,1055975,1056264,1056828,1056889,1059881,1060486,1061412,1061442,1061446,1061503,1062398,1064652,1066244,1066772,1067039,1067139,1069824,1070139,1070420,1070609,1072042,1073184,1073393,1075458,1076212,1078409,1078412,1079801,1081118,1081334,1088179,1088460,1090022,1
 
094069,1094089,1095138,1097899,1099575,1099586,1099772,1099789,1100145,1100822,1101094,1101144,1124680,1130774,1133014,1137862,1137996,1138950,1138953,1139280,1140693,1141104,1141441,1142043,1142904,1143134,1143150,1145137,1148216,1148471,1152601,1156171,1156519,1164567,1167394,1172233-1172234,1172236,1173614,1174353,1174882,1174884,1175158,1175190,1176799,1177125,1177245,1177850,1177862,1178228,1178233,1178684,1181028,1181136,1184917,1184919,1185200,1185588,1186011,1186104,1186123,1186137,1186153,1186378,1186712,1186763,1186949,1187381,1189240,1189386,1190388-1190389,1190474,1198622,1201576,1203091,1224801,1233426,1243034,1243038,1244567,1298140,1298628-1298629,1304468,1311997,1331766,1333161,1333173,1342498,1342503,1348425,1348461-1348495,1348989,1350294,1351056,1351636-1351640,1352011,1354685,1354847,1354856,1356125,1359981,1371283,1409007,1413552,1413556,1413562,1417282,1430079,1430481,1430567,1435606,1435636,1435642,1438411,1439054,1441348,1446640,1446650,1447012,1453105,145311
 
2,1456666-1456678,1456713,1456721,1457968,1460342,1460533,1484862,1486875,1492570,1494143,1500062,1503851,1505843,1513148-1513149,1526469,1533312,1536520,1539157,1539173,1540374,1552804,1555163,1558811,1561054-1561065,1561067-1561070,1561072-1561075,1561083,1561190-1561192,1561635,1561640,1561732,1562742,1562746,1564309,1564312,1568921,1574004,1577315,1577324,1577463,1578812-1578813,1586658,1586894,1586959,1588193,1588197,1589737-1589738,1589763,1589837,1589842,1589980,1590018,1590302,1590646,1590648,1590835,1590842,1590911,1593259,1593261,1593335,1593834,1594229,1595171,1595289,1597532,1600955,1600963,1600978,1600984,1601329-1601330,1601332,1601855,1608963,1609061,1609593,1617362,1617365,1617383,1617456,1623392,1624247,1626579,1627033,1628978,1631155,1631520,1632584,1634117,1634130,1637684,1637695,1640655-1640658,1641656,1641660,1641692,1641707-1641718,1641721-1641722,1642564,1642606,1643045,1643054,1643570,1644017,1648815,1656299,1658799,1658802,1659521,1663995,1664174,1665085,166
 
6966,1666985,1668630,1669800,1676552,1681837-1681838,1681854,1685826,1687242,1689918,1693105,1694290,1694872,1696378,1701940,1710346,1712617,1712654,1713871,1713997,1714002,1715188,1715206,1716213-1716214,1716413,1716640,1716856,1716858,1716881-1716882,1716886,1716894,1720234,1720394,1720439,1720462,1721812,1721881,1722532,1722799,1722807,1722824,1722828-1722829,1722831,1722859,1723127,1723707,1723736,1724427,1724433,1724673,1724788,1724863,1725113,1725183,1725199,1725202,1725204,1725207,1725263-1725264,1725266,1725278,1725282,1725405,1725646,1725649-1725652,1725696-1725697,1725914,1725926,1726177,1726202,1726628,1726676,1726926,1727162,1727670,1727899,1728448,1729361,1731008,1731953,1731976,1732359,1733940,1734113,1734128,1734192,1737119,1737715,1737834,1737959,1738039,1738043,1739775,1741173,1741181,1741190,1741208,1741213,1741225,1741232,1742090,1742276,1743115,1743117,1743554,1744058,1744125,1744229,1744323,1744684,1745227,1745337,1746939,1748629,1750015,1750975,1751061,1754111,
 
1754140-1754141,1754445,1754494,1754496,1754528,1754532-1754533,1754714,1756013,1756408,1756410

Modified: tomcat/tc6.0.x/trunk/conf/web.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/conf/web.xml?rev=1756430&r1=1756429&r2=1756430&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/conf/web.xml (original)
+++ tomcat/tc6.0.x/trunk/conf/web.xml Mon Aug 15 20:42:09 2016
@@ -339,23 +339,6 @@
   <!--                        If not set, then webAppRootDir is used.       -->
   <!--                        Recommended value: WEB-INF/cgi                -->
   <!--                                                                      -->
-  <!--   debug                Debugging detail level for messages logged    -->
-  <!--                        by this servlet. Useful values range from 0   -->
-  <!--                        to 5 where 0 means no logging and 5 means     -->
-  <!--                        maximum logging. Values of 10 or more mean    -->
-  <!--                        maximum logging plus debug info added to the  -->
-  <!--                        HTTP response. If an error occurs and debug   -->
-  <!--                        is 10 or more the standard error page         -->
-  <!--                        mechanism will be disabled and a response     -->
-  <!--                        body with debug information will be produced. -->
-  <!--                        Note that any value of 10 or more has the     -->
-  <!--                        same effect as a value of 10. If set to 10 or -->
-  <!--                        more the standard error page mechanism will   -->
-  <!--                        be disabled and a debug page shown instead.   -->
-  <!--                        The debug page is not considered secure and   -->
-  <!--                        should not be enabled for production systems. -->
-  <!--                        [0]                                           -->
-  <!--                                                                      -->
   <!--   executable           Name of the executable used to run the        -->
   <!--                        script. [perl]                                -->
   <!--                                                                      -->
@@ -375,10 +358,6 @@
         <servlet-name>cgi</servlet-name>
         <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
         <init-param>
-          <param-name>debug</param-name>
-          <param-value>0</param-value>
-        </init-param>
-        <init-param>
           <param-name>cgiPathPrefix</param-name>
           <param-value>WEB-INF/cgi</param-value>
         </init-param>

Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/CGIServlet.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/CGIServlet.java?rev=1756430&r1=1756429&r2=1756430&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/CGIServlet.java 
(original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/servlets/CGIServlet.java Mon 
Aug 15 20:42:09 2016
@@ -14,8 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-
 package org.apache.catalina.servlets;
 
 import java.io.BufferedOutputStream;
@@ -34,9 +32,11 @@ import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map.Entry;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
+import javax.servlet.RequestDispatcher;
 import javax.servlet.ServletConfig;
 import javax.servlet.ServletContext;
 import javax.servlet.ServletException;
@@ -50,6 +50,9 @@ import javax.servlet.http.HttpSession;
 
 import org.apache.catalina.Globals;
 import org.apache.catalina.util.IOTools;
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+import org.apache.tomcat.util.res.StringManager;
 
 
 /**
@@ -118,7 +121,7 @@ import org.apache.catalina.util.IOTools;
  *
  * <B>CGI Specification</B>:<br> derived from
  * <a href="http://cgi-spec.golux.com";>http://cgi-spec.golux.com</a>.
- * A work-in-progress & expired Internet Draft.  Note no actual RFC describing
+ * A work-in-progress &amp; expired Internet Draft.  Note no actual RFC 
describing
  * the CGI specification exists.  Where the behavior of this servlet differs
  * from the specification cited above, it is either documented here, a bug,
  * or an instance where the specification cited differs from Best
@@ -161,7 +164,6 @@ import org.apache.catalina.util.IOTools;
  * </p>
  * [end excerpt]
  *
- * </p>
  * <h2> Implementation notes</h2>
  * <p>
  *
@@ -175,12 +177,12 @@ import org.apache.catalina.util.IOTools;
  * and stderr (which should not be too hard).
  * <br>
  * If you find your cgi scripts are timing out receiving input, you can set
- * the init parameter <code></code> of your webapps' cgi-handling servlet
- * to be
+ * the init parameter <code>stderrTimeout</code> of your webapps' cgi-handling
+ * servlet.
  * </p>
  * <p>
  *
- * <b>Metavariable Values</b>: According to the CGI specificion,
+ * <b>Metavariable Values</b>: According to the CGI specification,
  * implementations may choose to represent both null or missing values in an
  * implementation-specific manner, but must define that manner.  This
  * implementation chooses to always define all required metavariables, but
@@ -193,7 +195,7 @@ import org.apache.catalina.util.IOTools;
  *
  * <b>NPH --  Non-parsed-header implementation</b>:  This implementation does
  * not support the CGI NPH concept, whereby server ensures that the data
- * supplied to the script are preceisely as supplied by the client and
+ * supplied to the script are precisely as supplied by the client and
  * unaltered by the server.
  * </p>
  * <p>
@@ -213,7 +215,6 @@ import org.apache.catalina.util.IOTools;
  * <a href="http://cgi-spec.golux.com";>http://cgi-spec.golux.com</a>.
  *
  * </p>
- * <p>
  * <h3>TODO:</h3>
  * <ul>
  * <li> Support for setting headers (for example, Location headers don't work)
@@ -228,34 +229,22 @@ import org.apache.catalina.util.IOTools;
  * <li> Better documentation
  * <li> Confirm use of ServletInputStream.available() in CGIRunner.run() is
  *      not needed
- * <li> Make checking for "." and ".." in servlet & cgi PATH_INFO less
- *      draconian
  * <li> [add more to this TODO list]
  * </ul>
- * </p>
  *
  * @author Martin T Dengler [r...@martindengler.com]
  * @author Amy Roh
- *
- * @since Tomcat 4.0
- *
  */
-
-
 public final class CGIServlet extends HttpServlet {
 
+    private static final Log log = LogFactory.getLog(CGIServlet.class);
+    private static final StringManager sm = 
StringManager.getManager(Constants.Package);
+
+    private static final String LINE_SEP = 
System.getProperty("line.separator");
+    
     /* some vars below copied from Craig R. McClanahan's InvokerServlet */
 
-    /**
-     * The debugging detail level for this servlet. Useful values range from 0
-     * to 5 where 0 means no logging and 5 means maximum logging. Values of 10
-     * or more mean maximum logging and debug info added to the HTTP response.
-     * If an error occurs and debug is 10 or more the standard error page
-     * mechanism will be disabled and a response body with debug information
-     * will be produced. Note that any value of 10 or more has the same effect
-     * as a value of 10.
-     */
-    private int debug = 0;
+    private static final long serialVersionUID = 1L;
 
     /**
      *  The CGI search path will start at
@@ -282,10 +271,10 @@ public final class CGIServlet extends Ht
     private long stderrTimeout = 2000;
 
     /** object used to ensure multiple threads don't try to expand same file */
-    static Object expandFileLock = new Object();
+    private static final Object expandFileLock = new Object();
 
     /** the shell environment variables to be passed to the CGI script */
-    Hashtable<String,String> shellEnv = new Hashtable<String,String>();
+    private final Hashtable<String,String> shellEnv = new 
Hashtable<String,String>();
 
     /**
      * Sets instance variables.
@@ -302,6 +291,7 @@ public final class CGIServlet extends Ht
      *                                  interferes with the servlet's normal
      *                                  operation
      */
+    @Override
     public void init(ServletConfig config) throws ServletException {
 
         super.init(config);
@@ -315,11 +305,9 @@ public final class CGIServlet extends Ht
                 ("Cannot invoke CGIServlet through the invoker");
 
         // Set our properties from the initialization parameters
-        if (getServletConfig().getInitParameter("debug") != null)
-            debug = 
Integer.parseInt(getServletConfig().getInitParameter("debug"));
         cgiPathPrefix = getServletConfig().getInitParameter("cgiPathPrefix");
         boolean passShellEnvironment =
-            
Boolean.valueOf(getServletConfig().getInitParameter("passShellEnvironment")).booleanValue();
+            
Boolean.parseBoolean(getServletConfig().getInitParameter("passShellEnvironment"));
 
         if (passShellEnvironment) {
             shellEnv.putAll(System.getenv());
@@ -354,245 +342,189 @@ public final class CGIServlet extends Ht
     }
 
 
-
     /**
-     * Prints out important Servlet API and container information
+     * Logs important Servlet API and container information.
      *
      * <p>
      * Copied from SnoopAllServlet by Craig R. McClanahan
      * </p>
      *
-     * @param  out    ServletOutputStream as target of the information
+     * @param  out    Unused
      * @param  req    HttpServletRequest object used as source of information
-     * @param  res    HttpServletResponse object currently not used but could
-     *                provide future information
+     * @param  res    Unused
      *
      * @exception  IOException  if a write operation exception occurs
      *
+     * @deprecated Use {@link #printServletEnvironment(HttpServletRequest).
+     *             This will be removed in Tomcat 8.5.X onwards
      */
+    @Deprecated
     protected void printServletEnvironment(ServletOutputStream out,
-        HttpServletRequest req, HttpServletResponse res) throws IOException {
+            HttpServletRequest req, HttpServletResponse res) throws 
IOException {
+        printServletEnvironment(req);
+    }
+
+    /**
+     * Logs important Servlet API and container information.
+     *
+     * <p>
+     * Based on SnoopAllServlet by Craig R. McClanahan
+     * </p>
+     *
+     * @param  req    HttpServletRequest object used as source of information
+     *
+     * @exception  IOException  if a write operation exception occurs
+     */
+    private void printServletEnvironment(HttpServletRequest req) throws 
IOException {
 
         // Document the properties from ServletRequest
-        out.println("<h1>ServletRequest Properties</h1>");
-        out.println("<ul>");
-        Enumeration attrs = req.getAttributeNames();
+        log.trace("ServletRequest Properties");
+        @SuppressWarnings("unchecked")
+        Enumeration<String> attrs = req.getAttributeNames();
         while (attrs.hasMoreElements()) {
-            String attr = (String) attrs.nextElement();
-            out.println("<li><b>attribute</b> " + attr + " = " +
-                           req.getAttribute(attr));
-        }
-        out.println("<li><b>characterEncoding</b> = " +
-                       req.getCharacterEncoding());
-        out.println("<li><b>contentLength</b> = " +
-                       req.getContentLength());
-        out.println("<li><b>contentType</b> = " +
-                       req.getContentType());
-        Enumeration locales = req.getLocales();
+            String attr = attrs.nextElement();
+            log.trace("Request Attribute: " + attr + ": [ " + 
req.getAttribute(attr) +"]");
+        }
+        log.trace("Character Encoding: [" + req.getCharacterEncoding() + "]");
+        log.trace("Content Length: [" + req.getContentLength() + "]");
+        log.trace("Content Type: [" + req.getContentType() + "]");
+        @SuppressWarnings("unchecked")
+        Enumeration<Locale> locales = req.getLocales();
         while (locales.hasMoreElements()) {
-            Locale locale = (Locale) locales.nextElement();
-            out.println("<li><b>locale</b> = " + locale);
+            Locale locale = locales.nextElement();
+            log.trace("Locale: [" +locale + "]");
         }
-        Enumeration params = req.getParameterNames();
+        @SuppressWarnings("unchecked")
+        Enumeration<String> params = req.getParameterNames();
         while (params.hasMoreElements()) {
-            String param = (String) params.nextElement();
-            String values[] = req.getParameterValues(param);
-            for (int i = 0; i < values.length; i++)
-                out.println("<li><b>parameter</b> " + param + " = " +
-                               values[i]);
-        }
-        out.println("<li><b>protocol</b> = " + req.getProtocol());
-        out.println("<li><b>remoteAddr</b> = " + req.getRemoteAddr());
-        out.println("<li><b>remoteHost</b> = " + req.getRemoteHost());
-        out.println("<li><b>scheme</b> = " + req.getScheme());
-        out.println("<li><b>secure</b> = " + req.isSecure());
-        out.println("<li><b>serverName</b> = " + req.getServerName());
-        out.println("<li><b>serverPort</b> = " + req.getServerPort());
-        out.println("</ul>");
-        out.println("<hr>");
+            String param = params.nextElement();
+            for (String value : req.getParameterValues(param)) {
+                log.trace("Request Parameter: " + param + ":  [" + value + 
"]");
+            }
+        }
+        log.trace("Protocol: [" + req.getProtocol() + "]");
+        log.trace("Remote Address: [" + req.getRemoteAddr() + "]");
+        log.trace("Remote Host: [" + req.getRemoteHost() + "]");
+        log.trace("Scheme: [" + req.getScheme() + "]");
+        log.trace("Secure: [" + req.isSecure() + "]");
+        log.trace("Server Name: [" + req.getServerName() + "]");
+        log.trace("Server Port: [" + req.getServerPort() + "]");
 
         // Document the properties from HttpServletRequest
-        out.println("<h1>HttpServletRequest Properties</h1>");
-        out.println("<ul>");
-        out.println("<li><b>authType</b> = " + req.getAuthType());
-        out.println("<li><b>contextPath</b> = " +
-                       req.getContextPath());
+        log.trace("HttpServletRequest Properties");
+        log.trace("Auth Type: [" + req.getAuthType() + "]");
+        log.trace("Context Path: [" + req.getContextPath() + "]");
         Cookie cookies[] = req.getCookies();
-        if (cookies!=null) {
-            for (int i = 0; i < cookies.length; i++)
-                out.println("<li><b>cookie</b> " + cookies[i].getName() +" = " 
+cookies[i].getValue());
+        if (cookies != null) {
+            for (Cookie cookie : cookies) {
+                log.trace("Cookie: " + cookie.getName() + ": [" + 
cookie.getValue() + "]");
+            }
         }
-        Enumeration headers = req.getHeaderNames();
+        @SuppressWarnings("unchecked")
+        Enumeration<String> headers = req.getHeaderNames();
         while (headers.hasMoreElements()) {
-            String header = (String) headers.nextElement();
-            out.println("<li><b>header</b> " + header + " = " +
-                           req.getHeader(header));
-        }
-        out.println("<li><b>method</b> = " + req.getMethod());
-        out.println("<li><a name=\"pathInfo\"><b>pathInfo</b></a> = "
-                    + req.getPathInfo());
-        out.println("<li><b>pathTranslated</b> = " +
-                       req.getPathTranslated());
-        out.println("<li><b>queryString</b> = " +
-                       req.getQueryString());
-        out.println("<li><b>remoteUser</b> = " +
-                       req.getRemoteUser());
-        out.println("<li><b>requestedSessionId</b> = " +
-                       req.getRequestedSessionId());
-        out.println("<li><b>requestedSessionIdFromCookie</b> = " +
-                       req.isRequestedSessionIdFromCookie());
-        out.println("<li><b>requestedSessionIdFromURL</b> = " +
-                       req.isRequestedSessionIdFromURL());
-        out.println("<li><b>requestedSessionIdValid</b> = " +
-                       req.isRequestedSessionIdValid());
-        out.println("<li><b>requestURI</b> = " +
-                       req.getRequestURI());
-        out.println("<li><b>servletPath</b> = " +
-                       req.getServletPath());
-        out.println("<li><b>userPrincipal</b> = " +
-                       req.getUserPrincipal());
-        out.println("</ul>");
-        out.println("<hr>");
-
-        // Document the servlet request attributes
-        out.println("<h1>ServletRequest Attributes</h1>");
-        out.println("<ul>");
-        attrs = req.getAttributeNames();
-        while (attrs.hasMoreElements()) {
-            String attr = (String) attrs.nextElement();
-            out.println("<li><b>" + attr + "</b> = " +
-                           req.getAttribute(attr));
+            String header = headers.nextElement();
+            log.trace("HTTP Header: " + header + ": [" + req.getHeader(header) 
+ "]");
         }
-        out.println("</ul>");
-        out.println("<hr>");
+        log.trace("Method: [" + req.getMethod() + "]");
+        log.trace("Path Info: [" + req.getPathInfo() + "]");
+        log.trace("Path Translated: [" + req.getPathTranslated() + "]");
+        log.trace("Query String: [" + req.getQueryString() + "]");
+        log.trace("Remote User: [" + req.getRemoteUser() + "]");
+        log.trace("Requested Session ID: [" + req.getRequestedSessionId() + 
"]");
+        log.trace("Requested Session ID From Cookie: [" +
+                req.isRequestedSessionIdFromCookie() + "]");
+        log.trace("Requested Session ID From URL: [" + 
req.isRequestedSessionIdFromURL() + "]");
+        log.trace("Requested Session ID Valid: [" + 
req.isRequestedSessionIdValid() + "]");
+        log.trace("Request URI: [" + req.getRequestURI() + "]");
+        log.trace("Servlet Path: [" + req.getServletPath() + "]");
+        log.trace("User Principal: [" + req.getUserPrincipal() + "]");
 
         // Process the current session (if there is one)
         HttpSession session = req.getSession(false);
         if (session != null) {
 
             // Document the session properties
-            out.println("<h1>HttpSession Properties</h1>");
-            out.println("<ul>");
-            out.println("<li><b>id</b> = " +
-                           session.getId());
-            out.println("<li><b>creationTime</b> = " +
-                           new Date(session.getCreationTime()));
-            out.println("<li><b>lastAccessedTime</b> = " +
-                           new Date(session.getLastAccessedTime()));
-            out.println("<li><b>maxInactiveInterval</b> = " +
-                           session.getMaxInactiveInterval());
-            out.println("</ul>");
-            out.println("<hr>");
+            log.trace("HttpSession Properties");
+            log.trace("ID: [" + session.getId() + "]");
+            log.trace("Creation Time: [" + new Date(session.getCreationTime()) 
+ "]");
+            log.trace("Last Accessed Time: [" + new 
Date(session.getLastAccessedTime()) + "]");
+            log.trace("Max Inactive Interval: [" + 
session.getMaxInactiveInterval() + "]");
 
             // Document the session attributes
-            out.println("<h1>HttpSession Attributes</h1>");
-            out.println("<ul>");
             attrs = session.getAttributeNames();
             while (attrs.hasMoreElements()) {
-                String attr = (String) attrs.nextElement();
-                out.println("<li><b>" + attr + "</b> = " +
-                               session.getAttribute(attr));
+                String attr = attrs.nextElement();
+                log.trace("Session Attribute: " + attr + ": [" + 
session.getAttribute(attr) + "]");
             }
-            out.println("</ul>");
-            out.println("<hr>");
-
         }
 
         // Document the servlet configuration properties
-        out.println("<h1>ServletConfig Properties</h1>");
-        out.println("<ul>");
-        out.println("<li><b>servletName</b> = " +
-                       getServletConfig().getServletName());
-        out.println("</ul>");
-        out.println("<hr>");
+        log.trace("ServletConfig Properties");
+        log.trace("Servlet Name: [" + getServletConfig().getServletName() + 
"]");
 
         // Document the servlet configuration initialization parameters
-        out.println("<h1>ServletConfig Initialization Parameters</h1>");
-        out.println("<ul>");
         params = getServletConfig().getInitParameterNames();
         while (params.hasMoreElements()) {
-            String param = (String) params.nextElement();
+            String param = params.nextElement();
             String value = getServletConfig().getInitParameter(param);
-            out.println("<li><b>" + param + "</b> = " + value);
+            log.trace("Servlet Init Param: " + param + ": [" + value + "]");
         }
-        out.println("</ul>");
-        out.println("<hr>");
 
         // Document the servlet context properties
-        out.println("<h1>ServletContext Properties</h1>");
-        out.println("<ul>");
-        out.println("<li><b>majorVersion</b> = " +
-                       getServletContext().getMajorVersion());
-        out.println("<li><b>minorVersion</b> = " +
-                       getServletContext().getMinorVersion());
-        out.println("<li><b>realPath('/')</b> = " +
-                       getServletContext().getRealPath("/"));
-        out.println("<li><b>serverInfo</b> = " +
-                       getServletContext().getServerInfo());
-        out.println("</ul>");
-        out.println("<hr>");
+        log.trace("ServletContext Properties");
+        log.trace("Major Version: [" + getServletContext().getMajorVersion() + 
"]");
+        log.trace("Minor Version: [" + getServletContext().getMinorVersion() + 
"]");
+        log.trace("Real Path for '/': [" + 
getServletContext().getRealPath("/") + "]");
+        log.trace("Server Info: [" + getServletContext().getServerInfo() + 
"]");
 
         // Document the servlet context initialization parameters
-        out.println("<h1>ServletContext Initialization Parameters</h1>");
-        out.println("<ul>");
+        log.trace("ServletContext Initialization Parameters");
         params = getServletContext().getInitParameterNames();
         while (params.hasMoreElements()) {
-            String param = (String) params.nextElement();
+            String param = params.nextElement();
             String value = getServletContext().getInitParameter(param);
-            out.println("<li><b>" + param + "</b> = " + value);
+            log.trace("Servlet Context Init Param: " + param + ": [" + value + 
"]");
         }
-        out.println("</ul>");
-        out.println("<hr>");
 
         // Document the servlet context attributes
-        out.println("<h1>ServletContext Attributes</h1>");
-        out.println("<ul>");
+        log.trace("ServletContext Attributes");
         attrs = getServletContext().getAttributeNames();
         while (attrs.hasMoreElements()) {
-            String attr = (String) attrs.nextElement();
-            out.println("<li><b>" + attr + "</b> = " +
-                           getServletContext().getAttribute(attr));
+            String attr = attrs.nextElement();
+            log.trace("Servlet Context Attribute: " + attr +
+                    ": [" + getServletContext().getAttribute(attr) + "]");
         }
-        out.println("</ul>");
-        out.println("<hr>");
-
-
-
     }
 
 
-
     /**
-     * Provides CGI Gateway service -- delegates to <code>doGet</code>
+     * Provides CGI Gateway service -- delegates to
+     * {@link #doGet(HttpServletRequest, HttpServletResponse)}.
      *
      * @param  req   HttpServletRequest passed in by servlet container
      * @param  res   HttpServletResponse passed in by servlet container
      *
      * @exception  ServletException  if a servlet-specific exception occurs
      * @exception  IOException  if a read/write exception occurs
-     *
-     * @see javax.servlet.http.HttpServlet
-     *
      */
+    @Override
     protected void doPost(HttpServletRequest req, HttpServletResponse res)
         throws IOException, ServletException {
         doGet(req, res);
     }
 
 
-
     /**
-     * Provides CGI Gateway service
+     * Provides CGI Gateway service.
      *
      * @param  req   HttpServletRequest passed in by servlet container
      * @param  res   HttpServletResponse passed in by servlet container
      *
      * @exception  ServletException  if a servlet-specific exception occurs
      * @exception  IOException  if a read/write exception occurs
-     *
-     * @see javax.servlet.http.HttpServlet
-     *
      */
+    @Override
     protected void doGet(HttpServletRequest req, HttpServletResponse res)
         throws ServletException, IOException {
 
@@ -608,75 +540,37 @@ public final class CGIServlet extends Ht
                                           cgiEnv.getEnvironment(),
                                           cgiEnv.getWorkingDirectory(),
                                           cgiEnv.getParameters());
-            //if POST, we need to cgi.setInput
-            //REMIND: how does this interact with Servlet API 2.3's Filters?!
+
             if ("POST".equals(req.getMethod())) {
                 cgi.setInput(req.getInputStream());
             }
             cgi.setResponse(res);
             cgi.run();
+        } else {
+            res.sendError(404);
         }
 
-        if (!cgiEnv.isValid()) {
-            if (setStatus(res, 404)) {
-                return;
-            }
-        }
-
-        if (debug >= 10) {
-
-            ServletOutputStream out = res.getOutputStream();
-            out.println("<HTML><HEAD><TITLE>$Name$</TITLE></HEAD>");
-            out.println("<BODY>$Header$<p>");
-
-            if (cgiEnv.isValid()) {
-                out.println(cgiEnv.toString());
-            } else {
-                out.println("<H3>");
-                out.println("CGI script not found or not specified.");
-                out.println("</H3>");
-                out.println("<H4>");
-                out.println("Check the <b>HttpServletRequest ");
-                out.println("<a href=\"#pathInfo\">pathInfo</a></b> ");
-                out.println("property to see if it is what you meant ");
-                out.println("it to be.  You must specify an existant ");
-                out.println("and executable file as part of the ");
-                out.println("path-info.");
-                out.println("</H4>");
-                out.println("<H4>");
-                out.println("For a good discussion of how CGI scripts ");
-                out.println("work and what their environment variables ");
-                out.println("mean, please visit the <a ");
-                out.println("href=\"http://cgi-spec.golux.com\";>CGI ");
-                out.println("Specification page</a>.");
-                out.println("</H4>");
-
+        if (log.isTraceEnabled()) {
+            String[] cgiEnvLines = cgiEnv.toString().split(LINE_SEP);
+            for (String cgiEnvLine : cgiEnvLines) {
+                log.trace(cgiEnvLine);
             }
 
-            printServletEnvironment(out, req, res);
-
-            out.println("</BODY></HTML>");
-
+            printServletEnvironment(req);
         }
+    }
 
 
-    } //doGet
-
-
-    /*
-     * Behaviour depends on the status code and the value of debug.
+    /**
+     * Behaviour depends on the status code.
      *
-     * Status < 400  - Always calls setStatus. Returns false. CGI servlet will
-     *                 provide the response body.
-     * Status >= 400 - Depends on debug
-     *   debug < 10    - Calls sendError(status), returns true. Standard error
-     *                   page mechanism will provide the response body.
-     *   debug >= 10   - Calls setStatus(status), return false. CGI servlet 
will
-     *                   provide the response body.
+     * Status < 400  - Calls setStatus. Returns false. CGI servlet will provide
+     *                 the response body.
+     * Status >= 400 - Calls sendError(status), returns true. Standard error
+     *                 page mechanism will provide the response body.
      */
     private boolean setStatus(HttpServletResponse response, int status) throws 
IOException {
-
-        if (status >= HttpServletResponse.SC_BAD_REQUEST && debug < 10) {
+        if (status >= HttpServletResponse.SC_BAD_REQUEST) {
             response.sendError(status);
             return true;
         } else {
@@ -689,13 +583,6 @@ public final class CGIServlet extends Ht
     /**
      * Encapsulates the CGI environment and rules to derive
      * that environment from the servlet container and request information.
-     *
-     * <p>
-     * </p>
-     *
-     *
-     * @since    Tomcat 4.0
-     *
      */
     protected class CGIEnvironment {
 
@@ -719,19 +606,19 @@ public final class CGIServlet extends Ht
         private File tmpDir = null;
 
         /** derived cgi environment */
-        private Hashtable env = null;
+        private Hashtable<String, String> env = null;
 
         /** cgi command to be invoked */
         private String command = null;
 
         /** cgi command's desired working directory */
-        private File workingDirectory = null;
+        private final File workingDirectory;
 
         /** cgi command's command line parameters */
-        private ArrayList<String> cmdLineParameters = new ArrayList<String>();
+        private final ArrayList<String> cmdLineParameters = new 
ArrayList<String>();
 
         /** whether or not this object is valid or not */
-        private boolean valid = false;
+        private final boolean valid;
 
 
         /**
@@ -742,7 +629,7 @@ public final class CGIServlet extends Ht
          *                   the Servlet API
          * @param  context   ServletContext for information provided by the
          *                   Servlet API
-         *
+         * @throws IOException an IO error occurred
          */
         protected CGIEnvironment(HttpServletRequest req,
                                  ServletContext context) throws IOException {
@@ -754,12 +641,13 @@ public final class CGIServlet extends Ht
             if (this.valid) {
                 workingDirectory = new File(command.substring(0,
                       command.lastIndexOf(File.separator)));
+            } else {
+                workingDirectory = null;
             }
 
         }
 
 
-
         /**
          * Uses the ServletContext to set some CGI variables
          *
@@ -773,13 +661,12 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Uses the HttpServletRequest to set most CGI variables
          *
          * @param  req   HttpServletRequest for information provided by
          *               the Servlet API
-         * @throws UnsupportedEncodingException
+         * @throws UnsupportedEncodingException Unknown encoding
          */
         protected void setupFromRequest(HttpServletRequest req)
                 throws UnsupportedEncodingException {
@@ -822,7 +709,7 @@ public final class CGIServlet extends Ht
                 } else {
                     qs = req.getQueryString();
                 }
-                if (qs != null && qs.indexOf("=") == -1) {
+                if (qs != null && qs.indexOf('=') == -1) {
                     StringTokenizer qsTokens = new StringTokenizer(qs, "+");
                     while ( qsTokens.hasMoreTokens() ) {
                         
cmdLineParameters.add(URLDecoder.decode(qsTokens.nextToken(),
@@ -838,6 +725,7 @@ public final class CGIServlet extends Ht
          *
          * <p>
          * Example URI:
+         * </p>
          * <PRE> /servlet/cgigateway/dir1/realCGIscript/pathinfo1 </PRE>
          * <ul>
          * <LI><b>path</b> = $CATALINA_HOME/mywebapp/dir1/realCGIscript
@@ -845,7 +733,6 @@ public final class CGIServlet extends Ht
          * <LI><b>cgiName</b> = /dir1/realCGIscript
          * <LI><b>name</b> = realCGIscript
          * </ul>
-         * </p>
          * <p>
          * CGI search algorithm: search the real path below
          *    &lt;my-webapp-root&gt; and find the first non-directory in
@@ -895,8 +782,6 @@ public final class CGIServlet extends Ht
          * <code>name</code> -    simple name (no directories) of the
          *                        cgi script, or null if no cgi was found
          * </ul>
-         *
-         * @since Tomcat 4.0
          */
         protected String[] findCGI(String pathInfo, String webAppRootDir,
                                    String contextPath, String servletPath,
@@ -904,45 +789,42 @@ public final class CGIServlet extends Ht
             String path = null;
             String name = null;
             String scriptname = null;
-            String cginame = "";
 
-            if ((webAppRootDir != null)
-                && (webAppRootDir.lastIndexOf(File.separator) ==
-                    (webAppRootDir.length() - 1))) {
-                    //strip the trailing "/" from the webAppRootDir
-                    webAppRootDir =
-                    webAppRootDir.substring(0, (webAppRootDir.length() - 1));
+            if (webAppRootDir != null &&
+                    webAppRootDir.lastIndexOf(File.separator) == 
(webAppRootDir.length() - 1)) {
+                //strip the trailing "/" from the webAppRootDir
+                webAppRootDir = webAppRootDir.substring(0, 
(webAppRootDir.length() - 1));
             }
 
             if (cgiPathPrefix != null) {
-                webAppRootDir = webAppRootDir + File.separator
-                    + cgiPathPrefix;
+                webAppRootDir = webAppRootDir + File.separator + cgiPathPrefix;
             }
 
-            if (debug >= 2) {
-                log("findCGI: path=" + pathInfo + ", " + webAppRootDir);
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("cgiServlet.find.path", pathInfo, 
webAppRootDir));
             }
 
             File currentLocation = new File(webAppRootDir);
-            StringTokenizer dirWalker =
-            new StringTokenizer(pathInfo, "/");
-            if (debug >= 3) {
-                log("findCGI: currentLoc=" + currentLocation);
+            StringTokenizer dirWalker = new StringTokenizer(pathInfo, "/");
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("cgiServlet.find.location",
+                        currentLocation.getAbsolutePath()));
             }
+            StringBuilder cginameBuilder = new StringBuilder();
             while (!currentLocation.isFile() && dirWalker.hasMoreElements()) {
-                if (debug >= 3) {
-                    log("findCGI: currentLoc=" + currentLocation);
-                }
                 String nextElement = (String) dirWalker.nextElement();
                 currentLocation = new File(currentLocation, nextElement);
-                cginame = cginame + "/" + nextElement;
+                cginameBuilder.append('/').append(nextElement);
+                if (log.isDebugEnabled()) {
+                    log.debug(sm.getString("cgiServlet.find.location",
+                            currentLocation.getAbsolutePath()));
+                }
             }
+            String cginame = cginameBuilder.toString();
             if (!currentLocation.isFile()) {
                 return new String[] { null, null, null, null };
-            } else {
-                if (debug >= 2) {
-                    log("findCGI: FOUND cgi at " + currentLocation);
                 }
+
                 path = currentLocation.getAbsolutePath();
                 name = currentLocation.getName();
 
@@ -954,24 +836,23 @@ public final class CGIServlet extends Ht
                 if (!servletPath.equals(cginame)) {
                     scriptname = scriptname + cginame;
                 }
-            }
 
-            if (debug >= 1) {
-                log("findCGI calc: name=" + name + ", path=" + path
-                    + ", scriptname=" + scriptname + ", cginame=" + cginame);
+            if (log.isDebugEnabled()) {
+                log.debug(sm.getString("cgiServlet.find.found", name, path, 
scriptname, cginame));
             }
             return new String[] { path, scriptname, cginame, name };
         }
 
         /**
          * Constructs the CGI environment to be supplied to the invoked CGI
-         * script; relies heavliy on Servlet API methods and findCGI
+         * script; relies heavily on Servlet API methods and findCGI
          *
          * @param    req request associated with the CGI
-         *           invokation
+         *           Invocation
          *
          * @return   true if environment was set OK, false if there
          *           was a problem and no environment was set
+         * @throws IOException an IO error occurred
          */
         protected boolean setCGIEnvironment(HttpServletRequest req) throws 
IOException {
 
@@ -988,7 +869,6 @@ public final class CGIServlet extends Ht
 
             // Add the CGI environment variables
             String sPathInfoOrig = null;
-            String sPathTranslatedOrig = null;
             String sPathInfoCGI = null;
             String sPathTranslatedCGI = null;
             String sCGIFullPath = null;
@@ -1001,10 +881,6 @@ public final class CGIServlet extends Ht
             sPathInfoOrig = this.pathInfo;
             sPathInfoOrig = sPathInfoOrig == null ? "" : sPathInfoOrig;
 
-            sPathTranslatedOrig = req.getPathTranslated();
-            sPathTranslatedOrig =
-                sPathTranslatedOrig == null ? "" : sPathTranslatedOrig;
-
             if (webAppRootDir == null ) {
                 // The app has not been deployed in exploded form
                 webAppRootDir = tmpDir.toString();
@@ -1038,7 +914,8 @@ public final class CGIServlet extends Ht
             envp.put("SERVER_PROTOCOL", nullsToBlanks(req.getProtocol()));
 
             int port = req.getServerPort();
-            Integer iPort = (port == 0 ? new Integer(-1) : new Integer(port));
+            Integer iPort =
+                (port == 0 ? Integer.valueOf(-1) : Integer.valueOf(port));
             envp.put("SERVER_PORT", iPort.toString());
 
             envp.put("REQUEST_METHOD", nullsToBlanks(req.getMethod()));
@@ -1085,10 +962,8 @@ public final class CGIServlet extends Ht
              * SHOULD NOT be defined.
              *
              */
-            if (sPathInfoCGI != null && !("".equals(sPathInfoCGI))) {
+            if (!("".equals(sPathInfoCGI))) {
                 sPathTranslatedCGI = context.getRealPath(sPathInfoCGI);
-            } else {
-                sPathTranslatedCGI = null;
             }
             if (sPathTranslatedCGI == null || "".equals(sPathTranslatedCGI)) {
                 //NOOP
@@ -1120,15 +995,16 @@ public final class CGIServlet extends Ht
              */
             int contentLength = req.getContentLength();
             String sContentLength = (contentLength <= 0 ? "" :
-                                     (new Integer(contentLength)).toString());
+                Integer.toString(contentLength));
             envp.put("CONTENT_LENGTH", sContentLength);
 
 
-            Enumeration headers = req.getHeaderNames();
+            @SuppressWarnings("unchecked")
+            Enumeration<String> headers = req.getHeaderNames();
             String header = null;
             while (headers.hasMoreElements()) {
                 header = null;
-                header = ((String) headers.nextElement()).toUpperCase();
+                header = headers.nextElement().toUpperCase(Locale.ENGLISH);
                 //REMIND: rewrite multiple headers as if received as single
                 //REMIND: change character set
                 //REMIND: I forgot what the previous REMIND means
@@ -1159,8 +1035,8 @@ public final class CGIServlet extends Ht
          * directory to enable CGI script to be executed.
          */
         protected void expandCGIScript() {
-            StringBuffer srcPath = new StringBuffer();
-            StringBuffer destPath = new StringBuffer();
+            StringBuilder srcPath = new StringBuilder();
+            StringBuilder destPath = new StringBuilder();
             InputStream is = null;
 
             // paths depend on mapping
@@ -1187,23 +1063,27 @@ public final class CGIServlet extends Ht
 
             if (is == null) {
                 // didn't find anything, give up now
-                if (debug >= 2) {
-                    log("expandCGIScript: source '" + srcPath + "' not found");
-                }
-                 return;
+                log.warn(sm.getString("cgiServlet.expandNotFound", srcPath));
+                return;
             }
 
             File f = new File(destPath.toString());
             if (f.exists()) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    log.warn(sm.getString("cgiServlet.expandCloseFail", 
srcPath), e);
+                }
                 // Don't need to expand if it already exists
                 return;
             }
 
             // create directories
-            String dirPath = new String (destPath.toString().substring(
-                    0,destPath.toString().lastIndexOf("/")));
-            File dir = new File(dirPath);
-            dir.mkdirs();
+            File dir = f.getParentFile();
+            if (!dir.mkdirs() && !dir.isDirectory()) {
+                log.warn(sm.getString("cgiServlet.expandCreateDirFail", 
dir.getAbsolutePath()));
+                return;
+            }
 
             try {
                 synchronized (expandFileLock) {
@@ -1218,88 +1098,100 @@ public final class CGIServlet extends Ht
                     }
                     FileOutputStream fos = new FileOutputStream(f);
 
+                    try {
                     // copy data
                     IOTools.flow(is, fos);
-                    is.close();
-                    fos.close();
-                    if (debug >= 2) {
-                        log("expandCGIScript: expanded '" + srcPath + "' to '" 
+ destPath + "'");
+                    } finally {
+                        try {
+                            is.close();
+                        } catch (IOException e) {
+                            log.warn(sm.getString("cgiServlet.expandError"), 
e);
+                        }
+                        fos.close();
+                    }
+                    if (log.isDebugEnabled()) {
+                        log.debug(sm.getString("cgiServlet.expandOk", srcPath, 
destPath));
                     }
                 }
             } catch (IOException ioe) {
+                log.warn(sm.getString("cgiServlet.expandFail", srcPath, 
destPath), ioe);
                 // delete in case file is corrupted
                 if (f.exists()) {
-                    f.delete();
+                    if (!f.delete()) {
+                        log.warn(sm.getString("cgiServlet.expandDeleteFail", 
f.getAbsolutePath()));
+                    }
                 }
             }
         }
 
 
         /**
-         * Print important CGI environment information in a easy-to-read HTML
-         * table
-         *
-         * @return  HTML string containing CGI environment info
+         * Returns important CGI environment information in a multi-line text
+         * format.
          *
+         * @return CGI environment info
          */
+        @Override
         public String toString() {
 
-            StringBuffer sb = new StringBuffer();
-
-            sb.append("<TABLE border=2>");
-
-            sb.append("<tr><th colspan=2 bgcolor=grey>");
-            sb.append("CGIEnvironment Info</th></tr>");
+            StringBuilder sb = new StringBuilder();
 
-            sb.append("<tr><td>Debug Level</td><td>");
-            sb.append(debug);
-            sb.append("</td></tr>");
-
-            sb.append("<tr><td>Validity:</td><td>");
-            sb.append(isValid());
-            sb.append("</td></tr>");
+            sb.append("CGIEnvironment Info:");
+            sb.append(LINE_SEP);
 
             if (isValid()) {
-                Enumeration envk = env.keys();
-                while (envk.hasMoreElements()) {
-                    String s = (String) envk.nextElement();
-                    sb.append("<tr><td>");
-                    sb.append(s);
-                    sb.append("</td><td>");
-                    sb.append(blanksToString((String) env.get(s),
-                                             "[will be set to blank]"));
-                    sb.append("</td></tr>");
+                sb.append("Validity: [true]");
+                sb.append(LINE_SEP);
+
+                sb.append("Environment values:");
+                sb.append(LINE_SEP);
+                for (Entry<String,String> entry : env.entrySet()) {
+                    sb.append("  ");
+                    sb.append(entry.getKey());
+                    sb.append(": [");
+                    sb.append(blanksToString(entry.getValue(), "will be set to 
blank"));
+                    sb.append("]");
+                    sb.append(LINE_SEP);
                 }
-            }
 
-            sb.append("<tr><td colspan=2><HR></td></tr>");
+                sb.append("Derived Command :[");
+                sb.append(nullsToBlanks(command));
+                sb.append("]");
+                sb.append(LINE_SEP);
 
-            sb.append("<tr><td>Derived Command</td><td>");
-            sb.append(nullsToBlanks(command));
-            sb.append("</td></tr>");
 
-            sb.append("<tr><td>Working Directory</td><td>");
-            if (workingDirectory != null) {
-                sb.append(workingDirectory.toString());
-            }
-            sb.append("</td></tr>");
+                sb.append("Working Directory: [");
+                if (workingDirectory != null) {
+                    sb.append(workingDirectory.toString());
+                }
+                sb.append("]");
+                sb.append(LINE_SEP);
 
-            sb.append("<tr><td>Command Line Params</td><td>");
-            for (int i=0; i < cmdLineParameters.size(); i++) {
-                String param = (String) cmdLineParameters.get(i);
-                sb.append("<p>");
-                sb.append(param);
-                sb.append("</p>");
+                sb.append("Command Line Params:");
+                sb.append(LINE_SEP);
+                for (String param : cmdLineParameters) {
+                    sb.append("  [");
+                    sb.append(param);
+                    sb.append("]");
+                    sb.append(LINE_SEP);
+                }
+            } else {
+                sb.append("Validity: [false]");
+                sb.append(LINE_SEP);
+                sb.append("CGI script not found or not specified.");
+                sb.append(LINE_SEP);
+                sb.append("Check the HttpServletRequest pathInfo property to 
see if it is what ");
+                sb.append(LINE_SEP);
+                sb.append("you meant it to be. You must specify an existant 
and executable file ");
+                sb.append(LINE_SEP);
+                sb.append("as part of the path-info.");
+                sb.append(LINE_SEP);
             }
-            sb.append("</td></tr>");
-
-            sb.append("</TABLE><p>end.");
 
             return sb.toString();
         }
 
 
-
         /**
          * Gets derived command string
          *
@@ -1311,7 +1203,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Gets derived CGI working directory
          *
@@ -1323,31 +1214,28 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Gets derived CGI environment
          *
          * @return   CGI environment
          *
          */
-        protected Hashtable getEnvironment() {
+        protected Hashtable<String,String> getEnvironment() {
             return env;
         }
 
 
-
         /**
          * Gets derived CGI query parameters
          *
          * @return   CGI query parameters
          *
          */
-        protected ArrayList getParameters() {
+        protected ArrayList<String> getParameters() {
             return cmdLineParameters;
         }
 
 
-
         /**
          * Gets validity status
          *
@@ -1360,7 +1248,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Converts null strings to blank strings ("")
          *
@@ -1373,7 +1260,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Converts null strings to another string
          *
@@ -1388,7 +1274,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Converts blank strings to another string
          *
@@ -1405,14 +1290,9 @@ public final class CGIServlet extends Ht
         }
 
 
-
     } //class CGIEnvironment
 
 
-
-
-
-
     /**
      * Encapsulates the knowledge of how to run a CGI script, given the
      * script's desired environment and (optionally) input/output streams
@@ -1426,7 +1306,7 @@ public final class CGIServlet extends Ht
      * <p>
      *
      * The CGI environment and settings are derived from the information
-     * passed to the constuctor.
+     * passed to the constructor.
      *
      * </p>
      * <p>
@@ -1434,23 +1314,20 @@ public final class CGIServlet extends Ht
      * The input and output streams can be set by the <code>setInput</code>
      * and <code>setResponse</code> methods, respectively.
      * </p>
-     *
-     *
      */
-
     protected class CGIRunner {
 
         /** script/command to be executed */
-        private String command = null;
+        private final String command;
 
         /** environment used when invoking the cgi script */
-        private Hashtable env = null;
+        private final Hashtable<String,String> env;
 
         /** working directory used when invoking the cgi script */
-        private File wd = null;
+        private final File wd;
 
         /** command line parameters to be passed to the invoked script */
-        private ArrayList params = null;
+        private final ArrayList<String> params;
 
         /** stdin to be passed to cgi script */
         private InputStream stdin = null;
@@ -1462,8 +1339,6 @@ public final class CGIServlet extends Ht
         private boolean readyToRun = false;
 
 
-
-
         /**
          *  Creates a CGIRunner and initializes its environment, working
          *  directory, and query parameters.
@@ -1476,10 +1351,10 @@ public final class CGIServlet extends Ht
          * @param  env      Hashtable with the desired script environment
          * @param  wd       File with the script's desired working directory
          * @param  params   ArrayList with the script's query command line
-         *                  paramters as strings
+         *                  parameters as strings
          */
-        protected CGIRunner(String command, Hashtable env, File wd,
-                            ArrayList params) {
+        protected CGIRunner(String command, Hashtable<String,String> env,
+                            File wd, ArrayList<String> params) {
             this.command = command;
             this.env = env;
             this.wd = wd;
@@ -1488,9 +1363,8 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
-         * Checks & sets ready status
+         * Checks and sets ready status
          */
         protected void updateReadyStatus() {
             if (command != null
@@ -1505,7 +1379,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Gets ready status
          *
@@ -1517,7 +1390,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Sets HttpServletResponse object used to set headers and send
          * output to
@@ -1531,7 +1403,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Sets standard input to be passed on to the invoked cgi script
          *
@@ -1544,7 +1415,6 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Converts a Hashtable to a String array by converting each
          * key/value pair in the Hashtable to a String in the form
@@ -1557,13 +1427,13 @@ public final class CGIServlet extends Ht
          * @exception  NullPointerException   if a hash key has a null value
          *
          */
-        protected String[] hashToStringArray(Hashtable h)
+        protected String[] hashToStringArray(Hashtable<String,?> h)
             throws NullPointerException {
             Vector<String> v = new Vector<String>();
-            Enumeration e = h.keys();
+            Enumeration<String> e = h.keys();
             while (e.hasMoreElements()) {
-                String k = e.nextElement().toString();
-                v.add(k + "=" + h.get(k));
+                String k = e.nextElement();
+                v.add(k + "=" + h.get(k).toString());
             }
             String[] strArr = new String[v.size()];
             v.copyInto(strArr);
@@ -1571,13 +1441,13 @@ public final class CGIServlet extends Ht
         }
 
 
-
         /**
          * Executes a CGI script with the desired environment, current working
          * directory, and input/output streams
          *
          * <p>
          * This implements the following CGI specification recommedations:
+         * </p>
          * <UL>
          * <LI> Servers SHOULD provide the "<code>query</code>" component of
          *      the script-URI as command-line arguments to scripts if it
@@ -1604,7 +1474,10 @@ public final class CGIServlet extends Ht
          *             segments</u>:
          *             This implementation does not allow "<code>.</code>" and
          *             "<code>..</code>" in the the path, and such characters
-         *             will result in an IOException being thrown;
+         *             will result in an IOException being thrown (this should
+         *             never happen since Tomcat normalises the requestURI
+         *             before determining the contextPath, servletPath and
+         *             pathInfo);
          *     <LI> <u>Implementation limitations</u>: This implementation
          *             does not impose any limitations except as documented
          *             above.  This implementation may be limited by the
@@ -1614,7 +1487,6 @@ public final class CGIServlet extends Ht
          *             container's implementation of the Servlet API methods.
          *     </ul>
          * </UL>
-         * </p>
          *
          * @exception IOException if problems during reading/writing occur
          *
@@ -1628,12 +1500,11 @@ public final class CGIServlet extends Ht
              */
 
             if (!isReady()) {
-                throw new IOException(this.getClass().getName()
-                                      + ": not ready to run.");
+                throw new IOException(this.getClass().getName() + ": not ready 
to run.");
             }
 
-            if (debug >= 1 ) {
-                log("runCGI(envp=[" + env + "], command=" + command + ")");
+            if (log.isDebugEnabled()) {
+                log.debug("envp: [" + env + "], command: [" + command + "]");
             }
 
             if ((command.indexOf(File.separator + "." + File.separator) >= 0)
@@ -1646,11 +1517,11 @@ public final class CGIServlet extends Ht
             }
 
             /* original content/structure of this section taken from
-             * http://developer.java.sun.com/developer/
-             *                               bugParade/bugs/4216884.html
+             * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4216884
              * with major modifications by Martin Dengler
              */
             Runtime rt = null;
+            BufferedReader cgiHeaderReader = null;
             InputStream cgiOutput = null;
             BufferedReader commandsStdErr = null;
             Thread errReaderThread = null;
@@ -1674,7 +1545,7 @@ public final class CGIServlet extends Ht
                         cmdAndArgs.toArray(new String[cmdAndArgs.size()]),
                         hashToStringArray(env), wd);
 
-                String sContentLength = (String) env.get("CONTENT_LENGTH");
+                String sContentLength = env.get("CONTENT_LENGTH");
 
                 if(!"".equals(sContentLength)) {
                     commandsStdIn = new 
BufferedOutputStream(proc.getOutputStream());
@@ -1685,8 +1556,7 @@ public final class CGIServlet extends Ht
 
                 /* we want to wait for the process to exit,  Process.waitFor()
                  * is useless in our situation; see
-                 * http://developer.java.sun.com/developer/
-                 *                               bugParade/bugs/4223650.html
+                 * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4223650
                  */
 
                 boolean isRunning = true;
@@ -1695,15 +1565,16 @@ public final class CGIServlet extends Ht
                 final BufferedReader stdErrRdr = commandsStdErr ;
 
                 errReaderThread = new Thread() {
+                    @Override
                     public void run () {
-                        sendToLog(stdErrRdr) ;
-                    } ;
+                        sendToLog(stdErrRdr);
+                    }
                 };
                 errReaderThread.start();
 
                 InputStream cgiHeaderStream =
                     new HTTPHeaderInputStream(proc.getInputStream());
-                BufferedReader cgiHeaderReader =
+                cgiHeaderReader =
                     new BufferedReader(new InputStreamReader(cgiHeaderStream));
 
                 // Need to be careful here. If sendError() is called the
@@ -1716,25 +1587,24 @@ public final class CGIServlet extends Ht
                     try {
                         //set headers
                         String line = null;
-                        while (((line = cgiHeaderReader.readLine()) != null)
-                               && !("".equals(line))) {
-                            if (debug >= 2) {
-                                log("runCGI: addHeader(\"" + line + "\")");
+                        while (((line = cgiHeaderReader.readLine()) != null) 
&& !("".equals(line))) {
+                            if (log.isTraceEnabled()) {
+                                log.trace("addHeader(\"" + line + "\")");
                             }
                             if (line.startsWith("HTTP")) {
                                 skipBody = setStatus(response, 
getSCFromHttpStatusLine(line));
-                            } else if (line.indexOf(":") >= 0) {
+                            } else if (line.indexOf(':') >= 0) {
                                 String header =
-                                    line.substring(0, 
line.indexOf(":")).trim();
+                                    line.substring(0, 
line.indexOf(':')).trim();
                                 String value =
-                                    line.substring(line.indexOf(":") + 
1).trim();
+                                    line.substring(line.indexOf(':') + 
1).trim();
                                 if (header.equalsIgnoreCase("status")) {
                                     skipBody = setStatus(response, 
getSCFromCGIStatusHeader(value));
                                 } else {
                                     response.addHeader(header , value);
                                 }
                             } else {
-                                log("runCGI: bad header line \"" + line + 
"\"");
+                                
log.info(sm.getString("cgiServlet.runBadHeader", line));
                             }
                         }
 
@@ -1746,9 +1616,8 @@ public final class CGIServlet extends Ht
 
                         try {
                             while (!skipBody && (bufRead = 
cgiOutput.read(bBuf)) != -1) {
-                                if (debug >= 4) {
-                                    log("runCGI: output " + bufRead +
-                                        " bytes of data");
+                                if (log.isTraceEnabled()) {
+                                    log.trace("output " + bufRead + " bytes of 
data");
                                 }
                                 out.write(bBuf, 0, bufRead);
                             }
@@ -1757,7 +1626,9 @@ public final class CGIServlet extends Ht
                             // such as a socket disconnect on the servlet 
side; otherwise, the
                             // external process could hang
                             if (bufRead != -1) {
-                                while ((bufRead = cgiOutput.read(bBuf)) != -1) 
{}
+                                while ((bufRead = cgiOutput.read(bBuf)) != -1) 
{
+                                    // NOOP - just read the data
+                                }
                             }
                         }
 
@@ -1769,21 +1640,29 @@ public final class CGIServlet extends Ht
                         try {
                             Thread.sleep(500);
                         } catch (InterruptedException ignored) {
+                            // Ignore
                         }
                     }
                 } //replacement for Process.waitFor()
-            }
-            catch (IOException e){
-                log ("Caught exception " + e);
+                
+            } catch (IOException e){
+                log.warn(sm.getString("cgiServlet.runFail"), e);
                 throw e;
-            }
-            finally{
+            } finally {
+                // Close the header reader
+                if (cgiHeaderReader != null) {
+                    try {
+                        cgiHeaderReader.close();
+                    } catch (IOException ioe) {
+                        
log.warn(sm.getString("cgiServlet.runHeaderReaderFail"), ioe);
+                    }
+                }
                 // Close the output stream if used
                 if (cgiOutput != null) {
                     try {
                         cgiOutput.close();
                     } catch (IOException ioe) {
-                        log ("Exception closing output stream " + ioe);
+                        
log.warn(sm.getString("cgiServlet.runOutputStreamFail"), ioe);
                     }
                 }
                 // Make sure the error stream reader has finished
@@ -1791,11 +1670,7 @@ public final class CGIServlet extends Ht
                     try {
                         errReaderThread.join(stderrTimeout);
                     } catch (InterruptedException e) {
-                        log ("Interupted waiting for stderr reader thread");
-                    }
-                }
-                if (debug > 4) {
-                    log ("Running finally block");
+                        
log.warn(sm.getString("cgiServlet.runReaderInterupt"));                    }
                 }
                 if (proc != null){
                     proc.destroy();
@@ -1816,7 +1691,7 @@ public final class CGIServlet extends Ht
 
             if (statusStart < 1 || line.length() < statusStart + 3) {
                 // Not a valid HTTP Status-Line
-                log ("runCGI: invalid HTTP Status-Line:" + line);
+                log.warn(sm.getString("cgiServlet.runInvalidStatus", line));
                 return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
             }
 
@@ -1827,7 +1702,7 @@ public final class CGIServlet extends Ht
                 statusCode = Integer.parseInt(status);
             } catch (NumberFormatException nfe) {
                 // Not a valid status code
-                log ("runCGI: invalid status code:" + status);
+                log.warn(sm.getString("cgiServlet.runInvalidStatus", status));
                 return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
             }
 
@@ -1845,7 +1720,7 @@ public final class CGIServlet extends Ht
         private int getSCFromCGIStatusHeader(String value) {
             if (value.length() < 3) {
                 // Not a valid status value
-                log ("runCGI: invalid status value:" + value);
+                log.warn(sm.getString("cgiServlet.runInvalidStatus", value));
                 return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
             }
 
@@ -1856,7 +1731,7 @@ public final class CGIServlet extends Ht
                 statusCode = Integer.parseInt(status);
             } catch (NumberFormatException nfe) {
                 // Not a valid status code
-                log ("runCGI: invalid status code:" + status);
+                log.warn(sm.getString("cgiServlet.runInvalidStatus", status));
                 return HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
             }
 
@@ -1868,21 +1743,21 @@ public final class CGIServlet extends Ht
             int lineCount = 0 ;
             try {
                 while ((line = rdr.readLine()) != null) {
-                    log("runCGI (stderr):" +  line) ;
+                    log.warn(sm.getString("cgiServlet.runStdErr", line));
                     lineCount++ ;
                 }
             } catch (IOException e) {
-                log("sendToLog error", e) ;
+                log.warn(sm.getString("cgiServlet.runStdErrFail"), e);
             } finally {
                 try {
-                    rdr.close() ;
-                } catch (IOException ce) {
-                    log("sendToLog error", ce) ;
-                } ;
-            } ;
-            if ( lineCount > 0 && debug > 2) {
-                log("runCGI: " + lineCount + " lines received on stderr") ;
-            } ;
+                    rdr.close();
+                } catch (IOException e) {
+                    log.warn(sm.getString("cgiServlet.runStdErrFail"), e);
+                }
+            }
+            if (lineCount > 0) {
+                log.warn(sm.getString("cgiServlet.runStdErrCount", 
Integer.valueOf(lineCount)));
+            }
         }
     } //class CGIRunner
 
@@ -1891,14 +1766,14 @@ public final class CGIServlet extends Ht
      * upto and including the two blank lines terminating the headers. It
      * allows the content to be read using bytes or characters as appropriate.
      */
-    protected class HTTPHeaderInputStream extends InputStream {
+    protected static class HTTPHeaderInputStream extends InputStream {
         private static final int STATE_CHARACTER = 0;
         private static final int STATE_FIRST_CR = 1;
         private static final int STATE_FIRST_LF = 2;
         private static final int STATE_SECOND_CR = 3;
         private static final int STATE_HEADER_END = 4;
 
-        private InputStream input;
+        private final InputStream input;
         private int state;
 
         HTTPHeaderInputStream(InputStream theInput) {
@@ -1909,6 +1784,7 @@ public final class CGIServlet extends Ht
         /**
          * @see java.io.InputStream#read()
          */
+        @Override
         public int read() throws IOException {
             if (state == STATE_HEADER_END) {
                 return -1;




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

Reply via email to