package com.koushikdutta.async.http; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.apache.http.NameValuePair; import org.apache.http.message.BasicNameValuePair; import android.net.Uri; import com.koushikdutta.async.ByteBufferList; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.Util; import com.koushikdutta.async.callback.CompletedCallback; public class UrlEncodedFormBody implements AsyncHttpRequestBody { private Iterable<NameValuePair> mParameters; private byte[] mBodyBytes; public UrlEncodedFormBody(Iterable<NameValuePair> parameters) { mParameters = parameters; buildData(); } private void buildData() { boolean first = true; StringBuilder b = new StringBuilder(); for (NameValuePair pair: mParameters) { if (!first) b.append('&'); first = false; b.append(URLEncoder.encode(pair.getName())); b.append('='); b.append(URLEncoder.encode(pair.getValue())); } try { mBodyBytes = b.toString().getBytes("ISO-8859-1"); } catch (UnsupportedEncodingException e) { } } @Override public void write(AsyncHttpRequest request, final AsyncHttpResponse response) { Util.writeAll(response, mBodyBytes, new CompletedCallback() { @Override public void onCompleted(Exception ex) { // response.end(); } }); } public static final String CONTENT_TYPE = "application/x-www-form-urlencoded"; @Override public String getContentType() { return CONTENT_TYPE; } private ByteBufferList data; @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { if (data == null) data = new ByteBufferList(); data.add(bb); bb.clear(); } public static Map<String, String> parse(String data) { HashMap<String, String> map = new HashMap<String, String>(); String[] pairs = data.split("&"); for (String p : pairs) { String[] pair = p.split("=", 2); if (pair.length == 0) continue; String name = Uri.decode(pair[0]); String value = null; if (pair.length == 2) value = Uri.decode(pair[1]); map.put(name, value); } return Collections.unmodifiableMap(map); } public Iterable<NameValuePair> getParameters() { if (mParameters == null && data != null) { ArrayList<NameValuePair> params; mParameters = params = new ArrayList<NameValuePair>(); String[] pairs = data.peekString().split("&"); for (String p : pairs) { String[] pair = p.split("=", 2); if (pair.length == 0) continue; String name = Uri.decode(pair[0]); String value = null; if (pair.length == 2) value = Uri.decode(pair[1]); params.add(new BasicNameValuePair(name, value)); } } return mParameters; } public Map<String, String> getParameterMap() { HashMap<String, String> map = new HashMap<String, String>(); for (NameValuePair pair: getParameters()) { if (!map.containsKey(pair.getName())) map.put(pair.getName(), pair.getValue()); } return Collections.unmodifiableMap(map); } public UrlEncodedFormBody() { } @Override public boolean readFullyOnRequest() { return true; } @Override public int length() { return mBodyBytes.length; } }