I use https://insomnia.rest/
to call an API requiring NTLM authentication.
I enable the proxy in the insomnia tool and get this recording in Gatling:
package ingvill
import scala.concurrent.duration._
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import io.gatling.jdbc.Predef._
class RecordedSimulation extends Simulation {
val httpProtocol = http
.baseURL("http://d-1.test")
.inferHtmlResources()
.disableWarmUp
.acceptHeader("*/*")
.authorizationHeader("NTLM TlRMTVNTUAADAAAAGAAYAJgAAACIAYgBsAAAABQAFABYAAAADgAOAGwAAAAeAB4AegAAAAAAAAA4AgAABYKIogYBsR0AAAAP2xHsBHvbynzrij2jMRw73m0AaQBzAHQAcgBhAGwAZABlAHYARwAwADIAMAAyADgANABWAEQASQAtAEQARQBWAC0AUAAwADEALQA0ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBJww6N0WXf3NmPBaaHKjXAQEAAAAAAADqVIYgu+LTAdxdn2UsTg2tAAAAAAIAFgBNAEkAUwBUAFIAQQBMAFQARQBTAFQAAQAaAEQALQAxADEANAAtADIANwAwAC0AMAA5ADMABAA4AE0AaQBzAHQAcgBhAGwAdABlAHMAdAAuAE0AaQBzAHQAcgBhAGwAbgBlAHQAdAAuAHQAZQBzAHQAAwBUAEQALQAxADEANAAtADIANwAwAC0AMAA5ADMALgBNAGkAcwB0AHIAYQBsAHQAZQBzAHQALgBNAGkAcwB0AHIAYQBsAG4AZQB0AHQALgB0AGUAcwB0AAUAIABNAGkAcwB0AHIAYQBsAG4AZQB0AHQALgB0AGUAcwB0AAcACADqVIYgu+LTAQYABAACAAAACAAwADAAAAAAAAAAAQAAAAAgAAAnec3On060mYWhixN5RUCfIwxqdbooI/OVl7Bz15EiHwoAEAAAAAAAAAAAAAAAAAAAAAAACQAAAAAAAAAAAAAAAAAAAA==")
.contentTypeHeader("application/json")
.userAgentHeader("insomnia/5.16.1")
val headers_0 = Map(
"ApplicationId" -> "INTERNETT",
"Authorization" -> "NTLM TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbEdAAAADw==",
"iv-creds" -> "BAKs3DCCBgUMADCCBf8wggX7AgIIATBgMC0wHgIEwq6IpgICBuMCAhHdAgIAmwICAIMEBgIAAAoTAQwLMTIxMjM0NDM2NDkwLzAtMB0CBEVhqXACAl6aAgIR2wICAKICASEEBgIAAQAABgwMbWluX292ZXJzaWt0AgEBMIIFjjCCBYowIgwUQVVUSEVOVElDQVRJT05fTEVWRUwwCjAIAgEEDAE4BAAwLQwXQVpOX0NSRURfQVVUSE5NRUNIX0lORk8wEjAQAgEEDAlCYW5rSUQtTk8EADAqDBJBWk5fQ1JFRF9BVVRIWk5fSUQwFDASAgEEDAsxMjEyMzQ0MzY0OQQAMDMMFEFaTl9DUkVEX0FVVEhfTUVUSE9EMBswGQIBBAwSZXh0LWF1dGgtaW50ZXJmYWNlBAAwgZQMFUFaTl9DUkVEX0JST1dTRVJfSU5GTzB7MHkCAQQMck1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzU4LjAuMzAyOS4xMTAgU2FmYXJpLzUzNy4zNgQAMCgMD0FaTl9DUkVEX0dST1VQUzAVMBMCAQQMDG1pbl9vdmVyc2lrdAQAMEIMG0FaTl9DUkVEX0dST1VQX1JFR0lTVFJZX0lEUzAjMCECAQQMGmNuPW1pbl9vdmVyc2lrdCxvPWduZixjPW5vBAAwRQwUQVpOX0NSRURfR1JPVVBfVVVJRFMwLTArAgEEDCQ0NTYxYTk3MC01ZTlhLTExZGItYTIyMS0wMjAwMDEwMDAwMDYEADAmDBJBWk5fQ1JFRF9JUF9GQU1JTFkwEDAOAgEEDAdBRl9JTkVUBAAwKQwQQVpOX0NSRURfTUVDSF9JRDAVMBMCAQQMDElWX0xEQVBfVjMuMAQAMDMMHEFaTl9DUkVEX05FVFdPUktfQUREUkVTU19CSU4wEzARAgEEDAoweDhiNzEwMTc4BAAwNgwcQVpOX0NSRURfTkVUV09SS19BRERSRVNTX1NUUjAWMBQCAQQMDTEzOS4xMTMuMS4xMjAEADAtDBlBWk5fQ1JFRF9QUklOQ0lQQUxfRE9NQUlOMBAwDgIBBAwHRGVmYXVsdAQAMC8MF0FaTl9DUkVEX1BSSU5DSVBBTF9OQU1FMBQwEgIBBAwLMTIxMjM0NDM2NDkEADBIDBdBWk5fQ1JFRF9QUklOQ0lQQUxfVVVJRDAtMCsCAQQMJGMyYWU4OGE2LTA2ZTMtMTFkZC05YjgzLTAyMDAwMDBhMTMwMQQAMC0MEUFaTl9DUkVEX1FPUF9JTkZPMBgwFgIBBAwPU1NLOiBUTFNWMTI6IDBBBAAwOQwUQVpOX0NSRURfUkVHSVNUUllfSUQwITAfAgEEDBhjbj0wMDAxODkxNDY3LG89Z25mLGM9bm8EADAfDBJBWk5fQ1JFRF9VU0VSX0lORk8wCTAHAgEEDAAEADAnDBBBWk5fQ1JFRF9WRVJTSU9OMBMwEQIBBAwKMHgwMDAwMDgwMQQAMFUMFUFaTl9DVVNUT01fQVRUUklCVVRFUzA8MB4CAQQMF0FaTl9DUkVEX0FVVEhOTUVDSF9JTkZPBAAwGgIBBAwTZWFpLWJhbmtpZC11dHN0ZWRlcgQAMCIME2VhaS1iYW5raWQtdXRzdGVkZXIwCzAJAgEEDAJYWAQAMDwMEVNNU19TRVNTSU9OX1JFQUxNMCcwJQIBBAweSVNBTS1EaXN0cmlidXRlZC1TZXNzaW9uLUNhY2hlBAAwMAwYdGFndmFsdWVfbG9naW5fdXNlcl9uYW1lMBQwEgIBBAwLMTIxMjM0NDM2NDkEADA2DCR0YWd2YWx1ZV9tYXhfY29uY3VycmVudF93ZWJfc2Vzc2lvbnMwDjAMAgEEDAV1bnNldAQAMEcMFnRhZ3ZhbHVlX3Nlc3Npb25faW5kZXgwLTArAgEEDCQ3MDNjZDg2Ni03MWZmLTExZTctYTI3ZC0wMDUwNTY4MjNlMDIEAA==",
"retryAttempt" -> "0")
val headers_1 = Map(
"ApplicationId" -> "INTERNETT",
"iv-creds" -> "BAKs3DCCBgUMADCCBf8wggX7AgIIATBgMC0wHgIEwq6IpgICBuMCAhHdAgIAmwICAIMEBgIAAAoTAQwLMTIxMjM0NDM2NDkwLzAtMB0CBEVhqXACAl6aAgIR2wICAKICASEEBgIAAQAABgwMbWluX292ZXJzaWt0AgEBMIIFjjCCBYowIgwUQVVUSEVOVElDQVRJT05fTEVWRUwwCjAIAgEEDAE4BAAwLQwXQVpOX0NSRURfQVVUSE5NRUNIX0lORk8wEjAQAgEEDAlCYW5rSUQtTk8EADAqDBJBWk5fQ1JFRF9BVVRIWk5fSUQwFDASAgEEDAsxMjEyMzQ0MzY0OQQAMDMMFEFaTl9DUkVEX0FVVEhfTUVUSE9EMBswGQIBBAwSZXh0LWF1dGgtaW50ZXJmYWNlBAAwgZQMFUFaTl9DUkVEX0JST1dTRVJfSU5GTzB7MHkCAQQMck1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDYuMTsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzU4LjAuMzAyOS4xMTAgU2FmYXJpLzUzNy4zNgQAMCgMD0FaTl9DUkVEX0dST1VQUzAVMBMCAQQMDG1pbl9vdmVyc2lrdAQAMEIMG0FaTl9DUkVEX0dST1VQX1JFR0lTVFJZX0lEUzAjMCECAQQMGmNuPW1pbl9vdmVyc2lrdCxvPWduZixjPW5vBAAwRQwUQVpOX0NSRURfR1JPVVBfVVVJRFMwLTArAgEEDCQ0NTYxYTk3MC01ZTlhLTExZGItYTIyMS0wMjAwMDEwMDAwMDYEADAmDBJBWk5fQ1JFRF9JUF9GQU1JTFkwEDAOAgEEDAdBRl9JTkVUBAAwKQwQQVpOX0NSRURfTUVDSF9JRDAVMBMCAQQMDElWX0xEQVBfVjMuMAQAMDMMHEFaTl9DUkVEX05FVFdPUktfQUREUkVTU19CSU4wEzARAgEEDAoweDhiNzEwMTc4BAAwNgwcQVpOX0NSRURfTkVUV09SS19BRERSRVNTX1NUUjAWMBQCAQQMDTEzOS4xMTMuMS4xMjAEADAtDBlBWk5fQ1JFRF9QUklOQ0lQQUxfRE9NQUlOMBAwDgIBBAwHRGVmYXVsdAQAMC8MF0FaTl9DUkVEX1BSSU5DSVBBTF9OQU1FMBQwEgIBBAwLMTIxMjM0NDM2NDkEADBIDBdBWk5fQ1JFRF9QUklOQ0lQQUxfVVVJRDAtMCsCAQQMJGMyYWU4OGE2LTA2ZTMtMTFkZC05YjgzLTAyMDAwMDBhMTMwMQQAMC0MEUFaTl9DUkVEX1FPUF9JTkZPMBgwFgIBBAwPU1NLOiBUTFNWMTI6IDBBBAAwOQwUQVpOX0NSRURfUkVHSVNUUllfSUQwITAfAgEEDBhjbj0wMDAxODkxNDY3LG89Z25mLGM9bm8EADAfDBJBWk5fQ1JFRF9VU0VSX0lORk8wCTAHAgEEDAAEADAnDBBBWk5fQ1JFRF9WRVJTSU9OMBMwEQIBBAwKMHgwMDAwMDgwMQQAMFUMFUFaTl9DVVNUT01fQVRUUklCVVRFUzA8MB4CAQQMF0FaTl9DUkVEX0FVVEhOTUVDSF9JTkZPBAAwGgIBBAwTZWFpLWJhbmtpZC11dHN0ZWRlcgQAMCIME2VhaS1iYW5raWQtdXRzdGVkZXIwCzAJAgEEDAJYWAQAMDwMEVNNU19TRVNTSU9OX1JFQUxNMCcwJQIBBAweSVNBTS1EaXN0cmlidXRlZC1TZXNzaW9uLUNhY2hlBAAwMAwYdGFndmFsdWVfbG9naW5fdXNlcl9uYW1lMBQwEgIBBAwLMTIxMjM0NDM2NDkEADA2DCR0YWd2YWx1ZV9tYXhfY29uY3VycmVudF93ZWJfc2Vzc2lvbnMwDjAMAgEEDAV1bnNldAQAMEcMFnRhZ3ZhbHVlX3Nlc3Npb25faW5kZXgwLTArAgEEDCQ3MDNjZDg2Ni03MWZmLTExZTctYTI3ZC0wMDUwNTY4MjNlMDIEAA==",
"retryAttempt" -> "0")
val uri1 = "http://xxx"
val scn = scenario("RecordedSimulation")
.exec(http("request_0")
.post("/xxx")
.headers(headers_0)
.resources(http("request_1")
.post(uri1 + "")
.headers(headers_1)
.body(RawFileBody("RecordedSimulation_0001_request.txt")))
.check(status.is(401)))
setUp(scn.inject(atOnceUsers(1))).protocols(httpProtocol)
}
Using the insomnia tool I get http 200 ok, but while recording it records http 401. Replaying the script gives me 1 http 411.
I guess this is due to the required NTML autentication that is causing problems.
I have trolled the web, this forum and stackoverflow about ntlm autentication and tried different suggestions not leading me anyway.
I miss aconcrete example on how to define ntlm autentication in a gatling script so it could reproduce exactly what the insomnia tool does well.
Any ideas?
Thanks,
Magnus