You are viewing a plain text version of this content. The canonical link for it is here.
Posted to test-cvs@httpd.apache.org by do...@apache.org on 2001/11/17 00:47:45 UTC

cvs commit: httpd-test/perl-framework/t/protocol nntp-like.t

dougm       01/11/16 15:47:45

  Added:       perl-framework/c-modules/nntp_like .cvsignore
                        mod_nntp_like.c
               perl-framework/t/protocol nntp-like.t
  Log:
  add a test for nntp-like protocols
  
  Revision  Changes    Path
  1.1                  httpd-test/perl-framework/c-modules/nntp_like/.cvsignore
  
  Index: .cvsignore
  ===================================================================
  Makefile
  .libs
  *.lo
  *.slo
  *.la
  
  
  
  1.1                  httpd-test/perl-framework/c-modules/nntp_like/mod_nntp_like.c
  
  Index: mod_nntp_like.c
  ===================================================================
  #define HTTPD_TEST_REQUIRE_APACHE 2
  
  /*
   * purpose of this module is to test protocol modules that need to 
   * send data to the client before reading any request data.
   * in this case, mod_ssl needs to handshake before sending data to the client.
   * t/protocol/nntp-like.t tests both with and without ssl
   * to make sure the protocol code works in both cases.
   */
  
  #if CONFIG_FOR_HTTPD_TEST
  
  <VirtualHost mod_nntp_like>
      NNTPLike On
  </VirtualHost>
  
  <VirtualHost mod_nntp_like_ssl>
      NNTPLike On
      <IfModule @ssl_module@>
           SSLEngine On
      </IfModule>
  </VirtualHost>
  
  #endif
  
  #include "httpd.h"
  #include "http_config.h"
  #include "http_protocol.h"
  #include "http_connection.h"
  #include "http_request.h"
  #include "http_log.h"
  #include "ap_config.h"
  #include "util_filter.h"
  #include "apr_buckets.h"
  #include "apr_strings.h"
  
  module AP_MODULE_DECLARE_DATA nntp_like_module;
  
  typedef struct {
      int enabled;
  } nntp_like_srv_cfg_t;
  
  static void *nntp_like_srv_cfg_create(apr_pool_t *p, server_rec *s)
  {
      nntp_like_srv_cfg_t *cfg = apr_palloc(p, sizeof(*cfg));
  
      cfg->enabled = 0;
  
      return cfg;
  }
  
  static const char *nntp_like_cmd_enable(cmd_parms *cmd, void *dummy, int arg)
  {
      nntp_like_srv_cfg_t *cfg =
          ap_get_module_config(cmd->server->module_config,
                               &nntp_like_module);
      cfg->enabled = arg;
  
      return NULL;
  }
  
  /* this function just triggers the SSL handshake.
   * normally that would happen in a protocol such as HTTP when
   * the client request is read.  however, with certain protocols
   * such as NNTP, the server sends a response before the client
   * sends a request
   *
   * if SSL is not enabled, this function is a noop
   */
  static apr_status_t nntp_like_init_connection(conn_rec *c)
  {
      apr_bucket_brigade *bb;
      apr_status_t rv;
      apr_off_t zero = 0;
  
      bb = apr_brigade_create(c->pool);
  
      rv = ap_get_brigade(c->input_filters, bb,
                          AP_MODE_INIT, &zero);
  
      apr_brigade_destroy(bb);
  
      return rv;
  }
  
  static apr_status_t nntp_like_send_welcome(conn_rec *c)
  {
      apr_bucket *bucket;
      apr_bucket_brigade *bb = apr_brigade_create(c->pool);
  
  #define NNTP_LIKE_WELCOME \
      "200 localhost - ready\r\n"
  
      bucket = apr_bucket_transient_create(NNTP_LIKE_WELCOME,
                                           strlen(NNTP_LIKE_WELCOME));
      APR_BRIGADE_INSERT_TAIL(bb, bucket);
      APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_flush_create());
  
      return ap_pass_brigade(c->output_filters, bb);
  }
  
  static int nntp_like_process_connection(conn_rec *c)
  {
      apr_bucket_brigade *bb;
      apr_status_t rv;
      apr_off_t zero = 0;
      nntp_like_srv_cfg_t *cfg =
          ap_get_module_config(c->base_server->module_config,
                               &nntp_like_module);
  
      if (!cfg->enabled) {
          return DECLINED;
      }
      
      /* handshake if talking over SSL */
      if ((rv = nntp_like_init_connection(c)) != APR_SUCCESS) {
          return rv;
      }
  
      /* send the welcome message */
      if ((rv = nntp_like_send_welcome(c)) != APR_SUCCESS) {
          return rv;
      }
  
      /* just for testing purposes, this is the same logic as mod_echo */
      bb = apr_brigade_create(c->pool);
  
      for (;;) {
          if ((rv = ap_get_brigade(c->input_filters, bb,
                                   AP_MODE_BLOCKING, &zero) != APR_SUCCESS || 
               APR_BRIGADE_EMPTY(bb)))
          {
              apr_brigade_destroy(bb);
              break;
          }
  
          APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_flush_create());
          ap_pass_brigade(c->output_filters, bb);    
      }
  
      return OK;
  }
  
  static void nntp_like_register_hooks(apr_pool_t *p)
  {
      ap_hook_process_connection(nntp_like_process_connection,
                                 NULL, NULL,
                                 APR_HOOK_MIDDLE);
  }
  
  static const command_rec nntp_like_cmds[] = 
  {
      AP_INIT_FLAG("NNTPLike", nntp_like_cmd_enable, NULL, RSRC_CONF,
                   "enable nntp like protocol on this host"),
      { NULL }
  };
  
  module AP_MODULE_DECLARE_DATA nntp_like_module = {
      STANDARD20_MODULE_STUFF, 
      NULL,                  /* create per-dir    config structures */
      NULL,                  /* merge  per-dir    config structures */
      nntp_like_srv_cfg_create, /* create per-server config structures */
      NULL,                  /* merge  per-server config structures */
      nntp_like_cmds,        /* table of config file commands       */
      nntp_like_register_hooks  /* register hooks                      */
  };
  
  
  
  1.1                  httpd-test/perl-framework/t/protocol/nntp-like.t
  
  Index: nntp-like.t
  ===================================================================
  #testing that the server can respond right after client connects,
  #before client sends any request data
  
  use strict;
  use warnings FATAL => 'all';
  
  use Apache::Test;
  use Apache::TestUtil;
  use Apache::TestRequest;
  
  my $tests = 5;
  my $vars = Apache::Test::vars();
  my @modules = qw(mod_nntp_like);
  
  if (Apache::Test::have_ssl()) {
      $tests *= 2;
      unshift @modules, 'mod_nntp_like_ssl';
  }
  
  plan tests => $tests, ['mod_nntp_like'];
  
  for my $module (@modules) {
      print "testing $module\n";
  
      my $sock = Apache::TestRequest::vhost_socket($module);
      ok $sock;
  
      Apache::TestRequest::socket_trace($sock);
  
      my $response = Apache::TestRequest::getline($sock);
  
      $response =~ s/[\r\n]+$//;
      ok t_cmp('200 localhost - ready', $response,
               'welcome response');
  
      for my $data ('LIST', 'GROUP dev.httpd.apache.org', 'ARTICLE 401') {
          $sock->print("$data\n");
  
          chomp($response = Apache::TestRequest::getline($sock));
          ok t_cmp($data, $response, 'echo');
      }
  }