66import org .kohsuke .github .authorization .AuthorizationProvider ;
77import org .kohsuke .github .authorization .UserAuthorizationProvider ;
88import org .kohsuke .github .connector .GitHubConnector ;
9+ import org .kohsuke .github .connector .GitHubConnectorRequest ;
910import org .kohsuke .github .connector .GitHubConnectorResponse ;
1011import org .kohsuke .github .function .BodyHandler ;
1112
@@ -368,24 +369,26 @@ public <T> GitHubResponse<T> sendRequest(@Nonnull GitHubRequest.Builder<?> build
368369 public <T > GitHubResponse <T > sendRequest (GitHubRequest request , @ CheckForNull BodyHandler <T > handler )
369370 throws IOException {
370371 int retries = CONNECTION_ERROR_RETRIES ;
371- request = prepareRequest (request );
372+ GitHubConnectorRequest connectorRequest = prepareConnectorRequest (request );
373+
372374 do {
373375 // if we fail to create a connection we do not retry and we do not wrap
374376
375377 GitHubConnectorResponse connectorResponse = null ;
376378 try {
377379 try {
378- logRequest (request );
380+ logRequest (connectorRequest );
379381 rateLimitChecker .checkRateLimit (this , request .rateLimitTarget ());
380- connectorResponse = connector .send (request );
382+ connectorResponse = connector .send (connectorRequest );
381383 noteRateLimit (request .rateLimitTarget (), connectorResponse );
382384 detectOTPRequired (connectorResponse );
383385
384386 if (isInvalidCached404Response (connectorResponse )) {
385387 // Setting "Cache-Control" to "no-cache" stops the cache from supplying
386388 // "If-Modified-Since" or "If-None-Match" values.
387389 // This makes GitHub give us current data (not incorrectly cached data)
388- request = request .toBuilder ().setHeader ("Cache-Control" , "no-cache" ).build ();
390+ connectorRequest = prepareConnectorRequest (
391+ request .toBuilder ().setHeader ("Cache-Control" , "no-cache" ).build ());
389392 continue ;
390393 }
391394 if (!(isRateLimitResponse (connectorResponse ) || isAbuseLimitResponse (connectorResponse ))) {
@@ -397,7 +400,7 @@ public <T> GitHubResponse<T> sendRequest(GitHubRequest request, @CheckForNull Bo
397400 continue ;
398401 }
399402
400- throw interpretApiError (e , request , connectorResponse );
403+ throw interpretApiError (e , connectorRequest , connectorResponse );
401404 }
402405
403406 handleLimitingErrors (connectorResponse );
@@ -410,7 +413,7 @@ public <T> GitHubResponse<T> sendRequest(GitHubRequest request, @CheckForNull Bo
410413 throw new GHIOException ("Ran out of retries for URL: " + request .url ().toString ());
411414 }
412415
413- private GitHubRequest prepareRequest (GitHubRequest request ) throws IOException {
416+ private GitHubConnectorRequest prepareConnectorRequest (GitHubRequest request ) throws IOException {
414417 GitHubRequest .Builder <?> builder = request .toBuilder ();
415418 // if the authentication is needed but no credential is given, try it anyway (so that some calls
416419 // that do work with anonymous access in the reduced form should still work.)
@@ -442,7 +445,7 @@ private GitHubRequest prepareRequest(GitHubRequest request) throws IOException {
442445 return builder .build ();
443446 }
444447
445- private void logRequest (@ Nonnull final GitHubRequest request ) {
448+ private void logRequest (@ Nonnull final GitHubConnectorRequest request ) {
446449 LOGGER .log (FINE ,
447450 () -> "GitHub API request [" + (getLogin () == null ? "anonymous" : getLogin ()) + "]: "
448451 + request .method () + " " + request .url ().toString ());
@@ -471,7 +474,7 @@ private static <T> GitHubResponse<T> createResponse(@Nonnull GitHubConnectorResp
471474 // workflow run cancellation - See https://docs.github.com/en/rest/reference/actions#cancel-a-workflow-run
472475
473476 LOGGER .log (FINE ,
474- "Received HTTP_ACCEPTED(202) from " + connectorResponse .url ().toString ()
477+ "Received HTTP_ACCEPTED(202) from " + connectorResponse .request (). url ().toString ()
475478 + " . Please try again in 5 seconds." );
476479 } else if (handler != null ) {
477480 body = handler .apply (connectorResponse );
@@ -483,7 +486,7 @@ private static <T> GitHubResponse<T> createResponse(@Nonnull GitHubConnectorResp
483486 * Handle API error by either throwing it or by returning normally to retry.
484487 */
485488 private static IOException interpretApiError (IOException e ,
486- @ Nonnull GitHubRequest request ,
489+ @ Nonnull GitHubConnectorRequest connectorRequest ,
487490 @ CheckForNull GitHubConnectorResponse connectorResponse ) throws IOException {
488491 // If we're already throwing a GHIOException, pass through
489492 if (e instanceof GHIOException ) {
@@ -508,12 +511,12 @@ private static IOException interpretApiError(IOException e,
508511 e = new GHFileNotFoundException (e .getMessage () + " " + errorMessage , e )
509512 .withResponseHeaderFields (headers );
510513 } else if (statusCode >= 0 ) {
511- e = new HttpException (errorMessage , statusCode , message , request .url ().toString (), e );
514+ e = new HttpException (errorMessage , statusCode , message , connectorRequest .url ().toString (), e );
512515 } else {
513516 e = new GHIOException (errorMessage ).withResponseHeaderFields (headers );
514517 }
515518 } else if (!(e instanceof FileNotFoundException )) {
516- e = new HttpException (statusCode , message , request .url ().toString (), e );
519+ e = new HttpException (statusCode , message , connectorRequest .url ().toString (), e );
517520 }
518521 return e ;
519522 }
@@ -548,7 +551,7 @@ private static boolean retryConnectionError(IOException e, URL url, int retries)
548551
549552 private static boolean isInvalidCached404Response (GitHubConnectorResponse connectorResponse ) {
550553 // WORKAROUND FOR ISSUE #669:
551- // When the Requester detects a 404 response with an ETag (only happpens when the server's 304
554+ // When the Requester detects a 404 response with an ETag (only happens when the server's 304
552555 // is bogus and would cause cache corruption), try the query again with new request header
553556 // that forces the server to not return 304 and return new data instead.
554557 //
@@ -561,7 +564,7 @@ private static boolean isInvalidCached404Response(GitHubConnectorResponse connec
561564 && connectorResponse .header ("ETag" ) != null
562565 && !Objects .equals (connectorResponse .request ().header ("Cache-Control" ), "no-cache" )) {
563566 LOGGER .log (FINE ,
564- "Encountered GitHub invalid cached 404 from " + connectorResponse .url ()
567+ "Encountered GitHub invalid cached 404 from " + connectorResponse .request (). url ()
565568 + ". Retrying with \" Cache-Control\" =\" no-cache\" ..." );
566569 return true ;
567570 }
@@ -735,7 +738,11 @@ static ObjectReader getMappingObjectReader(@CheckForNull GitHubConnectorResponse
735738
736739 if (connectorResponse != null ) {
737740 injected .put (GitHubConnectorResponse .class .getName (), connectorResponse );
738- injected .putAll (connectorResponse .request ().injectedMappingValues ());
741+ GitHubConnectorRequest request = connectorResponse .request ();
742+ // This is cheating, but it is an acceptable cheat for now.
743+ if (request instanceof GitHubRequest ) {
744+ injected .putAll (((GitHubRequest ) connectorResponse .request ()).injectedMappingValues ());
745+ }
739746 }
740747 return MAPPER .reader (new InjectableValues .Std (injected ));
741748 }
0 commit comments