1 package org.opensrf.net.http;
4 import org.opensrf.util.*;
6 import java.io.IOException;
7 import java.io.BufferedInputStream;
8 import java.io.OutputStreamWriter;
9 import java.io.InputStream;
10 import java.io.IOException;
13 import java.net.HttpURLConnection;
14 import java.lang.StringBuffer;
15 import java.util.List;
16 import java.util.Iterator;
18 import java.util.HashMap;
19 import java.util.Queue;
20 import java.util.concurrent.ConcurrentLinkedQueue;
22 public class GatewayRequest extends HttpRequest {
24 private boolean readComplete;
26 public GatewayRequest(HttpConnection conn, String service, Method method) {
27 super(conn, service, method);
31 public GatewayRequest send() throws java.io.IOException {
32 String postData = compilePostData(service, method);
34 urlConn = (HttpURLConnection) httpConn.url.openConnection();
35 urlConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
36 urlConn.setDoInput(true);
37 urlConn.setDoOutput(true);
39 OutputStreamWriter wr = new OutputStreamWriter(urlConn.getOutputStream());
47 public Object recv() throws java.io.IOException {
54 Object response = nextResponse();
62 * Reads responses from network and populdates responseList.
64 private void readResponses() throws java.io.IOException {
66 InputStream netStream = new BufferedInputStream(urlConn.getInputStream());
67 StringBuffer readBuf = new StringBuffer();
70 byte[] buffer = new byte[1024];
72 while ((bytesRead = netStream.read(buffer)) != -1)
73 readBuf.append(new String(buffer, 0, bytesRead));
78 // parse the JSON response
79 Map<String,?> result = null;
82 result = (Map<String, ?>) new JSONReader(readBuf.toString()).readObject();
84 } catch (org.opensrf.util.JSONException ex) {
85 // if this happens, something is wrong
86 Logger.error("Gateway returned bad data " + ex.getStackTrace());
90 // extract the gateway status value
91 String status = result.get("status").toString();
93 if (!"200".equals(status)) {
95 // throw some new exception
98 // gateway always returns a wrapper array with the full results set
99 responseList = (List) result.get("payload");
102 private String compilePostData(String service, Method method) {
104 StringBuffer postData = new StringBuffer();
106 postData.append("service=");
107 postData.append(service);
108 postData.append("&method=");
109 postData.append(method.getName());
111 List params = method.getParams();
112 Iterator itr = params.iterator();
114 while (itr.hasNext()) {
115 postData.append("¶m=");
116 postData.append(new JSONWriter(itr.next()).write());
121 // not using URLEncoder because it replaces ' ' with '+'.
122 uri = new URI("http", "", null, postData.toString(), null);
124 } catch (java.net.URISyntaxException ex) {
126 // if this happens, something is wrong
127 Logger.error("Error compiling POST data " + ex.getStackTrace());
131 return uri.getRawQuery();