package mediabrowser.apiinteraction.android; import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.Response; import com.android.volley.toolbox.StringRequest; import mediabrowser.apiinteraction.http.HttpHeaders; import mediabrowser.apiinteraction.http.HttpRequest; import mediabrowser.model.extensions.StringHelper; import java.util.HashMap; import java.util.Map; public class VolleyStringRequest extends StringRequest { private HttpRequest request; public VolleyStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener, HttpRequest request) { super(method, url, listener, errorListener); this.request = request; } public VolleyStringRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener, HttpRequest request) { super(url, listener, errorListener); this.request = request; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headers = new HashMap<String,String>(); AddHeaders(headers, request); return headers; } @Override public Map<String, String> getParams() throws AuthFailureError { if (request.getPostData() == null){ super.getParams(); } Map<String, String> data = new HashMap<String,String>(); AddData(data, request); return data; } @Override public String getBodyContentType() { if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(request.getRequestContentType())) { return request.getRequestContentType(); } return super.getBodyContentType(); } @Override /** * Returns the raw POST or PUT body to be sent. * @throws AuthFailureError in the event of auth failure */ public byte[] getBody() throws AuthFailureError { String postContent = request.getRequestContent(); if (postContent == null){ return super.getBody(); } return postContent.getBytes(); } @Override protected com.android.volley.Response<String> parseNetworkResponse(NetworkResponse response) { String contentType = response.headers.get("Content-Type"); // This is a hack to make volley decode in UTF-8 if (StringHelper.EqualsIgnoreCase(contentType, "application/json")) { response.headers.put("Content-Type", contentType + "; charset=UTF-8"); } else if (StringHelper.EqualsIgnoreCase(contentType, "text/plain")) { response.headers.put("Content-Type", contentType + "; charset=UTF-8"); } else if (StringHelper.EqualsIgnoreCase(contentType, "text/vtt")) { response.headers.put("Content-Type", contentType + "; charset=UTF-8"); } return super.parseNetworkResponse(response); } private void AddHeaders(Map<String, String> headers, HttpRequest request) { HttpHeaders requestHeaders = request.getRequestHeaders(); for (String key : requestHeaders.keySet()){ headers.put(key, requestHeaders.get(key)); } if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(request.getRequestContentType())) { headers.put("Content-Type", request.getRequestContentType()); } String parameter = requestHeaders.getAuthorizationParameter(); if (!tangible.DotNetToJavaStringHelper.isNullOrEmpty(parameter)) { String value = requestHeaders.getAuthorizationScheme() + " " + parameter; headers.put("X-Emby-Authorization", value); } } private void AddData(Map<String, String> postParams, HttpRequest request) { if (request.getPostData() == null){ return; } for (String key : request.getPostData().keySet()){ postParams.put(key, request.getPostData().get(key)); } } }