/* ace_httpc.cpp
 * Simple HTTP Client using ACE
 * 
 * HTTPサーバからファイルを転送してもらい、標準出力に印字するプログラム。
 *
 * 実行方法:
 * > プログラム名 [ファイル名(ルートからのフルパス、UNIX形式)] [サーバアドレス]
 */

#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>
#include <string>

int main(int argc, char *argv[])
{
  // 第一引数はGETしてくるファイル名(ルートからのフルパス)。デフォルトは /index.html
  std::string pathname(argc > 1 ? argv[1] : "/index.html");
  // 第二引数はHTTPサーバのアドレス。デフォルトは何故かYAHOO!Japan(^^;
  std::string server_hostname(argc > 2 ? argv[2] : "www.yahoo.co.jp");

  ACE_SOCK_Connector connector;
  ACE_SOCK_Stream peer;
  ACE_INET_Addr peer_addr;

  // ポート番号とサーバアドレスを与えてアドレスクラスを初期化
  if (peer_addr.set(80, server_hostname.c_str()) == -1)
    return 1;

  // サーバに接続
  if (connector.connect(peer, peer_addr) == -1)
    return 1;

    // HTTP/1.0の仕様に従ってGETリクエストを発行
    // 仕様はRTF1945(http://www.ietf.org/rtf/1945.txt) 
  std::string message = "GET " + pathname + " HTTP/1.0\r\n\r\n";
  if (peer.send_n(message.c_str(), message.length()) == -1)
    return 1;

  // サーバからの出力を受け取り標準出力に印字
  char buf[BUFSIZ];
  for (ssize_t n; (n = peer.recv(buf, sizeof(buf))) > 0;)
    ACE::write_n(ACE_STDOUT, buf, n);

  // ソケットをクローズ
  return peer.close() == -1 ? 1 : 0;
}