// =========================================================
// Вызов расширения сервера Web на базе интерфейса CGI
// из приложения Java
//
// (C) Фролов А.В, 1997
//
// E-mail: frolov@glas.apc.org
// WWW:    http://www.glasnet.ru/~frolov
//            или
//         http://www.dials.ccas.ru/frolov
// =========================================================
import java.io.*;
import java.net.*;
import java.util.*;

public class CallCGI
{
	// -------------------------------------------------------
  // main
  // Метод, получающий управление при запуске приложения
  // -------------------------------------------------------
  public static void main(String args[])
  {
    // Массив для ввода строки с клавиатуры
    byte bKbdInput[] = new byte[256];

    // Размер принятого блока данных
    int length;

    // Рабочая строка
    String str;

    // Адрес URL вызываемой программы CGI
    URL u;

    // Канал связи с расширением CGI
    URLConnection c;

    // Выходной поток для передачи данных расширению CGI
    PrintStream ps;

    // Входной поток для получения данных от расширения CGI
    DataInputStream is;

    try
    {
      // Выводим строку приглашения
      System.out.println("CGI extension call" + 
        "\nEnter any string for send to CGI...");

      // Читаем строку, передаваемую расширению, с клавиатуры
      length = System.in.read(bKbdInput);
        
      // Если строка не пустая, обрабатываем ее
      if(length != 1)
      {
        // Преобразуем строку в формат String
        str = new String(bKbdInput, 0);

        // Обрезаем строку, удаляя символ конца строки
        StringTokenizer st;
        st   = new StringTokenizer(str, "\n");
        str = new String((String)st.nextElement());

        // Выполняем кодировку URL для передаваемой строки
        String StrEncoded = URLEncoder.encode(str);

        // Отображаем перекодированную строку
        System.out.println("Encoded string: >" + StrEncoded + "<");
        
        // Создаем объект класса URL для расширения CGI        
        u = new URL("http://saturn/frolov-cgi/controls.exe");

        // Открываем канал связи с расширением CGI
        c = u.openConnection();

        // Создаем выходной поток данных для передачи
        // введенной строки серверу CGI
        ps = new PrintStream(c.getOutputStream());

        // Передаем закодированную строку расширению CGI
        ps.println(StrEncoded);

        // Закрываем выходной поток
        ps.close();

        // Создаем входной поток для приема данных от
        // расширения CGI
        is = new DataInputStream(c.getInputStream());
        
        System.out.println(
          "\n-------------------------------------------" +
          "\n Data from CGI extension" +
          "\n-------------------------------------------\n");


        // Прием данных выполняем в цикле
        while (true)
        {
          // Получаем очередную строку
          str = is.readLine();

          // Если последняя строка, прерываем цикл
          if(str == null)
            break;

          // Отображаем принятую строку
          System.out.println(str);
        }

        // Закрываем входной поток
        is.close();

      }
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
    
    try
    {
      System.out.println(
        "Press <Enter> to terminate application...");

      System.in.read(bKbdInput);
    }
    catch(Exception ioe)
    {
      System.out.println(ioe.toString());
    }
  }
}