Improve CFHTTP response time

1.5k views Asked by At

I have an API that logs in an account and then performs a search on items that I want to place a bid on via a CFHTTP request as follows.

Search.cfm:

<cfinclude template="logMeIn.cfm" />

<cfhttp url="https://utas.fut.ea.com/ut/game/fifa14/transfermarket?maxb=1800000&start=0&num=16&type=player&maskedDefId=158023" method="POST" result="Get">
    <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
    <cfhttpparam type="header" name="Host" value="utas.fut.ea.com" />
    <cfhttpparam type="header" name="Referer" value="http://cdn.easf.www.easports.com/soccer/static/flash/futFifaUltimateTeamPlugin/FifaUltimateTeam.swf" />
    <cfhttpparam type="header" name="X-HTTP-Method-Override" value="GET" />
    <cfhttpparam type="header" name="X-UT-PHISHING-TOKEN" value="#ListLast(Session.searchAccount40PhishingKey,'=')#" />
    <cfhttpparam type="header" name="X-UT-SID" value="#Session.searchAccount40SessionKey#" />
</cfhttp>

logMeIn.cfm:

<cfscript>
    Variables.email = "[email protected]";
    Variables.password = "password";
    Variables.secretAnswer = "secretAnswer";
    Session.searchAccountGamertag = "WirierJupiter11";
    Variables.doReload = 0;
    Variables.deviceView = "device=not_mobile";
</cfscript>

<cfhttp url="http://www.easports.com/uk/fifa/football-club/ultimate-team" method="GET" result="stage1" redirect="false">
    <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
    <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
    <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
    <cfhttpparam type="header" name="Connection" value="keep-alive" />
    <cfhttpparam type="header" name="Host" value="www.easports.com" />
    <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
</cfhttp>

