In some versions of SmartClient version 6.0, an issue exists whereby when using simple HTTP communication, an inappropriate SmartClient transaction parameter can be added to the target URL.
Note that:
- This issue should not occur in the 6.0 LGPL build - only for builds including the optional SmartClient Server functionality.
- In most cases this patch will not be required, as the transaction parameter on the URL can be safely ignored by the server - the patch is only required for implementations where the server will crash if passed extra params.
Note that:
- This issue should not occur in the 6.0 LGPL build - only for builds including the optional SmartClient Server functionality.
- In most cases this patch will not be required, as the transaction parameter on the URL can be safely ignored by the server - the patch is only required for implementations where the server will crash if passed extra params.
Code:
//---------------------------------------------------------------------------- // Isomorphic SmartClient v6.0 patch // Purpose: Resolves an issue where when using simple HTTP requests an inappropriate SmartClient // transaction parameter could be added to the target URL. // // Applies to SmartClient version 6.0 only // *Note: Not required for the SmartClient LGPL version //---------------------------------------------------------------------------- if (window.isc && isc.version.startsWith("6.0/")){ isc.RPCManager.addClassMethods({ sendQueue : function (prompt, URL) { var transaction = this.currentTransaction; this.currentTransaction = null; this.queuing = false; if (!transaction) { this.logWarn("sendQueue called with no current queue, ignoring");return false; } var request = transaction.operations[0]; if (!isc.Page.isLoaded()) { if (!this.delayingTransactions) isc.Page.setEvent("load", this, isc.Page.FIRE_ONCE, "resendDelayedTransactions"); this.delayingTransactions = true; } if (this.delayingTransactions) { this.delayTransaction(transaction); return request; } transaction.timestamp = new Date().getTime(); if (!this.onLine && !this.offlinePlayback && this.offlineTransaction) { this.offlineTransaction(transaction); return request; } var allClientOnly = true; for (var i = 0; i < transaction.operations.length; i++) { if (!transaction.operations[i].clientOnly) { allClientOnly = false; break; } } if (allClientOnly) { transaction.allClientOnly = true; this.delayCall("$39d", [transaction.transactionNum], 0); return request; } URL = transaction.URL = isc.Page.getURL(URL || transaction.URL || this.getActionURL()); if (!request.useSimpleHttp && transaction.transport != "scriptInclude") { URL = this.markURLAsRPC(URL); if (transaction.transport == "xmlHttpRequest") URL = this.markURLAsXmlHttp(URL); if (document.domain != location.hostname) URL = this.addDocumentDomain(URL); URL = this.addParamsToURL(URL, {isc_tnum: transaction.transactionNum}); } prompt = transaction.prompt = ((transaction.showPrompt == null || transaction.showPrompt) ? (prompt || transaction.prompt || this.defaultPrompt) : null); if (prompt) this.doShowPrompt(transaction, prompt); var transactionParams = {}; var haveParams = false; for (var i = 0; i < transaction.operations.length; i++) { var rpcRequest = transaction.operations[i]; var params = rpcRequest.params; var queryParams = rpcRequest.queryParams; var origParams = params; if (queryParams && isc.isAn.Object(queryParams)) { URL = transaction.URL = this.addParamsToURL(URL, queryParams); } if (params && haveParams) this.logWarn("Multiple RPCRequests with params attribute in one transaction - merging"); if (params) { if (isc.isA.String(params)) { if (window[params]) params = window[params]; // component else if (isc.Canvas.getForm(params)) params = isc.Canvas.getForm(params); // native form else { this.logWarn("RPCRequest: " + isc.Log.echo(rpcRequest) + " was passed a params value: " + params + " which does not resolve to a component or a native" + " form - request to server will not include these params"); params = null; } } if (isc.isA.Class(params)) { if (params.getValues) params = params.getValues(); else { this.logWarn("RPCRequest: " + isc.Log.echo(rpcRequest) + " was passed an instance of class " + params.getClassName() + " (or a global ID that resolved to this class)" + " - this class does not support the getValues() method - request to" + " server will not include these params"); } } if (params && !isc.isAn.Object(params)) { this.logWarn("params value: " + origParams + " for RPCrequest: " + isc.Log.echo(rpcRequest) + " resolved to non-object: " + isc.Log.echo(params) + " - request to server will not include these params"); params = null; } if (params) { isc.addProperties(transactionParams, params); haveParams = true; } } } if (this.logIsInfoEnabled()) { this.logInfo("sendQueue[" + transaction.transactionNum + "]: " + transaction.operations.length + " RPCRequest(s); transport: " + transaction.transport + "; target: " + URL); } transaction.sendTime = isc.timeStamp(); transaction.changed(); transaction.callback = "isc.RPCManager.performTransactionReply(transactionNum,results,wd)"; var scs = isc.SCServerEditorActionMethods != null; if (scs && request.directSubmit) { isc.Comm.generateJSCallback(transaction); var form = request.submitForm; var domForm = form.getForm(); if (form.getItem("_transaction") != null && isc.isA.HiddenItem(form.getItem("_transaction"))) { form.setValue("_transaction", this.serializeTransaction(transaction)); this.logInfo("Direct submit assigning request data to hidden field instead of" + " submitting as GET request"); domForm.action = this.addParamsToURL(URL, transactionParams); } else { if (request.useSimpleHttp) { domForm.action = this.addParamsToURL(URL, transactionParams); transaction.$387 = true; } else { domForm.action = this.transactionAsGetRequest(transaction,null, transactionParams); } } this.$39a(transaction); if (request.target) { if (request.target != window) domForm.target = request.target; form.submitForm(); } else { var frame = isc.Comm.getTargetableFrame(request.prompt); domForm.target = frame.getName(); transaction.$ch = frame; frame.draw(form.getID() + ".submitForm()"); } } else if (scs && request.downloadResult) { if (!window.name) window.name = isc.timeStamp(); var target = transaction.download_filename; if (request.downloadToNewWindow == false || (request.downloadToNewWindow == null && request.exportFilename)) { var target = window.name; } if (request.$38j) { this.clearTransaction(transaction); transaction.transactionRequest = this.transactionAsGetRequest(transaction, URL, transactionParams); return transaction.transactionRequest; } var params = isc.addProperties(transactionParams, {_transaction:this.serializeTransaction(transaction), protocolVersion:"1.0"}); transaction.$387 = true; this.$39a(transaction); transaction.$ch = isc.Comm.sendHiddenFrame({ URL: URL, httpMethod: request.httpMethod, httpHeaders: request.httpHeaders, contentType: request.contentType, fields: params, target: target, transactionNum: transaction.transactionNum, transaction:transaction }); } else { var params = transactionParams; var transport = transaction.transport, transportMethodName = "send" + (transport.substring(0,1).toUpperCase()) + transport.substring(1); if (isc.Comm[transportMethodName] == null) { this.logWarn("Attempt to send transaction with specified transport '" + transaction.transport + "' failed - unsupported transaction type."); return; } this.$39a(transaction); isc.RPCManager.$410.push(transaction.transactionNum); transaction.transactionRequest = isc.Comm[transportMethodName]({ URL: URL, httpMethod: request.httpMethod, contentType: request.contentType, httpHeaders: request.httpHeaders, bypassCache: request.bypassCache, data: request.useSimpleHttp ? request.data : null, fields: params, target: request.target, // valid only for scriptInclude callbackParam: request.callbackParam, transport: transaction.transport, blocking: request.blocking, useSimpleHttp:request.useSimpleHttp, transactionNum: transaction.transactionNum, transaction: transaction }); } return request; } }); } else if (window.isc) { isc.Log.logWarn("Patch for SmartClient 6.0 included in this application. " + "You are currently running SmartClient verion '"+ isc.version + "'. This patch is not compatible with this build and will have no effect. " + "It should be removed from your application source."); }