An issue exists in SmartClient 6.5.1 (LGPL version only) where HTTP error responses from the server (404, 500, etc) cause a Javascript crash with the message "evalText.match is not a function".
This patch code should address the problem. Please note that this issue only occurs in the LGPL version of SmartClient - you do not need to apply this patch to any other version.
This patch code should address the problem. Please note that this issue only occurs in the LGPL version of SmartClient - you do not need to apply this patch to any other version.
Code:
//---------------------------------------------------------------------------- // Isomorphic SmartClient 6.5.1 patch // Purpose: Fix for problem in LGPL version only - JS crash when we receive // an HTTP error back from the server // // Applies to SmartClient 6.5.1 LGPL build only //---------------------------------------------------------------------------- if (window.isc && isc.version.startsWith("6.5.1/") ){ if (isc.RestDataSource) { isc.RestDataSource.addMethods({ transformResponse:function(_1,_2,_3) { if(_1.status<0)return _1; if(this.dataFormat=="json"){ var _4=_3.response||{}; _1.status=this.getValidStatus(_4.status); if(_1.status==isc.DSResponse.STATUS_VALIDATION_ERROR){ var _5=_4.errors; if(isc.isAn.Array(_5)){ if(_5.length>1){ this.logWarn("server returned an array of errors - ignoring all but the first one") } _5=_5[0] } _1.errors=_5 }else if(_1.status<0){ _1.data=_4.data } if(_4.totalRows!=null)_1.totalRows=_4.totalRows; if(_4.startRow!=null)_1.startRow=_4.startRow; if(_4.endRow!=null)_1.endRow=_4.endRow }else{ _1.status=this.getValidStatus(_3.selectString("//status")); if(_1.status==isc.DSResponse.STATUS_VALIDATION_ERROR){ var _5=_3.selectNodes("//errors"); _5=isc.xml.toJS(_5); if(_5.length>1){this.logWarn("server returned an array of errors - ignoring all but the first one") } _5=_5[0]; _1.errors=_5 }else if( _1.status<0){ _1.data=_3.selectString("//data") } var _6=_3.selectNumber("//totalRows"); if(_6!=null)_1.totalRows=_6; var _7=_3.selectNumber("//startRow"); if(_7!=null)_1.startRow=_7; var _8=_3.selectNumber("//endRow"); if(_8!=null)_1.endRow=_8 } return _1 } }); } if (isc.WSDataSource) { isc.WSDataSource.addMethods({ transformResponse:function(_1,_2,_3) { if(!_3 || !_3.selectString)return; _1.status=_3.selectString("//status"); if(isc.isA.String(_1.status)){ var _4=isc.DSResponse[_1.status]; if(_1.status==null){ this.logWarn("Unable to map response code: "+_4+" to a DSResponse code, setting status to DSResponse.STATUS_FAILURE."); _4=isc.DSResponse.STATUS_FAILURE }else{ _1.status=_4 } } if(_1.status==isc.DSResponse.STATUS_VALIDATION_ERROR){ var _5=_3.selectNodes("//errors/*"); _1.errors=isc.xml.toJS(_5,null,this) } _1.totalRows=_3.selectNumber("//totalRows"); _1.startRow=_3.selectNumber("//startRow"); _1.endRow=_3.selectNumber("//endRow") } }); } if (isc.RPCManager) { isc.RPCManager.addClassMethods({ performTransactionReply:function(_1,_2,_3){ var _4=this.getTransaction(_1); if(!_4){ this.logWarn("No such transaction "+_1); return false } _4.receiveTime=isc.timeStamp(); _4.changed(); isc.RPCManager.$410.remove(_1); this.logInfo("transaction "+_1+" arrived after "+(_4.receiveTime-_4.sendTime)+"ms"); if(_2==null){ this.logFatal("No results for transaction "+_1); return false } if(_4.transport=="xmlHttpRequest"){ var _5=_2; _4.xmlHttpRequest=_5; _2=_5.responseText; var _6; try{ _6=_5.status }catch(e){ this.logWarn("Unable to access XHR.status - network cable unplugged?"); _6=-1 } if(_6==1223)_6=204; if(_6==0&&(location.protocol=="file:"||location.protocol=="app-resource:"))_6=200; _4.httpResponseCode=_6; _4.httpResponseText=_5.responseText; if(_6!=-1&&!_4.ignoreReloginMarkers&&this.processLoginStatusText(_5,_1)){ return } if(_6!=-1&&this.responseRequiresLogin(_5,_1)){ this.handleLoginRequired(_1); return } if(_6!=-1&&this.responseIsRelogin(_5,_1)){ this.handleLoginRequired(_1); return } if(_6>299||_6<200){ var _7=_4.URL; if(_4.isProxied){ _7=_4.proxiedURL+" (via proxy: "+_7+")" } _2=this.$39c(_4,{ data:"Transport error - HTTP code: "+_6+" for URL: "+_7+(_6==302?" This error is likely the result"+" of a redirect to a server other than the origin"+" server or a redirect loop.":""), status:isc.RPCResponse.STATUS_TRANSPORT_ERROR }); this.logDebug("RPC request to: "+_7+" returned with http response code: "+_6+". Response text:\n"+_5.responseText) _4.status=isc.RPCResponse.STATUS_TRANSPORT_ERROR; } } _4.results=_2; this.$39d(_1); return true }, createRPCResponse:function(_1,_2,_3){ return isc.addProperties({ operationId:_2.operation.ID, clientContext:_2.clientContext, context:_2, transactionNum:_1.transactionNum, httpResponseCode:_1.httpResponseCode, httpResponseText:_1.httpResponseText, xmlHttpRequest:_1.xmlHttpRequest, transport:_1.transport, status:_1.status, clientOnly:_2.clientOnly },_3)} }); } } else if (window.isc) { isc.Log.logWarn("Patch for SmartClient 6.5.1 build included in this application. " + "You are currently running SmartClient version '"+ isc.version + "'. This patch is not compatible with this build and will have no effect. " + "It should be removed from your application source."); } // End of patch // ------------