Search code examples
arraysjsonfiddlerjscript.net

Use FiddlerScript's OnBeforeResponse to change properties of elements in an array


I am trying to write a FiddlerScript to modify the properties of a JSON array that is returned from the server.

Here is what I have tried so far:

static function OnBeforeResponse(oSession: Session) {
    if (m_Hide304s && oSession.responseCode == 304) {
        oSession["ui-hide"] = "true";
    }
    if(oSession.HostnameIs("myserver.com") && oSession.uriContains("info")) {
        oSession["ui-backcolor"] = "lime";

        // Convert the request body into a string
        var oBody = System.Text.Encoding.UTF8.GetString(oSession.requestBodyBytes);

        // Convert the text into a JSON object
        var j = Fiddler.WebFormats.JSON.JsonDecode(oBody);

        var placementsArray = j.JSONObject["placements"];

        FiddlerObject.log("Got Placements.");
        // I can't figure out how to access the elements of the array
        //for (var i: int=0; i < placementsArray.Length; i++) {
        //    placements[i]["isValid"] = true;
        //}

        // Convert back to a byte array
        var modBytes = Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject);

        // Convert json to bytes, storing the bytes in request body
        var mod = System.Text.Encoding.UTF8.GetBytes(modBytes);
        oSession.RequestBody = mod;
    }
}

I need help with the for loop that is commented out in the middle of this function. I would like to walk the array of "placements", and then change a value called "IsValid" in each of these "placement" objects. I need to do this so that I can modify responses from a server, so that I can test a client app with different server responses for the array item property values.


Solution

  • Here is the answer in case it helps anyone. I was incorrectly getting and setting the Request body instead of the Response body, and I was also using the non-existent "Length" property of ArrayList instead of "Count".

    static function OnBeforeResponse(oSession: Session) {
        // This code was already here, leaving it
        if (m_Hide304s && oSession.responseCode == 304) {
            oSession["ui-hide"] = "true";
        }
        // Here is new code to modify server's response
        if(oSession.HostnameIs("myserver.com") && oSession.uriContains("info")) {
            // Color this response, so we can spot it in Fiddler
            oSession["ui-backcolor"] = "lime";
    
            // Convert the request body into a string
            var oBody = System.Text.Encoding.UTF8.GetString(oSession.responseBodyBytes);
    
            var j: Fiddler.WebFormats.JSON.JSONParseResult;
            // Convert the text into a JSON object
            // In this case our JSON root element is a dictionary (HashTable)
            j = Fiddler.WebFormats.JSON.JsonDecode(oBody);
    
            // Inside of our dictionary, we have an array (ArrayList) called "placements"
            var placementsArray = j.JSONObject["placements"];
            for (var iEach = 0; iEach < placementsArray.Count; iEach++){
                // In each object/member in the array, we change one of its properties
                placementsArray[iEach]["isValid"] = true;
            }
    
            // Convert back to a byte array
            var modBytes = Fiddler.WebFormats.JSON.JsonEncode(j.JSONObject);
    
            // Convert json to bytes, storing the bytes in request body
            var mod = System.Text.Encoding.UTF8.GetBytes(modBytes);
            oSession.ResponseBody = mod;
        }
    }