diff --git a/packages/bruno-app/src/utils/codemirror/autocomplete.js b/packages/bruno-app/src/utils/codemirror/autocomplete.js index ff55fc16b..ed21e0f76 100644 --- a/packages/bruno-app/src/utils/codemirror/autocomplete.js +++ b/packages/bruno-app/src/utils/codemirror/autocomplete.js @@ -24,6 +24,7 @@ const STATIC_API_HINTS = { 'req.setHeader(name, value)', 'req.setHeaders(data)', 'req.deleteHeader(name)', + 'req.deleteHeaders(data)', 'req.getBody()', 'req.setBody(data)', 'req.setMaxRedirects(maxRedirects)', diff --git a/packages/bruno-app/src/utils/codemirror/autocomplete.spec.js b/packages/bruno-app/src/utils/codemirror/autocomplete.spec.js index 526e5c10f..a59754a7a 100644 --- a/packages/bruno-app/src/utils/codemirror/autocomplete.spec.js +++ b/packages/bruno-app/src/utils/codemirror/autocomplete.spec.js @@ -383,6 +383,22 @@ describe('Bruno Autocomplete', () => { ); }); + it('should provide deleteHeader and deleteHeaders hints for req.delete prefix', () => { + const line = 'req.delete'; + mockedCodemirror.getCursor.mockReturnValue({ line: 0, ch: line.length }); + mockedCodemirror.getLine.mockReturnValue(line); + mockedCodemirror.getRange.mockReturnValue(line); + + const result = getAutoCompleteHints(mockedCodemirror, {}, [], { + showHintsFor: ['req'] + }); + + expect(result).toBeTruthy(); + expect(result.list).toEqual( + expect.arrayContaining(['deleteHeader(name)', 'deleteHeaders(data)']) + ); + }); + it('should handle case-insensitive matching', () => { mockedCodemirror.getCursor.mockReturnValue({ line: 0, ch: 10 }); mockedCodemirror.getLine.mockReturnValue('{{varName}}'); diff --git a/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/request.test.js b/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/request.test.js index 8024f7913..1fe2df865 100644 --- a/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/request.test.js +++ b/packages/bruno-converters/tests/bruno/bruno-to-postman-translations/request.test.js @@ -79,6 +79,18 @@ describe('Bruno to Postman Request Translation', () => { expect(translatedCode).toBe('pm.request.headers.set("Authorization", "Bearer token123");'); }); + it('should translate req.deleteHeader() to pm.request.headers.remove()', () => { + const code = 'req.deleteHeader("Authorization");'; + const translatedCode = translateBruToPostman(code); + expect(translatedCode).toBe('pm.request.headers.remove("Authorization");'); + }); + + it('should handle req.deleteHeader() with a variable argument', () => { + const code = 'const headerName = "X-Custom"; req.deleteHeader(headerName);'; + const translatedCode = translateBruToPostman(code); + expect(translatedCode).toBe('const headerName = "X-Custom"; pm.request.headers.remove(headerName);'); + }); + it('should handle all request properties together', () => { const code = ` // All request properties diff --git a/packages/bruno-js/src/bruno-request.js b/packages/bruno-js/src/bruno-request.js index 4d746acf8..274af3891 100644 --- a/packages/bruno-js/src/bruno-request.js +++ b/packages/bruno-js/src/bruno-request.js @@ -125,6 +125,13 @@ class BrunoRequest { this.req.headers = headers; } + deleteHeaders(headers) { + headers.forEach((name) => { + delete this.headers[name]; + delete this.req.headers[name]; + }); + } + getHeader(name) { return this.req.headers[name]; } diff --git a/packages/bruno-js/src/sandbox/quickjs/shims/bruno-request.js b/packages/bruno-js/src/sandbox/quickjs/shims/bruno-request.js index 37a694e37..99db6b3a7 100644 --- a/packages/bruno-js/src/sandbox/quickjs/shims/bruno-request.js +++ b/packages/bruno-js/src/sandbox/quickjs/shims/bruno-request.js @@ -102,6 +102,12 @@ const addBrunoRequestShimToContext = (vm, req) => { vm.setProp(reqObject, 'setHeaders', setHeaders); setHeaders.dispose(); + let deleteHeaders = vm.newFunction('deleteHeaders', function (headers) { + req.deleteHeaders(vm.dump(headers)); + }); + vm.setProp(reqObject, 'deleteHeaders', deleteHeaders); + deleteHeaders.dispose(); + let getHeader = vm.newFunction('getHeader', function (name) { return marshallToVm(req.getHeader(vm.dump(name)), vm); }); @@ -114,8 +120,8 @@ const addBrunoRequestShimToContext = (vm, req) => { vm.setProp(reqObject, 'setHeader', setHeader); setHeader.dispose(); - let deleteHeader = vm.newFunction('deleteHeader', function (name) { - req.deleteHeader(vm.dump(name)); + let deleteHeader = vm.newFunction('deleteHeader', function (header) { + req.deleteHeader(vm.dump(header)); }); vm.setProp(reqObject, 'deleteHeader', deleteHeader); deleteHeader.dispose(); diff --git a/packages/bruno-tests/collection/scripting/api/req/deleteHeaders.bru b/packages/bruno-tests/collection/scripting/api/req/deleteHeaders.bru new file mode 100644 index 000000000..9295fa2b2 --- /dev/null +++ b/packages/bruno-tests/collection/scripting/api/req/deleteHeaders.bru @@ -0,0 +1,32 @@ +meta { + name: deleteHeaders + type: http + seq: 13 +} + +get { + url: {{host}}/ping + body: none + auth: none +} + +headers { + X-Frame-Options: 1 + Content-Type: application/json +} + +assert { + res.status: eq 200 + res.body: eq pong +} + +script:pre-request { + req.deleteHeaders(['X-Frame-Options']); +} + +tests { + test("req.deleteHeaders(names)", function() { + const h = req.getHeaders(); + expect(h["x-frame-options"]).to.be.undefined; + }); +}