<cfif StructKeyExists(Stage1.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage2URL = Stage1.ResponseHeader['Location'];
        Variables.returnedCookies = Stage1.ResponseHeader['Set-Cookie'];
        Variables.easfcWebSessionStr = Variables.returnedCookies[1];
        Variables.easfcWebSession = ListFirst(Variables.easfcWebSessionStr,";");
        Variables.hlStr = Variables.returnedCookies[2];
        Variables.hl = ListFirst(Variables.hlStr,";");
        Variables.xsrfTokenStr = Variables.returnedCookies[3];
        Variables.xsrfToken = ListFirst(Variables.xsrfTokenStr,";");
    </cfscript>
    <cfhttp url="#Variables.stage2URL#" method="GET" result="Stage2" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage2") AND StructKeyExists(Stage2.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage3URL = Stage2.ResponseHeader['Location'];
    </cfscript>
    <cfhttp url="#Variables.stage3URL#" method="GET" result="Stage3" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage3") AND StructKeyExists(Stage3.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage4URL = Stage3.ResponseHeader['Location'];
        Variables.jSessionStr = Stage3.ResponseHeader['Set-Cookie'];
        Variables.jSession = ListFirst(Variables.jSessionStr,";");
    </cfscript>

    <cfhttp url="#Variables.stage4URL#" method="GET" result="Stage4" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.jSession#" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>

    <cfscript>
        Variables.bodyContent = "email=#Variables.email#&password=#Variables.password#&_rememberMe=on&rememberMe=on&_eventId=submit&facebookAuth=";
        Variables.contentLength = Len(Variables.bodyContent);
    </cfscript>

    <cfhttp url="#Variables.stage4URL#" method="POST" result="Stage5" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="#Variables.contentLength#" />
        <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.jSession#" />
        <cfhttpparam type="header" name="Host" value="signin.ea.com" />
        <cfhttpparam type="header" name="Referer" value="#Variables.stage4URL#" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
        <cfhttpparam type="body" value="#Variables.bodyContent#" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage5") AND StructKeyExists(Stage5.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage6URL = Stage5.ResponseHeader['Location'];
        Variables.returnedCookies = Stage5.ResponseHeader['Set-Cookie'];
        Variables.webunStr = Variables.returnedCookies[3];
        Variables.webun = ListFirst(Variables.webunStr,";");
        Variables.isPogoStr = Variables.returnedCookies[4];
        Variables.isPogo = ListFirst(Variables.isPogoStr,";");
    </cfscript>
    <cfhttp url="#Variables.stage6URL#" method="GET" result="Stage6" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="s_sivo=US%3AORIGIN%3ANONE; s_cc=true; s_ria=flash%2010%7Csilverlight%202.9; s_pv=NA%3AUS%3ASTORE%3ANONE%3ASTORE%3ANONE%3AORIGIN%3ANONE%3ALOGIN; s_nr1=1379427845791-NEW; s_sq=%5B%5BB%5D%5D; __utma=103303007.1129861060.1379427834.1379427834.1379427834.1; __utmb=103303007.1.10.1379427834; __utmc=103303007; __utmz=103303007.1379427834.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); s_ppv=85">
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="Referer" value="#Variables.stage4URL#" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage6") AND StructKeyExists(Stage6.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage7URL = Stage6.ResponseHeader['Location'];
        Variables.returnedCookies = Stage6.ResponseHeader['Set-Cookie'];
        Variables.sidStr = Variables.returnedCookies[1];
        Variables.sid = ListFirst(Variables.sidStr,";");
        Variables.remidStr = Variables.returnedCookies[2];
        Variables.remid = ListFirst(Variables.remidStr,";");
        Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken;
    </cfscript>
    <cfhttp url="#Variables.stage7URL#" method="GET" result="Stage7" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage7") AND StructKeyExists(Stage7.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage8URL = Stage7.ResponseHeader['Location'];
        Variables.easfcWebSessionStr = Stage7.ResponseHeader['Set-Cookie'];
        Variables.easfcWebSession = ListFirst(Variables.easfcWebSessionStr,";");
        Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken;
    </cfscript>
    <cfhttp url="#Variables.stage8URL#" method="GET" result="Stage8" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Cache-Control" value="no-cache" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage8") AND StructKeyExists(Stage8.ResponseHeader,"Set-Cookie")>
    <cfscript>
        Variables.stage9URL = "http://www.easports.com/iframe/fut/?locale=en_GB&baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team";
        Variables.returnedCookies = Stage8.ResponseHeader['Set-Cookie'];
        Variables.deviceView = ListFirst(Variables.returnedCookies,";");
        Variables.cookieStr = Variables.cookieStr & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage9URL#" method="GET" result="Stage9" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/uk/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage9") AND StructKeyExists(Stage9.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage10URL = Stage9.ResponseHeader['Location'];
        Variables.futWebStr = Stage9.ResponseHeader['Set-Cookie'];
        Variables.futWeb = ListFirst(Variables.futWebStr,";");
        Variables.cookieStr = Variables.remid & "; " & Variables.sid;
    </cfscript>
    <cfhttp url="#Variables.stage10URL#" method="GET" result="Stage10" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="accounts.ea.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/uk/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage10") AND StructKeyExists(Stage10.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage11URL = Stage10.ResponseHeader['Location'];
        Variables.sidStr = Stage10.ResponseHeader['Set-Cookie'];
        Variables.sid = ListFirst(Variables.sidStr,";");
        Variables.cookieStr = Variables.futWeb & "; " & Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage11URL#" method="GET" result="Stage11" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Encoding" value="gzip, deflate" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Variables.cookieStr#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"Stage11") AND StructKeyExists(Stage11.ResponseHeader,"Location")>
    <cfscript>
        Variables.stage12URL = Stage11.ResponseHeader['Location'];
        Variables.futWebStr = Stage11.ResponseHeader['Set-Cookie'];
        Variables.futWeb = ListFirst(Variables.futWebStr,";");
        Session.searchAccountCookie = Variables.futWeb & "; " & Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; " & Variables.deviceView;
    </cfscript>
    <cfhttp url="#Variables.stage12URL#" method="GET" result="Stage12" redirect="false">
        <cfhttpparam type="header" name="Accept" value="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/fifa/football-club/ultimate-team" />
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Session,"searchAccountCookie")>
    <cfscript>
        Variables.data = '{ "isReadOnly": false, "sku": "FUT14WEB", "clientVersion": 1, "nuc": 1000215983198, "nucleusPersonaId": 948682854"nucleusPersonaDisplayName": "WirierJupiter11", "nucleusPersonaPlatform": "360", "locale": "en-GB", "method": "authcode", "priorityLevel":4, "identification": { "authCode": "" } }';
        Variables.dataLength = Len(Variables.data);
    </cfscript>
    <cfhttp url="http://www.easports.com/iframe/fut/p/ut/auth" method="POST" result="sessionIDRequest">
        <cfhttpparam type="header" name="Accept" value="application/json, text/javascript" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="#Variables.dataLength#" />
        <cfhttpparam type="header" name="Content-Type" value="application/json" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Easw-Session-Data-Nucleus-ID" value="1000215983198" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="Referer" value=" http://www.easports.com/iframe/fut/?baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team&locale=en_GB">
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />   
        <cfhttpparam type="header" name="X-UT-Embed-Error" value="true" />
        <cfhttpparam type="header" name="X-UT-Route" value="https://utas.fut.ea.com:443" />
        <cfhttpparam type="header" name="X-Requested-With" value="XMLHttpRequest" />
        <cfhttpparam type="body" value="#Variables.data#" />
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"sessionIDRequest") AND Variables.sessionIDRequest.FileContent NEQ "Connection Failure" AND Variables.sessionIDRequest.StatusCode NEQ "500 Internal Server Error">
    <cfscript>
        Variables.sessionKeyRequest = REReplace(Variables.sessionIDRequest.FileContent, "^\s*[[:word:]]*\s*\(\s*","");
        Variables.sessionKeyRequest = REReplace(Variables.sessionKeyRequest, "\s*\)\s*$", "");
        Variables.sessionInfo = DeserializeJSON(Variables.sessionKeyRequest);
        Session.searchAccountSessionKey = Variables.sessionInfo.sid;
    </cfscript>
    <cfhttp url="http://www.easports.com/iframe/fut/p/ut/game/fifa14/phishing/validate" method="POST" result="phishingKeyRequest">
        <cfhttpparam type="header" name="Accept" value="application/json" />
        <cfhttpparam type="header" name="Accept-Language" value="en-US, en;q=0.5" />
        <cfhttpparam type="header" name="Connection" value="keep-alive" />
        <cfhttpparam type="header" name="Content-Length" value="39" />
        <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded" />
        <cfhttpparam type="header" name="Cookie" value="#Session.searchAccountCookie#" />
        <cfhttpparam type="header" name="Easw-Session-Data-Nucleus-ID" value="1000215983198" />
        <cfhttpparam type="header" name="Host" value="www.easports.com" />
        <cfhttpparam type="header" name="Pragma" value="no-cache" />
        <cfhttpparam type="header" name="Referer" value="http://www.easports.com/iframe/fut/?baseShowoffUrl=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team%2Fshow-off&guest_app_uri=http%3A%2F%2Fwww.easports.com%2Fuk%2Ffifa%2Ffootball-club%2Fultimate-team&locale=en_GB">
        <cfhttpparam type="header" name="User-Agent" value="Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36" />
        <cfhttpparam type="header" name="X-UT-Embed-Error" value="true" />
        <cfhttpparam type="header" name="X-UT-Route" value="https://utas.fut.ea.com:443" />
        <cfhttpparam type="header" name="X-Requested-With" value="XMLHttpRequest" />
        <cfhttpparam type="header" name="X-UT-SID" value="#Session.searchAccountSessionKey#" />
        <cfhttpparam type="formField" name="answer" value="#Variables.secretAnswer#">
    </cfhttp>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<cfif StructKeyExists(Variables,"phishingKeyRequest") AND StructKeyExists(Variables.phishingKeyRequest.ResponseHeader,"Set-Cookie")>    
    <cfscript>
        Variables.returnedCookies = phishingKeyRequest.ResponseHeader["Set-Cookie"];
        Session.searchAccountPhishingKey = ListFirst(Variables.returnedCookies,";");
        if (StructKeyExists(Variables,"easfcWebSession")) {
            Variables.cookieStr = Variables.easfcWebSession & "; " & Variables.hl & "; " & Variables.xsrfToken & "; device=not_mobile; " & Session.searchAccountPhishingKey;
            Session.searchAccountLoggedIn = 1;
            Session.searchAccountLoginAttempts = 0;
        } else {
            Variables.doReload = 1;
        }
    </cfscript>
