jetty / jetty.project

Eclipse Jetty® - Web Container & Clients - supports HTTP/2, HTTP/1.1, HTTP/1.0, websocket, servlets, and more
https://eclipse.dev/jetty
Other
3.85k stars 1.91k forks source link

Suggest the alternative of the Some methods which does't support jetty12 #12157

Open johmn123-wq opened 1 month ago

johmn123-wq commented 1 month ago

Jetty version(s) migration from Jetty 11.0.x to Jetty 12.0.x

Jetty Environment Applicable for jetty-12 ee10

Java version/vendor (use: java -version) Java17

OS type/version

Description Here is the code for 11.0.x

public class ApacheServerHandler extends AbstractHandler{

   private ApacheServerHandler(){
       client = HttpClients.createDeafult();
   }

@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

  String newHost = request.getHeader('sb_host');
 if(newHost.endsWith("/")){
     newHost  = StringUtils.substring(newHost, 0, newHost.length() - 1);  
  }

HttpUriRequest = null;
String method = request.getMethod();
String queryString = getQueryString(baseRequest);
String path = baseRequest.getPathInfo();
Enumeration<String>headers = request.getHeaderNames();

String newUrl = String.format("http://%s%s", newHost, path, queryString);

if("GET".equalsIgnoreCase(method){
  uriRequest = new HttpGet(newUrl);
}
else if("POST".equalsIgnoreCase(method){
  uriRequest = new HttpPost(newUrl);
}
else if("PUT".equalsIgnoreCase(method){
  uriRequest = new HttpPut(newUrl);
}
else{
  baseRequest.setHandled(false);
}

if(uriRequest instanceof HttpEntityEncloseingRequest){
  HttpEntityEnclosingRequest entityRequest = (HttpEntityEnclosingRequest) uriRequest;
  entityRequest.setEntity(new InputStreamEntity(request.getInputStream()));
}

while(headers.hasMoreElements()){
    String headerName = headers.nextElement();
    if(headerName.equalIgnoreCase('Content-length'))
       continue;
    uriRequest.addHeader(headerName, baseRequest.getHeader(headerName));

    try(ClosableHttpResponse resp = client.execute(uriRequest)){
         for(Header header: resp.getAllHeaders){
                response.addHeader(header.getName(), header.getValue());
         } 
         String body = EntityUtils.toString(resp.getEntity());
         reponse.getOutputStream().write(body.getBytes())
   }

  baseRequest.setHandled(true);

}

private String getQueryString(Request request){

      String queryString = baseRequest.getQueryString();
      if(queryString == null){
              return "";
       }
      return queryString;
 }

}

Here is the migrated code to jetty12 where getOutStream, setHandled, response.add() etc functions are not supported.

public class ApacheServerHandler extends Handler.Abstract{

private ApacheServerHandler(){ client = HttpClients.createDeafult(); }

@Override public void handle(Request request, Response response, Callback callback) throws IOException, ServletException{

String newHost = request.getHeaders().get('sb_host'); if(newHost.endsWith("/")){ newHost = StringUtils.substring(newHost, 0, newHost.length() - 1);
}

HttpUriRequest = null; String method = request.getMethod(); String queryString = request.getHttpURI().getQuery(); String path = request.getHttpURI().getPath(); Enumerationheaders = request.getHeaders().getFieldNames();

String newUrl = String.format("http://%s%s", newHost, path, queryString);

if("GET".equalsIgnoreCase(method){ uriRequest = new HttpGet(newUrl); } else if("POST".equalsIgnoreCase(method){ uriRequest = new HttpPost(newUrl); } else if("PUT".equalsIgnoreCase(method){ uriRequest = new HttpPut(newUrl); } else{ baseRequest.setHandled(false); }

if(uriRequest instanceof HttpEntityEncloseingRequest){ HttpEntityEnclosingRequest entityRequest = (HttpEntityEnclosingRequest) uriRequest; entityRequest.setEntity(new InputStreamEntity(Request.asInputStream(requrest), ContentType.create(request.getHeaders().getHtHeader.CONTENT_TYPE.asString())))); }

while(headers.hasMoreElements()){ String headerName = headers.nextElement(); if(headerName.equalIgnoreCase('Content-length')) continue; uriRequest.addHeader(headerName, baseRequest.getHeader(headerName));

try(ClosableHttpResponse resp = client.execute(uriRequest)){
     for(Header header: resp.getAllHeaders){
            response.**add**(header.**getName**(), header.**getValue**());
     } catch(ParseException e){
            throw new IOException(e);
 } 

     String body = EntityUtils.toString(resp.getEntity());
     reponse.getOutputStream().write(body.getBytes())

}

baseRequest.setHandled(true); return false;

}

}

sbordet commented 1 month ago

Please, either detail this issue a lot more (and fill in the template), or we are going to close it.

joakime commented 1 month ago

extends AbstractHandler

That doesn't exist on Jetty 12.

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{

That method signature does not exist on Jetty 12.

See: https://jetty.org/docs/jetty/12/programming-guide/migration/11-to-12.html

johmn123-wq commented 1 month ago

below I've added the migrated code. please look once

janbartel commented 1 month ago

@johmn123-wq I think this documentation page on jetty 12 handlers will help you enormously: https://jetty.org/docs/jetty/12/programming-guide/server/http.html#handler