/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.kanishka.net.commons; import com.kanishka.net.exception.RequestNotComplete; import com.kanishka.net.model.FormData; import com.kanishka.net.model.Header; import com.kanishka.net.model.HttpStatus; import com.kanishka.net.model.MultiPartEntity; import com.kanishka.net.model.RequestMethod; import com.kanishka.net.model.Response; import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntity; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * @author kdkanishka@gmail.com */ public class BasicHTTPRequestImpl implements HTTPRequest { public BasicHTTPRequestImpl() { } @Override public final Response request(final String url, final List<Header> reqHeaders, final List<FormData> formData, final RequestMethod requestMethod, final List<MultiPartEntity> multiParts ) throws RequestNotComplete, IOException { HttpStatus httpStatus = new HttpStatus(); List<Header> respoHeaders = new ArrayList<Header>(); StringBuilder response = new StringBuilder(); Response responseWrapper; URL urlObj = new URL(url); HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection(); conn.setRequestMethod(requestMethod.toString()); setRequestHeaders(reqHeaders, conn); //add multipart entities if (multiParts != null && multiParts.size() > 0) { addMultiparts(multiParts, conn); } else { //add form data to the request addFormData(formData, conn); } //fetch response headers fetchResponseHeaders(respoHeaders, conn); //Get Response try { getResponse(httpStatus, response, conn); } catch (Exception e) { httpStatus.setStatusCode(conn.getResponseCode()); httpStatus.setStatusCode(conn.getResponseCode()); httpStatus.setMessage(conn.getResponseMessage()); throw new RequestNotComplete("Could not complete the request", e, httpStatus); } responseWrapper = new Response(httpStatus.getStatusCode(), response.toString(), respoHeaders); return responseWrapper; } private void getResponse(HttpStatus httpStatus, StringBuilder response, HttpURLConnection conn) throws IOException { InputStream is = conn.getInputStream(); BufferedReader rd = new BufferedReader(new InputStreamReader(is)); String line; while ((line = rd.readLine()) != null) { response.append(line); response.append('\r'); } httpStatus.setStatusCode(conn.getResponseCode()); httpStatus.setStatusCode(conn.getResponseCode()); httpStatus.setMessage(conn.getResponseMessage()); is.close(); rd.close(); conn.disconnect(); } private void fetchResponseHeaders(List<Header> respoHeaders, HttpURLConnection conn) { Map<String, List<String>> rowHeaders = conn.getHeaderFields(); Iterator<String> keys = rowHeaders.keySet().iterator(); while (keys.hasNext()) { String key = keys.next(); List<String> vals = rowHeaders.get(key); if (vals.size() > 0) { respoHeaders.add(new Header(key, vals.get(0))); } } } private void addFormData(List<FormData> formData, HttpURLConnection conn) throws IOException { if (formData != null && formData.size() > 0) { Iterator<FormData> itrFormData = formData.iterator(); StringBuilder content = new StringBuilder(); while (itrFormData.hasNext()) { FormData formDataObj = itrFormData.next(); content.append(URLEncoder.encode(formDataObj.getKey(), "UTF-8")); content.append("="); content.append(URLEncoder.encode(formDataObj.getValue(), "UTF-8")); content.append("&"); } if (content.length() > 0) { conn.setDoOutput(true); //Send request DataOutputStream wr = new DataOutputStream(conn.getOutputStream()); wr.writeBytes(content.toString()); wr.flush(); wr.close(); } } } private void addMultiparts(List<MultiPartEntity> multiParts, HttpURLConnection conn) throws IOException { MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.STRICT); for (MultiPartEntity part : multiParts) { multipartEntity.addPart(part.getPartName(), part.getEntity()); } conn.setDoOutput(true); conn.setRequestProperty("Content-Type", multipartEntity.getContentType().getValue()); //try to write to the output stream of the connection OutputStream outStream = conn.getOutputStream(); multipartEntity.writeTo(outStream); outStream.close(); } private void setRequestHeaders(List<Header> reqHeaders, HttpURLConnection conn) { if (reqHeaders != null && reqHeaders.size() > 0) { Iterator<Header> itrHeaders = reqHeaders.iterator(); while (itrHeaders.hasNext()) { Header reqHdr = itrHeaders.next(); conn.setRequestProperty(reqHdr.getKey(), reqHdr.getValue()); } } } }