1111import com .cloudbees .plugins .credentials .SystemCredentialsProvider ;
1212import com .cloudbees .plugins .credentials .domains .Domain ;
1313import com .cloudbees .plugins .credentials .impl .UsernamePasswordCredentialsImpl ;
14+ import com .sun .net .httpserver .HttpExchange ;
15+ import com .sun .net .httpserver .HttpHandler ;
16+ import com .sun .net .httpserver .HttpServer ;
1417import hudson .model .Item ;
1518import hudson .model .User ;
16- import jakarta .servlet .ServletException ;
17- import jakarta .servlet .http .HttpServletRequest ;
18- import jakarta .servlet .http .HttpServletResponse ;
1919import java .io .IOException ;
20+ import java .io .OutputStream ;
21+ import java .net .HttpURLConnection ;
22+ import java .net .InetAddress ;
23+ import java .net .InetSocketAddress ;
2024import java .net .URI ;
2125import java .net .URL ;
2226import java .nio .charset .StandardCharsets ;
2630import jenkins .model .Jenkins ;
2731import jenkins .security .ApiTokenProperty ;
2832import net .sf .json .JSONObject ;
29- import org .eclipse .jetty .ee9 .servlet .DefaultServlet ;
30- import org .eclipse .jetty .ee9 .servlet .ServletContextHandler ;
31- import org .eclipse .jetty .ee9 .servlet .ServletHolder ;
32- import org .eclipse .jetty .server .Server ;
33- import org .eclipse .jetty .server .ServerConnector ;
3433import org .htmlunit .HttpMethod ;
3534import org .htmlunit .Page ;
3635import org .htmlunit .WebRequest ;
4645@ WithJenkins
4746public class JiraSiteSecurity1029Test {
4847
49- private Server server ;
48+ private HttpServer server ;
5049 private URI serverUri ;
5150 private FakeJiraServlet servlet ;
5251
@@ -240,41 +239,26 @@ void cannotLeakCredentials(JenkinsRule j) throws Exception {
240239 }
241240
242241 public void setupServer (JenkinsRule j ) throws Exception {
243- server = new Server ();
244- ServerConnector connector = new ServerConnector (server );
245242 // auto-bind to available port
246- connector .setPort (0 );
247- server .addConnector (connector );
243+ server = HttpServer .create (new InetSocketAddress (InetAddress .getLoopbackAddress (), 0 ), 0 );
248244
249245 servlet = new FakeJiraServlet (j );
250246
251- ServletContextHandler context = new ServletContextHandler ();
252- ServletHolder servletHolder = new ServletHolder ("default" , servlet );
253- context .addServlet (servletHolder , "/*" );
254- server .setHandler (context );
247+ server .createContext ("/" , servlet );
255248
256249 server .start ();
257250
258- String host = connector .getHost ();
259- if (host == null ) {
260- host = "localhost" ;
261- }
262-
263- int port = connector .getLocalPort ();
264- serverUri = new URI (String .format ("http://%s:%d/" , host , port ));
251+ InetSocketAddress address = server .getAddress ();
252+ serverUri = new URI (String .format ("http://%s:%d/" , address .getHostString (), address .getPort ()));
265253 servlet .setServerUrl (serverUri );
266254 }
267255
268256 @ AfterEach
269- void stopEmbeddedJettyServer () {
270- try {
271- server .stop ();
272- } catch (Exception e ) {
273- e .printStackTrace ();
274- }
257+ void stopEmbeddedHttpServer () {
258+ server .stop (1 );
275259 }
276260
277- private static class FakeJiraServlet extends DefaultServlet {
261+ private static class FakeJiraServlet implements HttpHandler {
278262
279263 private JenkinsRule jenkinsRule ;
280264 private URI serverUri ;
@@ -296,11 +280,10 @@ public String getPasswordAndReset() {
296280 }
297281
298282 @ Override
299- protected void doGet (HttpServletRequest req , HttpServletResponse resp ) throws ServletException , IOException {
300- String path = req .getRequestURL ().toString ();
301- String relativePath = path .substring (this .serverUri .toString ().length ());
283+ public void handle (HttpExchange he ) throws IOException {
284+ String path = he .getRequestURI ().getPath ();
302285
303- String authBasicBase64 = req . getHeader ("Authorization" );
286+ String authBasicBase64 = he . getRequestHeaders (). getFirst ("Authorization" );
304287 String authBase64 = authBasicBase64 .substring ("Basic " .length ());
305288 String auth = new String (Base64 .getDecoder ().decode (authBase64 ), StandardCharsets .UTF_8 );
306289 String [] authArray = auth .split (":" );
@@ -309,14 +292,18 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws Se
309292
310293 this .pwdCollected = pwd ;
311294
312- switch (relativePath ) {
313- case "rest/api/latest/mypermissions" :
314- myPermissions (req , resp );
315- break ;
295+ try {
296+ if ("GET" .equals (he .getRequestMethod ()) && "/rest/api/latest/mypermissions" .equals (path )) {
297+ myPermissions (he );
298+ } else {
299+ he .sendResponseHeaders (HttpURLConnection .HTTP_NOT_FOUND , -1 );
300+ }
301+ } finally {
302+ he .close ();
316303 }
317304 }
318305
319- private void myPermissions (HttpServletRequest req , HttpServletResponse resp ) throws IOException {
306+ private void myPermissions (HttpExchange he ) throws IOException {
320307 Object body = new HashMap <String , Object >() {
321308 {
322309 put ("permissions" , new HashMap <String , Object >() {
@@ -335,7 +322,12 @@ private void myPermissions(HttpServletRequest req, HttpServletResponse resp) thr
335322 }
336323 };
337324
338- resp .getWriter ().write (JSONObject .fromObject (body ).toString ());
325+ String response = JSONObject .fromObject (body ).toString ();
326+ byte [] bytes = response .getBytes (StandardCharsets .UTF_8 );
327+ he .sendResponseHeaders (HttpURLConnection .HTTP_OK , bytes .length );
328+ try (OutputStream os = he .getResponseBody ()) {
329+ os .write (bytes );
330+ }
339331 }
340332 }
341333}
0 commit comments