483 lines
18 KiB
Plaintext
483 lines
18 KiB
Plaintext
<%@language="javascript"%>
|
|
<% /*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: shared/500_error.asp
|
|
Description: In IIS in te stellen als custom 500-error pagina
|
|
|
|
Note: Je zit hier in de context van het *originele* script
|
|
Request.ServerVariables("PATH_INFO") is het originele bestand
|
|
|
|
Het is heel verleidelijk common.inc te includen. Stel echter dat de database niet bereikbaar is?
|
|
Dan klapt m_connections.inc er weer opnieuw uit en hebben we nog niets bereikt.
|
|
Daarom gebruiken we ook geen lcl's in dit bestand maar hardcoded teksten.
|
|
Logger.inc durf ik nog net aan voor het gemak
|
|
|
|
PF: als deze door een service wordt gegeven wil je (ik) andere info, of althans geen geformatteerde html?
|
|
JGL: Bij Response Buffer Exceeded ook adviseren kleinere periode te kiezen
|
|
*/ %>
|
|
<!-- #include file="../Shared/logger.inc" -->
|
|
<!-- #include file="../Shared/json2.js" -->
|
|
<!-- #include file="../api2/api2_rest.inc" -->
|
|
<%
|
|
try { Response.Clear; } catch (e) {};
|
|
|
|
if (Request.QueryString("check500").Count > 0)
|
|
{
|
|
Response.Write("OK500"); // voor fac_verify.asp
|
|
Response.End;
|
|
}
|
|
|
|
var lcls_NL = {
|
|
lcl_AiAi: "Aiai!",
|
|
lcl_timeout: "Opvragen van de pagina duurde te lang.",
|
|
lcl_solution: "Een mogelijke oplossing kan zijn om uw zoekfilter aan te passen zodat minder resultaten worden opgeleverd.",
|
|
lcl_toobig: "Opgevraagde pagina is te groot.",
|
|
lcl_error: "Er is iets fout gegaan, maar dat ligt waarschijnlijk niet aan u.",
|
|
lcl_registered: "Deze fout wordt automatisch geregistreerd en onderzocht.",
|
|
lcl_refresh: "U kunt wellicht het beste uw browser verversen en verder gaan met uw werk."
|
|
}
|
|
var lcls_EN = {
|
|
lcl_AiAi: "Aiai!",
|
|
lcl_timeout: "Requested page timed out.",
|
|
lcl_solution: "A possible solution may be to change your search filter in order to produce less results.",
|
|
lcl_toobig: "Requested page is too big.",
|
|
lcl_error: "Something went wrong but this is most likely not your fault.",
|
|
lcl_registered: "This error is automatically registered and will be investigated.",
|
|
lcl_refresh: "The best course of action may be to refresh your browser and continue your work."
|
|
|
|
}
|
|
var lcls = lcls_NL;
|
|
if (Session("user_lang") != "NL")
|
|
lcls = lcls_EN;
|
|
|
|
function L(p_lcl)
|
|
{
|
|
return lcls[p_lcl];
|
|
}
|
|
|
|
|
|
var objASPError = Server.GetLastError;
|
|
var proto = (Request.ServerVariables("SERVER_PORT") == "443")? "https" : "http";
|
|
var sitenoroot = proto + "://" + Request.ServerVariables("SERVER_NAME");
|
|
// Opgepikt door logger.inc
|
|
var hiresTimer = null;
|
|
var __LogfileName = LogfileName();
|
|
var __LogfileTitle = "AiAi";
|
|
var __LogNoClear = true;
|
|
|
|
// Waarschijnlijk een jQuery ajax
|
|
var format = String(Request.QueryString("format")).toLowerCase();
|
|
if (String(Request.ServerVariables("HTTP_ACCEPT")).match(/application\/json/) != null ||
|
|
String(Request.ServerVariables("HTTP_X-Requested-With")) == "XMLHttpRequest" ||
|
|
(Request.QueryString("api2").Count > 0 && format != "scf")
|
|
)
|
|
{
|
|
switch (objASPError.ASPCode)
|
|
{
|
|
case "ASP 0113": // Script timed out
|
|
{
|
|
var msg = L("lcl_timeout");
|
|
if (String(Request.ServerVariables("SCRIPT_NAME")).match(/list/i) || String(Request.ServerVariables("SCRIPT_NAME")).match(/res_search_plan/i))
|
|
{
|
|
msg += "\n" + L("lcl_solution");
|
|
}
|
|
break;
|
|
}
|
|
case "ASP 0251": // Response Buffer Limit Exceeded
|
|
{
|
|
var msg = L("lcl_toobig");
|
|
if (String(Request.ServerVariables("SCRIPT_NAME")).match(/list/i) || String(Request.ServerVariables("SCRIPT_NAME")).match(/res_search_plan/i))
|
|
{
|
|
msg += "\n" + L("lcl_solution");
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
var msg = "Aiai"
|
|
+ "\n" + L("lcl_error")
|
|
+ "\n" + L("lcl_registered")
|
|
+ "\n" + L("lcl_refresh");
|
|
break;
|
|
}
|
|
}
|
|
msg += "\n\nFACILITOR " + toISODateTimeString(new Date())
|
|
+ ", " + sitenoroot;
|
|
|
|
if (__Logging > 0)
|
|
{
|
|
msg += "\n(Zie " + LogfileName() + ")";
|
|
}
|
|
if ((Application("otap_environment") == "O" || __Logging > 0) && objASPError.Description)
|
|
msg += "\n\n(gaat niet naar klanten:)\n" + objASPError.Description + "\n" + objASPError.File + "(" + objASPError.Line + ")";
|
|
|
|
if (Request.QueryString("api2").Count > 0)
|
|
{
|
|
var data = { error: { code: 500,
|
|
message: msg
|
|
}
|
|
};
|
|
if (Application("otap_environment") == "O" || __Logging > 0)
|
|
data.error.internal = ASPErrorJson();
|
|
|
|
if (format == "xml")
|
|
{
|
|
Response.ContentType = "text/xml";
|
|
var xml_antwoord = api2_rest.json2xml([data.error], { records_name: "errors", record_name: "error"}, true);
|
|
Response.Write(xml_antwoord.xml);
|
|
}
|
|
else if (format == 'html')
|
|
{
|
|
Response.ContentType = "text/html";
|
|
var str_antwoord = "<!DOCTYPE html><html><head></head><body><pre>"
|
|
+ Server.HTMLEncode(JSON.stringify(data, null, 2))
|
|
+ "</pre></body></html>";
|
|
Response.Write(str_antwoord);
|
|
}
|
|
else
|
|
{
|
|
Response.ContentType = "application/json";
|
|
Response.Write(JSON.stringify(data, null, 2));
|
|
}
|
|
}
|
|
else
|
|
Response.Write("FCLTFriendly:" + msg); // FCLTFriendly wordt zo opgepikt door FcltJquery.js ajaxSetup error handler
|
|
LogErrorToFile();
|
|
Response.End;
|
|
};
|
|
|
|
// Breek heel grof uit eventuele geneste HTML zodat onze tekst duidelijk in beeld komt
|
|
Response.Write("</script></table></table></option></select></form>");
|
|
|
|
// Dit gaat naar de eindgebruiker:
|
|
|
|
// styling vrij hard omdat we niet op css kunnen rekenen
|
|
%>
|
|
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html;charset=windows-1252">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
|
<style>
|
|
body {
|
|
font-family:Arial,Helvetica;
|
|
font-size: 90%!important;
|
|
}
|
|
div.aiai {
|
|
text-align: left;
|
|
border: 3px solid #FF6F6F;
|
|
border-radius: 10px;
|
|
padding: 20px 20px 40px 20px;
|
|
width: 450px;
|
|
font-size:1em;
|
|
font-weight: normal;
|
|
color: black;
|
|
background-color: #fff0f0;
|
|
}
|
|
table tbody tr td {
|
|
font-family: Courier;
|
|
font-size:12px;
|
|
padding: 2px;
|
|
}
|
|
table.source {
|
|
background-color: #f8f8f8;
|
|
border: 1px solid #ddd;
|
|
border-collapse: collapse;
|
|
padding: 5px;
|
|
}
|
|
td.linenr {
|
|
background-color: white;
|
|
border-right: 1px solid #ddd;
|
|
text-align: right;
|
|
width: 40px;
|
|
padding-right: 4px;
|
|
}
|
|
pre { margin: 0px;
|
|
background-color: #f8f8f8;
|
|
}
|
|
.important {
|
|
font-weight: bold;
|
|
background-color: #fee;
|
|
}
|
|
.klein {
|
|
font-size: 8px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class='aiai'>
|
|
<h1 style='color:red'><%=L("lcl_AiAi")%></h1>
|
|
<%
|
|
switch (objASPError.ASPCode)
|
|
{
|
|
case "ASP 0113": // Script timed out
|
|
{
|
|
Response.Write(L("lcl_timeout"));
|
|
if (String(Request.ServerVariables("SCRIPT_NAME")).match(/list/i) || String(Request.ServerVariables("SCRIPT_NAME")).match(/res_search_plan/i))
|
|
{
|
|
Response.Write("<br><br>" + L("lcl_solution"));
|
|
}
|
|
break;
|
|
}
|
|
case "ASP 0251": // Response Buffer Limit Exceeded
|
|
{
|
|
Response.Write(L("lcl_toobig"));
|
|
if (String(Request.ServerVariables("SCRIPT_NAME")).match(/list/i) || String(Request.ServerVariables("SCRIPT_NAME")).match(/res_search_plan/i))
|
|
{
|
|
Response.Write("<br><br>" + L("lcl_solution"));
|
|
}
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
Response.Write(L("lcl_error"));
|
|
Response.Write("\n<br><br><span style='font-size:0.8em'>" + L("lcl_registered"));
|
|
Response.Write("\n<br>" + L("lcl_refresh") + "</span>");
|
|
Response.Write("\n<br><br><span style='font-size:0.8em;'>FACILITOR "+toISODateTimeString(new Date())+"</span>");
|
|
Response.Write("\n<br><span style='font-size:0.8em;'>" + sitenoroot + "</span>");
|
|
break;
|
|
}
|
|
}
|
|
|
|
Response.Write("</div></body></html>");
|
|
|
|
if (Application("otap_environment") == "O" || __Logging > 0)
|
|
{
|
|
Response.Write("\n<p>De rest is niet zichtbaar voor klanten.<br>");
|
|
Response.Write("\n<span class='klein'>\\cust\\custenv.wsc heeft Overrule.APPLICATION(\"otap_environment\", \"O\"); of logging staat aan</span></p>");
|
|
|
|
Response.Write("\n<hr><p>Zie <a href='" + rooturl + "/appl/fac/fac_StreamFile.asp?logger=3' target='_blank'>AiAi logfile</a> "
|
|
+ " of de <a href='" + rooturl + "/appl/fac/fac_StreamFile.asp?logger=0' target='_blank'>gewone logfile </a>"
|
|
+ "voor meer details of klik <a href='javascript:location.reload()'><button>Refresh</button></a> om het opnieuw te proberen.</p>");
|
|
|
|
var pad = String(Request.ServerVariables("PATH_TRANSLATED"));
|
|
var params = String(Request.ServerVariables("QUERY_STRING"));
|
|
if (params!="")
|
|
{
|
|
pad += "?" + params;
|
|
}
|
|
var y = String(Request.ServerVariables("APPL_PHYSICAL_PATH")); // Zoveel gaan we er af strippen
|
|
pad = pad.substring(y.length);
|
|
var method = Request.ServerVariables("REQUEST_METHOD");
|
|
var extra = "<tr><td>Customer:</td><td>" + Session("customerId") + (rooturl.length>1?'@'+rooturl.substr(1):"") + "</td></tr>";
|
|
|
|
// Lees de UDL tekstueel uit. We zitten al in de problemen dus we hebben geen m_connections.inc
|
|
var ForReading = 1;
|
|
var tsUnicode = -1;
|
|
|
|
var fso = new ActiveXObject("Scripting.FileSystemObject");
|
|
var udl = Server.MapPath(rooturl + "/cust/" + Session("customerId") + "/Oracle.udl");
|
|
try
|
|
{
|
|
var f = fso.OpenTextFile(udl, ForReading, true, tsUnicode);
|
|
var s = f.ReadLine();
|
|
s = f.ReadLine();
|
|
s = f.ReadLine(); //3e regel is interessant
|
|
// Provider=OraOLEDB.Oracle.1;Password=xxxxx;Persist Security Info=True;User ID=hcas;Data Source=fclt
|
|
var sa = s.split(";");
|
|
var data = [];
|
|
var uid = "";
|
|
var tns = "";
|
|
for (var i = 0; i < sa.length; i++)
|
|
{
|
|
var itma = sa[i].split("=");
|
|
if (itma.length == 2)
|
|
{
|
|
if (itma[0] == 'User ID')
|
|
uid = itma[1];
|
|
if (itma[0] == 'Data Source')
|
|
tns = itma[1];
|
|
}
|
|
}
|
|
f.Close();
|
|
}
|
|
catch (e)
|
|
{
|
|
uid = "Not found";
|
|
tns = udl;
|
|
}
|
|
extra += "<tr><td>Database:</td><td>" + uid + "@" + tns + "</td></tr>";
|
|
|
|
var ttl = "?" + params.replace(/\%2C/g, ",").split("&").join("\n&");
|
|
extra += "<tr><td>Url:</td><td title='" + Server.HTMLEncode(ttl) + "'>" + Server.HTMLEncode(method + " " + pad) + "</td></tr>";
|
|
Response.Write(ASPErrorText(extra));
|
|
|
|
Response.Write("\n<br>" + ShowSourcecode(-8, +4));
|
|
}
|
|
LogErrorToFile(); // verwijdert ook last_sql
|
|
|
|
Response.End;
|
|
|
|
function ASPErrorText(extra)
|
|
{
|
|
var err = "<table class='error'>";
|
|
err += (extra||"");
|
|
|
|
var props = ["Category", "ASPCode", "ASPDescription", "Description", "File", "Line", "Column", "Source", "Number"];
|
|
for (v in props)
|
|
{
|
|
if (objASPError[props[v]])
|
|
{
|
|
var myVal = objASPError[props[v]];
|
|
var safeprop = Server.HTMLEncode(myVal).replace(/\n/g,"<br/>");
|
|
if (props[v] == 'Description')
|
|
safeprop = "<span class='important'>" + safeprop + "</span>";
|
|
if (props[v] == 'Column' && myVal == -1)
|
|
continue; // niet interessant
|
|
if (props[v] == 'Number' && !isNaN(myVal))
|
|
{
|
|
if (myVal < 0)
|
|
myVal = 0xFFFFFFFF + myVal + 1;
|
|
safeprop += " (0x" + myVal.toString(16) + ")"
|
|
}
|
|
err += "\n<tr><td style='vertical-align:top'>"+props[v]+":</td><td>" + safeprop + "</td></tr>";
|
|
}
|
|
}
|
|
if (Session("last_caller")) // vanuit m_connections.inc
|
|
{
|
|
err += "\n<tr><td style='vertical-align:top'>Call stack:</td><td style='max-width: 800px;'>" + Session("last_caller") + "</td></tr>";
|
|
}
|
|
if (Session("last_sql")) // vanuit m_connections.inc
|
|
{
|
|
err += "\n<tr><td style='vertical-align:top'>Last SQL:</td><td style='max-width: 800px;'>" + Server.HTMLEncode(Session("last_sql")) + "</td></tr>";
|
|
}
|
|
|
|
err += "</table>";
|
|
return err;
|
|
}
|
|
|
|
function ASPErrorJson()
|
|
{
|
|
var err = {};
|
|
var props = ["Category", "ASPCode", "ASPDescription", "Description", "File", "Line", "Column", "Source", "Number"];
|
|
for (v in props)
|
|
{
|
|
if (objASPError[props[v]])
|
|
{
|
|
err[props[v]] = objASPError[props[v]];
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
function LogErrorToFile()
|
|
{
|
|
__SafeDoLog("Session('customerId'): " + Session("customerId") + " <span style='font-size:9px;color:#444'>" + Request.ServerVariables("REMOTE_ADDR") + "</span>", "#f00");
|
|
__SafeDoLog(ASPErrorText());
|
|
Session.Contents.Remove("last_sql"); // Nu weg, anders worden ze bij Sessions ook nog getoond
|
|
Session.Contents.Remove("last_caller");
|
|
if (Request.ServerVariables("HTTP_REFERER").Count)
|
|
__DoLog("Referer: " + Request.ServerVariables("HTTP_REFERER"));
|
|
|
|
__SafeDoLog(ShowSourcecode(-8, +4));
|
|
|
|
if (Request.QueryString.Count>0) // Hele URL is al wel gelogd maar dit is leesbaarder
|
|
{
|
|
__SafeDoLog(__DumpCollection(Request.QueryString, "Request.QueryString"));
|
|
}
|
|
try
|
|
{
|
|
var method = Request.ServerVariables("REQUEST_METHOD");
|
|
if (method == "POST" || Request.TotalBytes > 0)
|
|
__DoLog("POSTed " + Request.TotalBytes + " bytes");
|
|
|
|
if (Request.Form.Count>0)
|
|
__DoLogForm();
|
|
}
|
|
catch(e)
|
|
{
|
|
__SafeDoLog(Server.HTMLEncode(e.description) + "<br>Loggen form mislukt, er is waarschijnlijk gewoon al een Request.BinaryRead geweest.")
|
|
}
|
|
__SafeDoLog(__DumpCollection(Session.Contents, "Session"));
|
|
__SafeDoLog("IP: " + Request.ServerVariables("REMOTE_ADDR") + "<br>Useragent: " + Server.HTMLEncode(Request.ServerVariables("HTTP_USER_AGENT")));
|
|
}
|
|
|
|
var rooturl;
|
|
function LogfileName()
|
|
{
|
|
// autodetect rooturl. Al onze pagina's beginnen met /cust of met /appl
|
|
var pad = String(Request.ServerVariables("PATH_INFO"));
|
|
var lowerpad = pad.toLowerCase();
|
|
var i1 = lowerpad.indexOf("/cust/");
|
|
if (i1 < 0)
|
|
i1 = lowerpad.indexOf("/appl/");
|
|
if (i1 < 0)
|
|
i1 = lowerpad.indexOf("/default.asp"); // API's
|
|
/* global */ rooturl = pad.substr(0, i1);
|
|
|
|
// Zoek de TempFolder, de enige folder met 'gegarandeerd' schrijfrechten
|
|
var fso = Server.CreateObject("Scripting.FileSystemObject");
|
|
var sPath = Server.MapPath("./");
|
|
|
|
while (fso.FolderExists(sPath) && !fso.FolderExists(sPath + "/temp"))
|
|
{
|
|
sPath = fso.GetParentFolderName(sPath);
|
|
}
|
|
if (!fso.FolderExists(sPath + "/temp") || !fso.FolderExists(sPath + "/appl") || !fso.FolderExists(sPath + "/cust"))
|
|
return null; // Het moet wel de TEMP folder zijn naast APPL, niet toevallig eentje in de root
|
|
|
|
// Naam van de AiAi folder bepalen. Kijk daartoe of er al een folder is van de vorm /temp/500_error_xxxxx
|
|
var f = fso.GetFolder(sPath + "/temp/");
|
|
var fname = "500_error";
|
|
|
|
var nowtxt = toISODateString(new Date());
|
|
var folder = sPath + "/temp/" + fname;
|
|
if (!fso.FolderExists(folder))
|
|
fso.CreateFolder(folder);
|
|
return folder + "/log_" + nowtxt + ".html.log";
|
|
}
|
|
|
|
function ShowSourcecode(minregel, plusregel)
|
|
{
|
|
if (!objASPError.File)
|
|
{
|
|
return "<span style='background-color:magenta'><p>Vreemd genoeg geen objASPError.File?</span>";
|
|
}
|
|
var fso = Server.CreateObject("Scripting.FileSystemObject");
|
|
var fpath = objASPError.File; // meestal is dit een relatief pad maar ik heb meegemaakt
|
|
if (fpath.indexOf(":") == -1) // (lokaal W10, na een rename van een bestand?) dat het een volledig pad was
|
|
var fpath = Server.MapPath(objASPError.File);
|
|
var myF = fso.GetFile(fpath);
|
|
var ts = new Date(myF.DateLastModified);
|
|
var result = "Source: "+objASPError.File + " (" + toISODateTimeString(ts) + ")<br>";
|
|
var myFile = fso.OpenTextFile(fpath);
|
|
var ll =0;
|
|
while (!myFile.AtEndOfStream && ll < objASPError.Line + minregel)
|
|
{
|
|
ll ++;
|
|
myFile.SkipLine();
|
|
}
|
|
result += "<table class='source'>";
|
|
while (!myFile.AtEndOfStream && ll < objASPError.Line + plusregel)
|
|
{
|
|
ll++;
|
|
var stl = "";
|
|
var txt = myFile.ReadLine();
|
|
if (ll==objASPError.Line)
|
|
{
|
|
stl = "style='background-color:#e0fafa'";
|
|
if (objASPError.Column > 0)
|
|
{
|
|
txt = Server.HTMLEncode(txt.substr(0, objASPError.Column))
|
|
+ "<span style='background-color:#f88;'>"
|
|
+ Server.HTMLEncode(txt.substr(objASPError.Column, 1))
|
|
+ "</span>"
|
|
+ Server.HTMLEncode(txt.substr(objASPError.Column + 1));
|
|
}
|
|
else
|
|
txt = Server.HTMLEncode(txt);
|
|
}
|
|
else
|
|
txt = Server.HTMLEncode(txt);
|
|
result += "\n<tr><td class='linenr'>" + ll + "</td><td class='source'><pre "+stl+">" + txt + "</pre></td></tr>";
|
|
}
|
|
myFile.Close()
|
|
result += "</table>";
|
|
return result;
|
|
}
|
|
|
|
%>
|