package net.cbaines.suca; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import javax.security.auth.login.LoginException; import org.apache.commons.io.IOUtils; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.cookie.Cookie; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.protocol.HTTP; public class SotonCalendarFetcher { private String username; private char[] password; public SotonCalendarFetcher(String username, char[] password) { this.username = username; this.password = password; // for (int i = 0; i < password.length; i++) { // password[i] = 0; // } } @SuppressWarnings("deprecation") public String fetchAndParseTimetable() throws IOException, LoginException { if (username == null) { throw new RuntimeException("Username null, or method called more than once."); } DefaultHttpClient httpclient = new DefaultHttpClient(); try { HttpGet httpget = new HttpGet("https://www.adminservices.soton.ac.uk/adminweb/servlet/login"); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity(); // System.out.println("Login form get: " + // response.getStatusLine()); // EntityUtils.consume(entity); if (entity != null) { entity.consumeContent(); } // System.out.println("Initial set of cookies:"); List cookies = httpclient.getCookieStore().getCookies(); if (cookies.isEmpty()) { // System.out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { // System.out.println("- " + cookies.get(i).toString()); } } HttpPost httpost = new HttpPost("https://www.adminservices.soton.ac.uk/adminweb/servlet/login"); List nvps = new ArrayList(); System.out.println(username + " " + String.valueOf(password)); nvps.add(new BasicNameValuePair("user", username)); nvps.add(new BasicNameValuePair("pwd", String.valueOf(password))); for (int i = 0; i < password.length; i++) { password[i] = 0; } username = null; httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); response = httpclient.execute(httpost); entity = response.getEntity(); for (Header header : response.getAllHeaders()) { // System.out.println("header: " + header.getName() + " : " + // header.getValue()); } // System.out.println("Login form get: " + // response.getStatusLine()); // EntityUtils.consume(entity); BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); StringBuilder responseBuilder = new StringBuilder(); for (String line; (line = br.readLine()) != null;) { responseBuilder.append(line); } System.out.println("responseBuilder.length() " + responseBuilder.length()); if (responseBuilder.length() != 0) { throw new LoginException("Login failed"); } // System.out.println("Post logon cookies:"); cookies = httpclient.getCookieStore().getCookies(); if (cookies.isEmpty()) { // System.out.println("None"); } else { for (int i = 0; i < cookies.size(); i++) { // System.out.println("- " + cookies.get(i).toString()); } } httpost = new HttpPost( "https://www.adminservices.soton.ac.uk/adminweb/jsp/timetables/timetablesController.jsp?comm=studdisplay&style=+format¶mweeks=1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52"); nvps = new ArrayList(); nvps.add(new BasicNameValuePair("format", "list")); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); response = httpclient.execute(httpost); entity = response.getEntity(); for (Header header : response.getAllHeaders()) { // System.out.println("header: " + header.getName() + " : " + // header.getValue()); } System.out.println("Second post get: " + response.getStatusLine()); // EntityUtils.consume(entity); br = new BufferedReader(new InputStreamReader(entity.getContent())); String line; while ((line = br.readLine()) != null) { // System.out.println(line); } httpost = new HttpPost( "https://www.adminservices.soton.ac.uk/adminweb/jsp/timetables/timetablesController.jsp?comm=studdisplay&style=+format¶mweeks=1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52"); nvps = new ArrayList(); nvps.add(new BasicNameValuePair("format", "list")); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); response = httpclient.execute(httpost); entity = response.getEntity(); for (Header header : response.getAllHeaders()) { // System.out.println("header: " + header.getName() + " : " + // header.getValue()); } System.out.println("Second post get: " + response.getStatusLine()); // EntityUtils.consume(entity); br = new BufferedReader(new InputStreamReader(entity.getContent())); while ((line = br.readLine()) != null) { // Log.v(TAG, line); } httpost = new HttpPost("https://www.adminservices.soton.ac.uk/adminweb/timetables/ttdownload/.csv"); nvps = new ArrayList(); nvps.add(new BasicNameValuePair("format", "list")); httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8)); response = httpclient.execute(httpost); entity = response.getEntity(); String responseString = IOUtils.toString(entity.getContent()); return responseString; } catch (IOException e) { httpclient.getConnectionManager().shutdown(); throw e; } catch (LoginException e) { httpclient.getConnectionManager().shutdown(); throw e; } finally { httpclient.getConnectionManager().shutdown(); } } }