/* * Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License, * Version 1.0, and under the Eclipse Public License, Version 1.0 * (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.test.server; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.UUID; import org.h2.util.IOUtils; /** * A simple web browser simulator. */ public class WebClient { private String sessionId; private String acceptLanguage; private String contentType; /** * Open an URL and get the HTML data. * * @param url the HTTP URL * @return the HTML as a string */ String get(String url) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setRequestMethod("GET"); conn.setInstanceFollowRedirects(true); if (acceptLanguage != null) { conn.setRequestProperty("accept-language", acceptLanguage); } conn.connect(); int code = conn.getResponseCode(); contentType = conn.getContentType(); if (code != HttpURLConnection.HTTP_OK) { throw new IOException("Result code: " + code); } InputStream in = conn.getInputStream(); String result = IOUtils.readStringAndClose(new InputStreamReader(in), -1); conn.disconnect(); return result; } /** * Upload a file. * * @param url the target URL * @param fileName the file name to post * @param in the input stream * @return the result */ String upload(String url, String fileName, InputStream in) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection(); conn.setDoOutput(true); conn.setDoInput(true); conn.setUseCaches(false); conn.setRequestMethod("POST"); conn.setRequestProperty("Connection", "Keep-Alive"); String boundary = UUID.randomUUID().toString(); conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); conn.connect(); DataOutputStream out = new DataOutputStream(conn.getOutputStream()); out.writeBytes("--" + boundary + "--\r\n"); out.writeBytes("Content-Disposition: form-data; name=\"upload\";" + " filename=\"" + fileName +"\"\r\n\r\n"); IOUtils.copyAndCloseInput(in, out); out.writeBytes("\r\n--" + boundary + "--\r\n"); out.close(); int code = conn.getResponseCode(); if (code != HttpURLConnection.HTTP_OK) { throw new IOException("Result code: " + code); } in = conn.getInputStream(); String result = IOUtils.readStringAndClose(new InputStreamReader(in), -1); conn.disconnect(); return result; } void setAcceptLanguage(String acceptLanguage) { this.acceptLanguage = acceptLanguage; } String getContentType() { return contentType; } /** * Read the session ID from a URL. * * @param url the URL * @return the session id */ String readSessionId(String url) { int idx = url.indexOf("jsessionid="); String id = url.substring(idx + "jsessionid=".length()); for (int i = 0; i < id.length(); i++) { char ch = id.charAt(i); if (!Character.isLetterOrDigit(ch)) { id = id.substring(0, i); break; } } this.sessionId = id; return id; } /** * Read the specified HTML page. * * @param url the base URL * @param page the page to read * @return the HTML page */ String get(String url, String page) throws IOException { if (sessionId != null) { if (page.indexOf('?') < 0) { page += "?"; } else { page += "&"; } page += "jsessionid=" + sessionId; } if (!url.endsWith("/")) { url += "/"; } url += page; return get(url); } /** * Get the base URL (the host name and port). * * @param url the complete URL * @return the host name and port */ String getBaseUrl(String url) { int idx = url.indexOf("//"); idx = url.indexOf("/", idx + 2); if (idx >= 0) { return url.substring(0, idx); } return url; } }