Advertisement
DanFloyd

ProxyServlet

Apr 3rd, 2014
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.71 KB | None | 0 0
  1.  
  2.  
  3. import java.io.DataOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7. import java.io.StringWriter;
  8. import java.net.HttpURLConnection;
  9. import java.net.MalformedURLException;
  10. import java.net.ProtocolException;
  11. import java.net.URL;
  12.  
  13. import javax.servlet.ServletException;
  14. import javax.servlet.annotation.WebServlet;
  15. import javax.servlet.http.HttpServlet;
  16. import javax.servlet.http.HttpServletRequest;
  17. import javax.servlet.http.HttpServletResponse;
  18. import javax.xml.parsers.DocumentBuilder;
  19. import javax.xml.parsers.DocumentBuilderFactory;
  20. import javax.xml.parsers.ParserConfigurationException;
  21. import javax.xml.transform.Result;
  22. import javax.xml.transform.Transformer;
  23. import javax.xml.transform.TransformerConfigurationException;
  24. import javax.xml.transform.TransformerException;
  25. import javax.xml.transform.TransformerFactory;
  26. import javax.xml.transform.dom.DOMSource;
  27. import javax.xml.transform.stream.StreamResult;
  28.  
  29. import org.w3c.dom.Document;
  30. import org.w3c.dom.Element;
  31. import org.xml.sax.SAXException;
  32.  
  33. /**
  34.  * Servlet implementation class ProxyServlet
  35.  */
  36. @WebServlet("/ProxyServlet")
  37. public class ProxyServlet extends HttpServlet {
  38.     private static final long serialVersionUID = 1L;
  39.        
  40.     /**
  41.      * @see HttpServlet#HttpServlet()
  42.      */
  43.     public ProxyServlet() {
  44.         super();
  45.     }
  46.    
  47.     /**
  48.      * @see HttpServlet#Copy(InputStream in, OutputStream out)
  49.      */
  50.     public void copy(InputStream in, OutputStream out) throws IOException {
  51.         synchronized (in) {
  52.             synchronized (out) {
  53.                 byte[] buffer = new byte[256];
  54.                 while (true) {
  55.                     int bytesRead = in.read(buffer);
  56.                     if (bytesRead == -1) break;
  57.                     out.write(buffer, 0, bytesRead);
  58.                 }
  59.             }
  60.         }
  61.     }
  62.  
  63.     /**
  64.      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  65.      */
  66.     protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  67.         // UNUSED
  68.     }
  69.  
  70.     /**
  71.      * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  72.      */
  73.     protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
  74.        
  75.         /*** INOLTRO CLIENT -> SERVER ***/
  76.        
  77.         // Creo lo stream della richiesta, contenente la stringa XML da passare al parser
  78.         InputStream streamReq = req.getInputStream();
  79.        
  80.         // Controllo la correttezza del contenuto verificando la corrispondenza dei content-type
  81.         String type = req.getHeader("Content-type");
  82.         if(type.equals("text/xml")){
  83.             res.sendError(400);
  84.             return;
  85.         }
  86.        
  87.         // Creo e inizializzo le factory per creare docs
  88.         DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
  89.         dbFactory.setNamespaceAware(true);
  90.         DocumentBuilder documentBuilder;
  91.         try {
  92.             documentBuilder = dbFactory.newDocumentBuilder();
  93.         } catch (ParserConfigurationException e) {
  94.             e.printStackTrace();
  95.             res.sendError(501);
  96.             return;
  97.         }
  98.        
  99.         // Creo il documento dove inserisco direttamente il parsing della richiesta
  100.         Document parsedReq = null;
  101.         try {
  102.             parsedReq = documentBuilder.parse(streamReq);
  103.         } catch (SAXException e1) {
  104.             e1.printStackTrace();
  105.             res.sendError(501);
  106.             return;
  107.         } catch (IOException e1) {
  108.             e1.printStackTrace();
  109.             res.sendError(501);
  110.             return;
  111.         }
  112.        
  113.         // Estraggo la root contenente il tipo di richiesta
  114.         Element root = parsedReq.getDocumentElement();
  115.         String strReq = root.getNodeName();
  116.        
  117.         // Costruisco la URL con la richiesta estratta dalla root del doc
  118.         String url = "http://svcs.ebay.com/services/search/FindingService/v1?SECURITY-APPNAME=INSERISCI_LA_TUA_APPID&OPERATION-NAME=" + strReq;
  119.         URL ebayFindingService;
  120.         try {
  121.             ebayFindingService = new URL(url);
  122.         } catch (MalformedURLException e) {
  123.             e.printStackTrace();
  124.             res.sendError(400);
  125.             return;
  126.         }
  127.        
  128.         // Creo e configuro il transformer per impacchettare correttamente un doc in una stringa XML
  129.         TransformerFactory transFactory =TransformerFactory.newInstance();
  130.         Transformer transformer;
  131.         try {
  132.             transformer = transFactory.newTransformer();
  133.         } catch (TransformerConfigurationException e) {
  134.             e.printStackTrace();
  135.             res.sendError(501);
  136.             return;
  137.         }
  138.        
  139.         // Partendo dal doc creo la sorgente da cui attingerà il transformer
  140.         DOMSource source = new DOMSource(parsedReq);
  141.        
  142.         // Creo un nuovo output stream che raccoglie i dati trasformati e li impacchetta in stringa XML
  143.         StringWriter sWriter = new StringWriter();
  144.         Result result = new StreamResult(sWriter);
  145.        
  146.         // Effettuo la trasformazione vera e propria
  147.         try {
  148.             transformer.transform(source, result);
  149.         } catch (TransformerException e) {
  150.             e.printStackTrace();
  151.             res.sendError(501);
  152.             return;
  153.         }
  154.        
  155.         String trStr = sWriter.toString();
  156.        
  157.         // Creo una nuova connessione tramite HTTP
  158.         HttpURLConnection con = null;
  159.         try {
  160.             con = (HttpURLConnection) ebayFindingService.openConnection();
  161.         } catch (IOException e) {
  162.             res.sendError(501);
  163.             e.printStackTrace();
  164.             return;
  165.         }
  166.        
  167.         // Imposto la connessione specificando POST come metodo di richiesta
  168.         try {
  169.             con.setRequestMethod("POST");
  170.         } catch (ProtocolException e) {
  171.             res.sendError(501);
  172.             e.printStackTrace();
  173.             return;
  174.         }
  175.        
  176.         // Abilito la connessione a scrivere dati in output ed a riceverne in input
  177.         con.setDoOutput(true);
  178.         con.setDoInput(true);
  179.        
  180.         // Imposto il nuovo header per la connessione verso i servizi
  181.         con.setRequestProperty("Content-Type","text/xml");
  182.        
  183.         // Creo un nuovo streamOutput in cui scrivo la richiesta da inviare, poi lo resetto e lo chiudo
  184.         DataOutputStream wr=null;
  185.         try {
  186.             wr = new DataOutputStream(con.getOutputStream());
  187.         } catch (IOException e) {
  188.             e.printStackTrace();
  189.             res.sendError(501);
  190.             return;
  191.         }
  192.  
  193.         try {
  194.             wr.writeBytes(trStr);
  195.         } catch (IOException e) {
  196.             e.printStackTrace();
  197.             res.sendError(501);
  198.             return;
  199.         }
  200.        
  201.         try {
  202.             wr.flush();
  203.             wr.close();
  204.         } catch (IOException e) {
  205.             e.printStackTrace();
  206.             res.sendError(501);
  207.             return;
  208.         }
  209.        
  210.         System.out.println(trStr);
  211.        
  212.        
  213.         /*** INOLTRO SERVER -> CLIENT ***/
  214.        
  215.         // Ricavo l'esito della connessione dal server
  216.         int esitoHTTP = con.getResponseCode();     
  217.        
  218.         // Ricavo il content Type della risposta
  219.         String contentTypeRisposta = con.getContentType();
  220.        
  221.         // Creo uno inputStream dove inserisco la risposta del server
  222.         InputStream streamRisposta = null;
  223.         if(esitoHTTP<300)
  224.             streamRisposta = con.getInputStream();
  225.         else
  226.             streamRisposta = con.getErrorStream();
  227.        
  228.         // Inoltro tutte le informazioni al client
  229.         res.setStatus(esitoHTTP);
  230.         res.setContentType(contentTypeRisposta);
  231.         copy(streamRisposta, res.getOutputStream());
  232.        
  233.     }
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement