Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   This is free and unencumbered software released into the public domain.
  
   Anyone is free to copy, modify, publish, use, compile, sell, or
   distribute this software, either in source code form or as a compiled
   binary, for any purpose, commercial or non-commercial, and by any
   means.
  
   In jurisdictions that recognize copyright laws, the author or authors
  of this software dedicate any and all copyright interest in the
  software to the public domain. We make this dedication for the benefit
  of the public at large and to the detriment of our heirs and
  successors. We intend this dedication to be an overt act of
  relinquishment in perpetuity of all present and future rights to this
  software under copyright law.
 
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  OTHER DEALINGS IN THE SOFTWARE.
  */
 package base.minibrowser;
 
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
Very basic easy to use HTTP client, useful for getting quick simple tasks supports most basic HTTP1.0 transactions.
 
 public class MiniBrowser {
 
 	public int debug = 0;
 	private int serverPort;
 	private int serverProtocol;
 	private String serverHostname;
 	private String serverPath;
 	private CookieHandler c;
 
 	public long connectTime;
 	public long receiveTime;
 
 	public static final String LINE_END = "\r\n";
 
 	public static final int DEFAULT_HTTP_PORT = 80;
 	public static final int DEFAULT_HTTPS_PORT = 443;
 
 	private static String[] useragents = {
 		"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0;)",
 		"Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.1)",
 		"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
 		"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1",
 		"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-AU; rv:1.8.0.1) Gecko/20060111 Firefox/1.5.0.1",
 		"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)",
 		"Mozilla/4.8 [en] (Windows NT 5.0; U)",
 		"Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/412 (KHTML, like Gecko) Safari/412",
 		"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8) Gecko/20060321 Firefox/2.0a1",
 		"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.74.9 (KHTML, like Gecko) Version/7.0.2 Safari/537.74.9",
 		"Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36",
 		"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.17 Safari/537.36",
 		"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1464.0 Safari/537.36",
 		"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0",
 		"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:24.0) Gecko/20100101 Firefox/24.0",
 		"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
 		"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/4.0; InfoPath.2; SV1; .NET CLR 2.0.50727; WOW64)",
 		"Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
 		"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; chromeframe/11.0.696.57)",
 		"Mozilla/5.0 (Windows NT 6.0; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.14",
 		"Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
 		"Opera/12.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.02",
 		"Mozilla/5.0(iPad; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314 Safari/531.21.10",
 		"Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g",
 		"Mozilla/5.0 (iPad; U; CPU OS OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10",
 		"Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53",
 		"Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_4 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10B350 Safari/8536.25",
 		"Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",
 		"Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Mobile/11A465"
 	};
	private String userAgent;
	private boolean randomUserAgent = false;
	private Random r;
Initialise an instance of a mini browser. Selects a user agent string from the pre-defined list of possible user agents.
	public MiniBrowser() {
		 = new Random(); // No need to use secure random.
		 = new CookieHandler();
		 = SSLSocketFactory.getDefault();
	}

Include this custom request header in all future requests.

Parameters:
header
value
	public void setCustomRequestHeader(String headerString value) {
		if( == null) {
		}
		.put(headervalue);
	}

Allows changing which SSL socket factory should be used for SSL connections, primarily this is useful for adding a factory that trusts invalid certificates.
	public void setSSLSocketFactory(SocketFactory factory) {
		 = factory;
	}

Inform the browser to use a different user agent string for each new HTTP request.

Parameters:
r When true, different user agents will be used for each HTTP request
	public void randomizeUseragent(boolean r) {
	}
	public void setUserAgent(String userAgent) {
		this. = userAgent;
	}
Retrieve the user agent string currently being used. Note that if the user agent string is randomised this will be different each time it is called.

	public String getUserAgent() {
		}
		return ;
	}

Get the CookieHandler for the browser, allowing inspection of cookies currently stored in the browser.
		return ;
	}
	public boolean parseURL(String url) {
		Pattern u = Pattern.compile("(https?)://([^/: ]+)([0-9:]*)([^ ]*)".);
		Matcher matcher = u.matcher(url);
		if(matcher.find()) {
			if(matcher.group(1).equals("http")) {
else {
			}
			 = matcher.group(2);
			if(!matcher.group(3).equals("")) {
				 = Integer.parseInt(matcher.group(3).substring(1));
			}
			 = matcher.group(4);
			return true;
		}
		return false;
	}
	public HeaderInfo get(String urlthrows IOExceptionInvalidURL {
		return fetch(urlnullnull, 0);
	}
	public HeaderInfo post(String urlMap<StringStringvaluesthrows IOExceptionInvalidURL {
		return fetch(urlvaluesnull, 0);
	}
	public HeaderInfo post(String urlMap<StringStringvaluesMap<StringStringfilesthrows IOExceptionInvalidURL {
		return fetch(urlvaluesfiles, 0);
	}
	private HeaderInfo fetch(String urlMap<StringStringvaluesMap<StringStringfilesint depththrows IOExceptionInvalidURL {
		//NB: Should check for deep recursion
		if(depth > 5) {
			throw new RedirectLimitReached();
		}
		if(!parseURL(url)) {
			throw new InvalidURL();
		}
		return getLink(valuesfilesdepth);
	}
	private HeaderInfo getLink(Map<StringStringvaluesMap<StringStringfilesint depththrows IOExceptionInvalidURL {
		StringBuffer headers = new StringBuffer();
		StringBuffer data = new StringBuffer();
		long start = 0;
		if( > 4) {
			..println("Connecting to " +  + ":" +  + " uri:" + );
		}
		start = new Date().getTime();
		try {
			if( == 1) {
else {
			}
catch(ConnectException e) {
			throw e;
		}
		 = new Date().getTime() - start;
		StringBuffer requestHeader = new StringBuffer("");
		String requestPath = null;
		if( == 1) {
			requestPath = "https://" +  + ":" + +;
else {
				requestPath = "http://" +  + ":" + +;
else {
				requestPath = ;
			}
		}
		/*
		 * Write the HTTP request header
		 */
		if(values != null) {
			requestHeader.append("POST " + requestPath + " HTTP/1.0" + );
else {
			requestHeader.append("GET " + requestPath + " HTTP/1.0" + );
		}
		requestHeader.append("User-Agent: " + getUserAgent() + );
		requestHeader.append("Accept: */*" + );
		if( != null) {
			for(String header : .keySet()) {
				requestHeader.append(header);
				requestHeader.append(": ");
				requestHeader.append(.get(header));
				requestHeader.append();
			}
		}
			requestHeader.append("Host: " +  + ":" +  + );
else {
			requestHeader.append("Host: " +  + );
		}
		if(.getCookies() != null) {
			requestHeader.append(.getCookies());
		}
		if( > 4) {
			..print("----\n" + requestHeader);
		}
		o.writeBytes(requestHeader.toString());
		requestHeader = new StringBuffer();
		/*
		 * Write any form variables and/or attached files
		 */
		if(files == null || files.size() == 0) {
			/* Write any from variables not using multipart/mime format */
			StringBuffer vars = new StringBuffer("");
			if(values != null) {
				for(Iterator<Stringe = values.keySet().iterator(); e.hasNext();) {
					if(!vars.toString().equals("")) {
						vars.append("&");
					}
					String name = e.next();
					vars.append(URLEncoder.encode(name"UTF-8"));
					vars.append("=");
					vars.append(URLEncoder.encode(values.get(name), "UTF-8"));
				}
				requestHeader.append("Content-type: application/x-www-form-urlencoded" + );
				requestHeader.append("Content-length: " + vars.length() + );
			}
			if( > 4) {
				..println(requestHeader + "----\n");
			}
			o.writeBytes(requestHeader.toString());
			if(values != null) {
			}
			o.flush();
else {
			/* Write any from variables in multipart/mime format */
			List<MultipartItemitems = new ArrayList<>();
			for(Iterator<Stringe = values.keySet().iterator(); e.hasNext();) {
				String name = e.next();
				items.add(new MultipartItem(namevalues.get(name), false));
			}
			for(Iterator<Stringe = files.keySet().iterator(); e.hasNext();) {
				String name = e.next();
				items.add(new MultipartItem(namefiles.get(name), true));
			}
			long size = 0;
			String boundary = "----WebKitFormBoundaryjOA9TTPzAT0ArlWB";
			for(MultipartItem item : items) {
				size += item.calculateSize(boundary);
			}
			size += boundary.length() + 4 + .length();
			requestHeader.append("Content-type: multipart/form-data; boundary=" + boundary + );
			requestHeader.append("Content-length: " + size + );
			if( > 4) {
				..println(requestHeader+"----\n");
			}
			o.writeBytes(requestHeader.toString());
			for(MultipartItem item : items) {
				item.write(boundaryo);
			}
			o.writeBytes("--");
			o.writeBytes(boundary);
			o.writeBytes("--" + );
		}
		/*
		 * Read the response from the server
		 */
		if( > 4) {
			..println("----\n");
		}
		while((l = i.readLine()) != null) {
			if(l.equals("")) {
				break;
			}
			headers.append(l + );
			if( > 4) {
			}
		}
		if( > 4) {
			..println("----\n");
		}
		try {
			h = new HeaderInfo(headers.toString());
catch(Exception e) {
			throw new IOException("Problem processing HTTP response."e);
		}
		while((l = i.readLine()) != null) {
			data.append(l + );
		}
		s.close();
		 = new Date().getTime() - start;
		if(h.status == 301 || h.status == 302 || h.status == 307) {
			if( > 1) {
				..println("Redirect in progress");
			}
			if(!parseURL(h.getValue("location"))) {
				if( > 0) {
					..println("Invalid redirect from server.");
				}
				throw new InvalidRedirectURL();
			}
			if( > 2) {
				..println("Redirect url " + h.getValue("location"));
			}
			return fetch(h.getValue("location"), valuesfilesdepth + 1);
		}
		h.content = data.toString();
		return h;
	}
An exception occurred attempting to process a redirect URL included in the HTTP response message.
class InvalidRedirectURL extends IOException { private static final long serialVersionUID = 1L; }

Web server sent us on sequence of HTTP redirects, greater than the maximum number of redirects we allow. This prevents redirect loops.
class RedirectLimitReached extends IOException { private static final long serialVersionUID = 1L; }


New to GrepCode? Check out our FAQ X