<cfelse>
    <cfset Variables.doReload = 1 />
</cfif>

<!--- IF RELOAD PAGE FLAG SET TO TRUE RELOAD --->
<cfif Variables.doReload EQ 1>

    <!--- RELOAD PAGE --->
    <script>
        location.reload();
    </script>

</cfif>

The issue I'm having is that the search response is taking a few hundred milliseconds to return and this is resulting in me missing out on quite a lot of items (as there are APIs that are getting this data back faster).

Is there a way I can increase the time it takes me to receive a response? Is there something I can amend in my code or an alternative function to CFHTTP that I could use? Or is there even another language like Ruby, Python or C# that I might be better writing the API in that can perform this sort of function faster, as at the end of the day speed is the most important factor.

Thanks very much in advance for any advice.

1

There are 1 answers

8
barnyr On

CFHTTP will open a connection, make the request, then close the connection. Your logMeIn.cfm is making 14 http requests if I'm reading it right. There's a considerable time cost in setting up each connection.

I think you have two options open to you:

Log in ahead of time

Would it possible to run logMeIn.cfm periodically either in a thread or using the CF scheduler and keep the searchAccount40SessionKey value in application scope? your code could make a request and see if the session ID is still good. If it is, leave it be. If not, go through the login process. If your site supports many users, that's possibly not a scalable approach. If it's for a small number of people, it may work

