Changeset 13


Ignore:
Timestamp:
Aug 4, 2012 11:56:56 PM (5 years ago)
Author:
psaiteja
Message:

Updated VSN client to work with VSN server. This client codes follows VSNserver redirects and only allows web objects coming from VSN server or the ones satisfying hash match. If the hash does not match, it requests the object through VSN server. I have imposed a restriction that the client code contacts the origin server at most once - to ensure that the user observed latency is not affected much.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • VSNClient/appClientModule/jProxy.java

    r12 r13  
    383383                                                server = new Socket(hostName, hostPort); 
    384384                                                contacted_origin = true; 
     385                                                toVSN = false; 
    385386                                        } else { 
    386387                                                if ((fwdServer.length() > 0) && (fwdPort > 0)) 
     
    391392                                                        server = new Socket(hostName, hostPort); 
    392393                                                        contacted_origin = true; 
     394                                                        toVSN = false; 
    393395                                                } 
    394396                                        } 
     
    452454                                        //responseLength = Array.getLength(response); 
    453455                                //}  else  { 
    454                                         responseLength = streamHTTPData2(serverIn, clientOut,host,url, true,contacted_origin,VSNurldigest,VSNobjectdigest); 
     456                                        responseLength = streamHTTPData2(serverIn, clientOut,host,url, true,toVSN,VSNurldigest,VSNobjectdigest); 
    455457                                         
    456458                                        if(responseLength==-2){ 
     
    466468                                                        redirect_socket = new Socket(hostName, hostPort); 
    467469                                                        contacted_origin = true; 
     470                                                        toVSN = false; 
    468471                                                } catch (Exception e) { 
    469472                                                        e.printStackTrace(); 
     
    477480                                                        redirect_serverOut.flush(); 
    478481                                                         
    479                                                         responseLength = streamHTTPData2(serverIn, clientOut,host,url, true,contacted_origin,VSNurldigest,VSNobjectdigest); 
     482                                                        responseLength = streamHTTPData2(serverIn, clientOut,host,url, true,toVSN,VSNurldigest,VSNobjectdigest); 
    480483                                                } 
     484                                                redirect_socket.close(); 
    481485                                        } 
    482                                          
     486                                        if(responseLength==-3){ 
     487                                                Socket third_socket = null; 
     488                                                try {            
     489                                                        third_socket = new Socket(fwdServer, fwdPort); 
     490                                                        toVSN = true; 
     491                                                } catch (Exception e) { 
     492                                                        e.printStackTrace(); 
     493                                                } 
     494                                                if(third_socket!=null){ 
     495                                                        third_socket.setSoTimeout(socketTimeout); 
     496                                                        BufferedInputStream third_serverIn = new BufferedInputStream(third_socket.getInputStream()); 
     497                                                        BufferedOutputStream third_serverOut = new BufferedOutputStream(third_socket.getOutputStream()); 
     498                                                         
     499                                                        String temp_request = request.toString(); 
     500                                                        vsnrequest.setLength(0); 
     501                                                        while(temp_request.indexOf("\r\n")>=0){ 
     502                                                                String templine = temp_request.substring(0,temp_request.indexOf("\r\n")); 
     503                                                                temp_request = temp_request.substring(temp_request.indexOf("\r\n")+2); 
     504                                                                if(templine.length()!=0){ 
     505                                                                        vsnrequest.append(templine+"\r\n"); 
     506                                                                } 
     507                                                                else{ 
     508                                                                        break; 
     509                                                                } 
     510                                                        } 
     511                                                        vsnrequest.append("VSNContactedOrigin:"+contacted_origin+"\r\n\r\n"); 
     512                                                        vsnrequest.append(temp_request); 
     513                                                         
     514                                                        third_serverOut.write(vsnrequest.toString().getBytes(), 0, vsnrequest.length()); 
     515                                                        third_serverOut.flush(); 
     516                                                         
     517                                                        responseLength = streamHTTPData2(serverIn, clientOut,host,url, true,toVSN,VSNurldigest,VSNobjectdigest); 
     518                                                } 
     519                                                third_socket.close(); 
     520                                        } 
    483521                                } 
    484522                                catch (SocketTimeoutException ste) 
     
    690728         
    691729        private int streamHTTPData2 (InputStream in, OutputStream out,  
    692                                                                         StringBuffer host, StringBuffer url, boolean waitForDisconnect,boolean contacted_origin, 
     730                                                                        StringBuffer host, StringBuffer url, boolean waitForDisconnect,boolean toVSN, 
    693731                                                                        StringBuffer VSNurldigest, StringBuffer VSNobjectdigest) 
    694732        { 
     
    703741                int byteCount = 0; 
    704742                ByteArrayOutputStream bs = new ByteArrayOutputStream(); 
    705                  
     743                String received_urldigest = ""; 
     744                String received_objectdigest = ""; 
    706745                 
    707746                try 
     
    761800                                if (pos >= 0) 
    762801                                        contentType = data.substring(pos + 13).trim(); 
     802                                 
     803                                if(data.toLowerCase().indexOf("VSNurldigest:")>=0) 
     804                                        received_urldigest = data.substring(13).trim(); 
     805                                if(data.toLowerCase().indexOf("VSNobjectdigest:")>=0) 
     806                                        received_objectdigest = data.substring(16).trim(); 
    763807                        } 
    764808                         
     
    766810                        header.append("\r\n"); 
    767811                         
    768                         // convert the header to a byte array, and write it to our stream 
    769                         out.write(header.toString().getBytes(), 0, header.length()); 
     812//                      // convert the header to a byte array, and write it to our stream 
     813//                      out.write(header.toString().getBytes(), 0, header.length()); 
    770814                         
    771815                        // if the header indicated that this was not a 200 response, 
     
    774818                        if ((responseCode != 200) && (contentLength == 0)) 
    775819                        { 
     820                                // convert the header to a byte array, and write it to our stream 
     821                                out.write(header.toString().getBytes(), 0, header.length()); 
    776822                                out.flush(); 
    777823                                return 0; 
    778824                        } 
    779825             
    780                         if(url.toString().contains("youtube")) 
    781                                 System.out.println("YOUTUBE:"+contentType); 
     826                         
    782827                        // get the body, if any; we try to use the Content-Length header to 
    783828                        // determine how much data we're supposed to be getting, because  
     
    786831                        if (contentLength > 0) 
    787832                                waitForDisconnect = false; 
     833                         
     834                        boolean wroteheader = false; 
    788835                         
    789836                        if ((contentLength > 0) || (waitForDisconnect)) 
     
    798845                                                if(contentLength > 0){ 
    799846                                                        if(contentType.toLowerCase().contains("video")){ 
     847                                                                if(!wroteheader){ 
     848                                                                        // convert the header to a byte array, and write it to our stream 
     849                                                                        out.write(header.toString().getBytes(), 0, header.length()); 
     850                                                                        wroteheader = true; 
     851                                                                } 
    800852                                                                out.write(buf, 0, bytesIn); 
    801853                                                                out.flush(); 
     
    803855                                                        else{ 
    804856                                                                bs.write(buf, 0, bytesIn); 
     857                                                                 
     858                                                                if(toVSN){ 
     859                                                                        out.write(buf, 0, bytesIn); 
     860                                                                        out.flush(); 
     861                                                                } 
    805862                                                                 
    806863                                                                if(byteCount>=contentLength){ 
     
    833890                                                                         
    834891                                                                        try {            
    835                                                                                 Statement stmt2 = conn.createStatement(); 
     892                                                                                Statement stmt2 = conn.createStatement();                                                                                
    836893                                                                                ResultSet rs = stmt2.executeQuery("select * from ClientHashlist where UrlHash='"+urldigest+"'"); 
    837                                                                                 int num = 0; 
    838894                                                                                if (rs.next()) { 
    839895                                                                                        System.out.println("ENTRY EXISTS -  UrlHash: " + rs.getString(1) 
    840896                                                                                                        + " ObjectHash:" + rs.getString(2) + " Time:" 
    841897                                                                                                        + rs.getString(3)); 
     898                                                                                        if(toVSN){ 
     899                                                                                                PreparedStatement psUpdate = conn.prepareStatement("UPDATE ClientHashlist SET ObjectHash=?, hashTime=? WHERE UrlHash=?"); 
     900                                                                                                psUpdate.setString(1, objectdigest.toString()); 
     901                                                                                                java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()); 
     902                                                                                                psUpdate.setTimestamp(2, currentTimestamp); 
     903                                                                                                psUpdate.setString(3, urldigest.toString()); 
     904                                                                                                psUpdate.executeUpdate(); 
     905                                                                                        } 
     906                                                                                        else if(rs.getString(2).equalsIgnoreCase(objectdigest.toString())){ 
     907                                                                                                if(!wroteheader){ 
     908                                                                                                        // convert the header to a byte array, and write it to our stream 
     909                                                                                                        out.write(header.toString().getBytes(), 0, header.length()); 
     910                                                                                                        wroteheader = true; 
     911                                                                                                } 
     912                                                                                                out.write(bs.toByteArray(), 0, bs.size()); 
     913                                                                                                out.flush(); 
     914                                                                                        } 
     915                                                                                        else{ 
     916                                                                                                return -3; 
     917                                                                                        } 
    842918                                                                                } else { 
    843                                                                                         PreparedStatement psInsert = conn 
    844                                                                                                         .prepareStatement("insert into ClientHashlist values (?,?,?)"); 
    845  
    846                                                                                         psInsert.setString(1, urldigest.toString()); 
    847                                                                                         psInsert.setString(2, objectdigest.toString()); 
    848                                                                                         java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()); 
    849                                                                                         psInsert.setTimestamp(3, currentTimestamp); 
    850                                                                                         psInsert.executeUpdate(); 
     919                                                                                        if(toVSN){ 
     920                                                                                                PreparedStatement psInsert = conn 
     921                                                                                                                .prepareStatement("insert into ClientHashlist values (?,?,?)"); 
     922 
     923                                                                                                psInsert.setString(1, urldigest.toString()); 
     924                                                                                                psInsert.setString(2, objectdigest.toString()); 
     925                                                                                                java.sql.Timestamp currentTimestamp = new java.sql.Timestamp(Calendar.getInstance().getTime().getTime()); 
     926                                                                                                psInsert.setTimestamp(3, currentTimestamp); 
     927                                                                                                psInsert.executeUpdate(); 
     928                                                                                        } 
    851929                                                                                } 
    852930                                                                                rs.close(); 
    853  
    854                                                                                 /*Statement stmt3 = conn.createStatement(); 
    855                                                                                 rs = stmt3.executeQuery("select * from ClientHashlist"); 
    856                                                                                 num = 0; 
    857                                                                                 while (rs.next()) { 
    858                                                                                         System.out.println(++num + ": UrlHash: " + rs.getString(1) 
    859                                                                                                         + " ObjectHash:" + rs.getString(2) + " Time:" 
    860                                                                                                         + rs.getString(3)); 
    861                                                                                 } 
    862                                                                                 rs.close();*/ 
    863931                                                                        } catch (Exception e) { 
    864932                                                                                e.printStackTrace(); 
    865933                                                                        } 
    866934 
    867                                                                  
    868                                                                 out.write(bs.toByteArray(), 0, bs.size()); 
    869                                                                         out.flush();                             
     935//                                                              if(!toVSN){ 
     936//                                                                      out.write(bs.toByteArray(), 0, bs.size()); 
     937//                                                                              out.flush(); 
     938//                                                              }                                
    870939                                                                } 
    871940                                                        } 
     
    873942                                                } 
    874943                                                else{ 
     944                                                        if(!wroteheader){ 
     945                                                                // convert the header to a byte array, and write it to our stream 
     946                                                                out.write(header.toString().getBytes(), 0, header.length()); 
     947                                                                wroteheader = true; 
     948                                                        } 
    875949                                                        //bs.write(buf, 0, bytesIn); 
    876950                                                        out.write(buf, 0, bytesIn); 
Note: See TracChangeset for help on using the changeset viewer.