title: How to update the PNR Capcha added in the Indian Railways Site
body: <p>I have a PNR Inquiry app on Google Play. It was working very fine. But recently Indian Railwys added captcha to their PNR Inquiry section and because of this I am not able to pass proper data to the server to get proper response. How to add this captcha in my app in form of an imageview and ask the users to enter captcha details also so that I can send proper data and get proper response.</p>
  
  <p><a href="http://www.indianrail.gov.in/pnr_Enq.html">Indian Railways PNR Inquiry Link</a></p>
  
  <p>Here is my PnrCheck.java which I was using earlier. Please help what modifications should be done here..</p>
  
  <pre><code>import java.io.BufferedReader;
  import java.io.ByteArrayInputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.net.Socket;
  import java.net.URL;
  import java.util.ArrayList;
  import java.util.List;
  
  import org.apache.http.Header;
  import org.apache.http.HttpHost;
  import org.apache.http.HttpResponse;
  import org.apache.http.HttpVersion;
  import org.apache.http.entity.InputStreamEntity;
  import org.apache.http.impl.DefaultHttpClientConnection;
  import org.apache.http.message.BasicHttpEntityEnclosingRequest;
  import org.apache.http.params.BasicHttpParams;
  import org.apache.http.params.HttpParams;
  import org.apache.http.params.HttpProtocolParams;
  import org.apache.http.protocol.BasicHttpContext;
  import org.apache.http.protocol.BasicHttpProcessor;
  import org.apache.http.protocol.ExecutionContext;
  import org.apache.http.protocol.HttpContext;
  import org.apache.http.protocol.HttpRequestExecutor;
  import org.apache.http.protocol.RequestConnControl;
  import org.apache.http.protocol.RequestContent;
  import org.apache.http.protocol.RequestExpectContinue;
  import org.apache.http.protocol.RequestTargetHost;
  import org.apache.http.protocol.RequestUserAgent;
  import org.apache.http.util.EntityUtils;
  
  public class PNRStatusCheck {
      public static void main(String args[]) {
          try {
              String pnr1 = "1154177041";
              String reqStr = "lccp_pnrno1=" + pnr1 + "&amp;submitpnr=Get+Status";
              PNRStatusCheck check = new PNRStatusCheck();
              StringBuffer data = check.getPNRResponse(reqStr, "http://www.indianrail.gov.in/cgi_bin/inet_pnrstat_cgi.cgi");
              if(data != null) {
                  @SuppressWarnings("unused")
                  PNRStatus pnr = check.parseHtml(data);
              }
          } catch(Exception e) {
              e.printStackTrace();
          }
      }
  
      public StringBuffer getPNRResponse(String reqStr, String urlAddr) throws Exception {
          String urlHost = null;
          int port;
          String method = null;
          try {
              URL url = new URL(urlAddr);
              urlHost = url.getHost();
              port = url.getPort();
              method = url.getFile();
  
              // validate port
              if(port == -1) {
                  port = url.getDefaultPort();
              }
          } catch(Exception e) {
              e.printStackTrace();
              throw new Exception(e);
          }
  
          HttpParams params = new BasicHttpParams();
          HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
          HttpProtocolParams.setContentCharset(params, "UTF-8");
          HttpProtocolParams.setUserAgent(params, "HttpComponents/1.1");
          HttpProtocolParams.setUseExpectContinue(params, true);
  
          BasicHttpProcessor httpproc = new BasicHttpProcessor();
          // Required protocol interceptors
          httpproc.addInterceptor(new RequestContent());
          httpproc.addInterceptor(new RequestTargetHost());
          // Recommended protocol interceptors
          httpproc.addInterceptor(new RequestConnControl());
          httpproc.addInterceptor(new RequestUserAgent());
          httpproc.addInterceptor(new RequestExpectContinue());
  
          HttpRequestExecutor httpexecutor = new HttpRequestExecutor();
          HttpContext context = new BasicHttpContext(null);
          HttpHost host = new HttpHost(urlHost, port);
          DefaultHttpClientConnection conn = new DefaultHttpClientConnection();
  
          context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
          context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, host);
          @SuppressWarnings("unused")
          String resData = null;
          @SuppressWarnings("unused")
          String statusStr = null;
          StringBuffer buff = new StringBuffer();
          try {
              String REQ_METHOD = method;
              String[] targets = { REQ_METHOD };
  
              for (int i = 0; i &lt; targets.length; i++) {
                  if (!conn.isOpen()) {
                      Socket socket = new Socket(host.getHostName(), host.getPort());
                      conn.bind(socket, params);
                  }
                  BasicHttpEntityEnclosingRequest req = new BasicHttpEntityEnclosingRequest("POST", targets[i]);
                  req.setEntity(new InputStreamEntity(new ByteArrayInputStream(reqStr.toString().getBytes()), reqStr.length()));
                  req.setHeader("Content-Type", "application/x-www-form-urlencoded");
                  req.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.75 Safari/535.7");
                  req.setHeader("Cache-Control", "max-age=0");
                  req.setHeader("Connection", "keep-alive");
                  req.setHeader("Origin", "http://www.indianrail.gov.in");
                  req.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                  req.setHeader("Referer", "http://www.indianrail.gov.in/pnr_Enq.html");
                  //req.setHeader("Accept-Encoding", "gzip,deflate,sdch");
                  req.setHeader("Accept-Language", "en-US,en;q=0.8");
                  req.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.3");
  
  
                  httpexecutor.preProcess(req, httpproc, context);
  
                  HttpResponse response = httpexecutor.execute(req, conn, context);
                  response.setParams(params);
                  httpexecutor.postProcess(response, httpproc, context);
  
                  Header[] headers = response.getAllHeaders();
                  for(int j=0; j&lt;headers.length; j++) {
                      if(headers[j].getName().equalsIgnoreCase("ERROR_MSG")) {
                          resData = EntityUtils.toString(response.getEntity());
                      } 
                  }
                  statusStr = response.getStatusLine().toString();
                  InputStream in = response.getEntity().getContent();
                  BufferedReader reader = null;
                  if(in != null) {
                      reader = new BufferedReader(new InputStreamReader(in));
                  }
  
                  String line = null;
                  while((line = reader.readLine()) != null) {
                      buff.append(line + "\n");
                  }
                  try {
                      in.close();
                  } catch (Exception e) {}
              }
          } catch (Exception e) {
              throw new Exception(e);
          } finally {
              try {
                  conn.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
          return buff;
      }
  
      public PNRStatus parseHtml(StringBuffer data) throws Exception {
          BufferedReader reader = null;
          if(data != null) {
              reader = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(data.toString().getBytes())));
          } else {
              return null;
          }
  
          String line = null;
          TrainDetails trainDetails = new TrainDetails();
          List&lt;PassengerDetails&gt; passDetailsList = new ArrayList&lt;PassengerDetails&gt;();
          PassengerDetails passDetails = null;
          int i = 0;
          while ((line = reader.readLine()) != null) {
              if(line.startsWith("&lt;TD") &amp;&amp; line.contains("table_border_both")) {
                  line = line.replace("&lt;B&gt;", "");
                  line = line.substring(line.indexOf("\"&gt;")+2, line.indexOf("&lt;/")).trim();
  
                  if(line.contains("CHART")) {
                      trainDetails.setChatStatus(line);
                      break;
                  }
                  if(i &gt; 7) {//Passenger Details
                      if(passDetails == null) {
                          passDetails = new PassengerDetails();
                      }
                      switch(i) {
                      case 8 :
                          passDetails.setName(line);
                          break;
                      case 9 :
                          passDetails.setBookingStatus(line.replace(" ", ""));
                          break;
                      case 10 :
                          passDetails.setCurrentStatus(line.replace(" ", ""));
                          i = 7;
                          break;
                      }
                      if(i == 7 ) {
                          passDetailsList.add(passDetails);
                          passDetails = null;
                      }
  
                  } else { // Train details
                      switch(i){
                      case 0 :
                              trainDetails.setNumber(line);
                              break;
                      case 1 :
                              trainDetails.setName(line);
                              break;
                      case 2 :
                              trainDetails.setBoardingDate(line);
                              break;
                      case 3 :
                              trainDetails.setFrom(line);
                              break;
                      case 4 :
                              trainDetails.setTo(line);
                              break;
                      case 5 :
                              trainDetails.setReservedUpto(line);
                              break;
                      case 6 :
                              trainDetails.setBoardingPoint(line);
                              break;
                      case 7 :
                              trainDetails.setReservedType(line);
                              break;
                      default :
                          break;
                      }
                  }
                  i++;
              }
          }
  
          if(trainDetails.getNumber() != null) {
              PNRStatus pnrStatus = new PNRStatus();
              pnrStatus.setTrainDetails(trainDetails);
              pnrStatus.setPassengerDetails(passDetailsList);
              return pnrStatus;
          } else {
              return null;
          }
      }
  
  }
  </code></pre>