Use a different HTTP library.

CF ships with HTTPClient (I think, just downloading now to check). That has the ability to do connection management. That way, you should be able to keep a single connection going throughout all the requests. It'll mean a re-write of most of your code, but you should see a significant speed increase. You may be able to simplify things a little, too, as HTTPClient can do some of the management of cookies/location header and following redirects.

Have a look at this answer: Understanding Persistent HTTP Connections in ColdFusion

If you're not already doing so, proxy your requests through Fiddler, so you can see how the client/server are interacting. To use Fiddler, install it, start it, then modify your CFHTTP calls to use proxyServer=localhost and proxyPort=8888. You'll then see the HTTP calls listed as they're made. It's invaluable in this kind of work. It'll also let you drag a request into the composer tab, edit it a bit, then re-send it, which can be a lot faster than re-writing code, just to try something out.

Update

@CPB07 added a little more detail in the comments. The session ID is already cached and held in session, which means the first suggestion has already been implemented. the other bit of info is that the search.cfm is being called every 335ms and that's what needs optimising. Given that, the best improvement I can think of is to switch the CFHTTP call in search.cfm over to use HTTPClient. CF10 ships with a recent version of HTTPComponents' HTTPClient, so the code listed in section 2.3 of this page ought to be roughly what you're after. The example in section 2.3.1 uses an HTTPContext, which has a getCookieStore() method, which has an addCookie() method, which will allow you to set the session cookie and have it used in each request. Roughly speaking, everything outside the try block in that code can be run once and objects stored in session, then the actual request/connection opening can be run each time.

The other thing to look at is how you're executing the code in the first place. You said you're not that familiar with threads, which I guess means you're using the scheduler or AJAX to poll. You're likely to get more consistent results by running the polling code in a thread, but it will up the complexity a bit more.

Update 2

Using Fiddler to access the URL in search.cfm, looking at the statistics tab, the two key numbers are:

  • TCP/IP Connect: 5ms
  • HTTPS Handshake: 186ms

If you keep the connection open, you stand to save that amount of time per-request on average. Keep-alive only keeps the connection open for a certain number of requests, so you do have to re-connect periodically, but given that you're making requests every 335ms, spending ~200ms in connection time seems high. Is the browser requesting the search1.cfm every 335ms? If so, you're paying a double penalty, as the browser connects to your server, then that has to connect to the external server.