@@ -10,6 +10,7 @@ import {
1010 getGlobalScope ,
1111 getIsolationScope ,
1212 init ,
13+ denoServeIntegration ,
1314 setTag ,
1415 setUser ,
1516} from '../build/esm/index.js' ;
@@ -65,6 +66,167 @@ Deno.test('Deno.serve should create http.server spans', async () => {
6566 assertEquals ( transaction ?. request ?. url ?. includes ( '/test' ) , true ) ;
6667} ) ;
6768
69+ Deno . test ( 'Deno.serve should capture incoming request bodies by default' , async ( ) => {
70+ resetGlobals ( ) ;
71+ const transactionEvents : TransactionEvent [ ] = [ ] ;
72+
73+ init ( {
74+ dsn : 'https://username@domain/123' ,
75+ tracesSampleRate : 1 ,
76+ traceLifecycle : 'static' ,
77+ beforeSendTransaction : ( event : TransactionEvent ) => {
78+ transactionEvents . push ( event ) ;
79+ return null ;
80+ } ,
81+ } ) as DenoClient ;
82+
83+ const abortController = new AbortController ( ) ;
84+ let onListen : ( ( _ : unknown ) => void ) | undefined = undefined ;
85+ const p = new Promise ( resolve => ( onListen = resolve ) ) ;
86+ const server = Deno . serve ( { port : 0 , signal : abortController . signal , onListen } , async request => {
87+ assertEquals ( await request . json ( ) , { username : 'test' , action : 'login' } ) ;
88+ return new Response ( 'OK' ) ;
89+ } ) ;
90+ await p ;
91+
92+ const requestBody = JSON . stringify ( { username : 'test' , action : 'login' } ) ;
93+ const response = await fetch ( `http://localhost:${ server . addr . port } /test` , {
94+ method : 'POST' ,
95+ headers : { 'content-type' : 'application/json' } ,
96+ body : requestBody ,
97+ } ) ;
98+ assertEquals ( await response . text ( ) , 'OK' ) ;
99+
100+ abortController . abort ( ) ;
101+ await server . finished ;
102+
103+ assertEquals ( transactionEvents . length , 1 ) ;
104+ assertEquals ( transactionEvents [ 0 ] ?. request ?. data , requestBody ) ;
105+ } ) ;
106+
107+ Deno . test ( 'Deno.serve should not capture incoming request bodies when disabled' , async ( ) => {
108+ resetGlobals ( ) ;
109+ const transactionEvents : TransactionEvent [ ] = [ ] ;
110+
111+ init ( {
112+ dsn : 'https://username@domain/123' ,
113+ tracesSampleRate : 1 ,
114+ traceLifecycle : 'static' ,
115+ dataCollection : { httpBodies : [ ] } ,
116+ beforeSendTransaction : ( event : TransactionEvent ) => {
117+ transactionEvents . push ( event ) ;
118+ return null ;
119+ } ,
120+ } ) as DenoClient ;
121+
122+ const abortController = new AbortController ( ) ;
123+ let onListen : ( ( _ : unknown ) => void ) | undefined = undefined ;
124+ const p = new Promise ( resolve => ( onListen = resolve ) ) ;
125+ const server = Deno . serve ( { port : 0 , signal : abortController . signal , onListen } , async request => {
126+ assertEquals ( await request . json ( ) , { secret : 'do-not-capture' } ) ;
127+ return new Response ( 'OK' ) ;
128+ } ) ;
129+ await p ;
130+
131+ const response = await fetch ( `http://localhost:${ server . addr . port } /test` , {
132+ method : 'POST' ,
133+ headers : { 'content-type' : 'application/json' } ,
134+ body : JSON . stringify ( { secret : 'do-not-capture' } ) ,
135+ } ) ;
136+ assertEquals ( await response . text ( ) , 'OK' ) ;
137+
138+ abortController . abort ( ) ;
139+ await server . finished ;
140+
141+ assertEquals ( transactionEvents . length , 1 ) ;
142+ assertEquals ( transactionEvents [ 0 ] ?. request ?. data , undefined ) ;
143+ } ) ;
144+
145+ Deno . test ( 'Deno.serve should truncate incoming request bodies using an explicit size' , async ( ) => {
146+ resetGlobals ( ) ;
147+ const transactionEvents : TransactionEvent [ ] = [ ] ;
148+
149+ init ( {
150+ dsn : 'https://username@domain/123' ,
151+ tracesSampleRate : 1 ,
152+ traceLifecycle : 'static' ,
153+ dataCollection : { httpBodies : [ ] } ,
154+ integrations : integrations => [
155+ ...integrations . filter ( integration => integration . name !== 'DenoServe' ) ,
156+ denoServeIntegration ( { maxRequestBodySize : 'small' } ) ,
157+ ] ,
158+ beforeSendTransaction : ( event : TransactionEvent ) => {
159+ transactionEvents . push ( event ) ;
160+ return null ;
161+ } ,
162+ } ) as DenoClient ;
163+
164+ const abortController = new AbortController ( ) ;
165+ let onListen : ( ( _ : unknown ) => void ) | undefined = undefined ;
166+ const p = new Promise ( resolve => ( onListen = resolve ) ) ;
167+ const requestBody = 'a' . repeat ( 1_001 ) ;
168+ const server = Deno . serve ( { port : 0 , signal : abortController . signal , onListen } , async request => {
169+ assertEquals ( await request . text ( ) , requestBody ) ;
170+ return new Response ( 'OK' ) ;
171+ } ) ;
172+ await p ;
173+
174+ const response = await fetch ( `http://localhost:${ server . addr . port } /test` , {
175+ method : 'POST' ,
176+ headers : { 'content-type' : 'text/plain' } ,
177+ body : requestBody ,
178+ } ) ;
179+ assertEquals ( await response . text ( ) , 'OK' ) ;
180+
181+ abortController . abort ( ) ;
182+ await server . finished ;
183+
184+ assertEquals ( transactionEvents . length , 1 ) ;
185+ assertEquals ( transactionEvents [ 0 ] ?. request ?. data , `${ 'a' . repeat ( 997 ) } ...` ) ;
186+ } ) ;
187+
188+ Deno . test ( 'Deno.serve should honor explicit none when incoming request bodies are enabled' , async ( ) => {
189+ resetGlobals ( ) ;
190+ const transactionEvents : TransactionEvent [ ] = [ ] ;
191+
192+ init ( {
193+ dsn : 'https://username@domain/123' ,
194+ tracesSampleRate : 1 ,
195+ traceLifecycle : 'static' ,
196+ dataCollection : { httpBodies : [ 'incomingRequest' ] } ,
197+ integrations : integrations => [
198+ ...integrations . filter ( integration => integration . name !== 'DenoServe' ) ,
199+ denoServeIntegration ( { maxRequestBodySize : 'none' } ) ,
200+ ] ,
201+ beforeSendTransaction : ( event : TransactionEvent ) => {
202+ transactionEvents . push ( event ) ;
203+ return null ;
204+ } ,
205+ } ) as DenoClient ;
206+
207+ const abortController = new AbortController ( ) ;
208+ let onListen : ( ( _ : unknown ) => void ) | undefined = undefined ;
209+ const p = new Promise ( resolve => ( onListen = resolve ) ) ;
210+ const server = Deno . serve ( { port : 0 , signal : abortController . signal , onListen } , async request => {
211+ assertEquals ( await request . text ( ) , 'do-not-capture' ) ;
212+ return new Response ( 'OK' ) ;
213+ } ) ;
214+ await p ;
215+
216+ const response = await fetch ( `http://localhost:${ server . addr . port } /test` , {
217+ method : 'POST' ,
218+ headers : { 'content-type' : 'text/plain' } ,
219+ body : 'do-not-capture' ,
220+ } ) ;
221+ assertEquals ( await response . text ( ) , 'OK' ) ;
222+
223+ abortController . abort ( ) ;
224+ await server . finished ;
225+
226+ assertEquals ( transactionEvents . length , 1 ) ;
227+ assertEquals ( transactionEvents [ 0 ] ?. request ?. data , undefined ) ;
228+ } ) ;
229+
68230Deno . test ( 'Deno.serve should isolate context between concurrent requests' , async ( ) => {
69231 resetGlobals ( ) ;
70232 const transactionEvents : TransactionEvent [ ] = [ ] ;
0 commit comments