>[..]
> it seems a bit unfair of you to hold me to a higher standard than
> the rest of the apache codebase, but ill live :)

i'm not asking you to go back and change existing code but you're
adding, so let's make it nice :)

>> to check for `:' you can use strchr(). i believe you need an ap_pstrdup()
for:
>>
>> +               cmd->server->server_hostname = arg;
>
> other stuff stores arg directly, so i assumed that was ok. again,
> i'll live :)
>> the strtonum() is wrong. it should be 65535 (the value is inclusive)
>
> cool.
>
>> but you could replace that bit just calling server_port().
>
> but then id be calling atoi...

that is part of existing code though.

>> you need to update the documentation as well.
>
> true.

where's the documentation update?
one more comment below.

> here's an update diff to the code:
>
> Index: src/include/http_core.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/httpd/src/include/http_core.h,v
> retrieving revision 1.12
> diff -u -p -r1.12 http_core.h
> --- src/include/http_core.h     24 Aug 2007 11:31:29 -0000      1.12
> +++ src/include/http_core.h     25 Jul 2011 06:45:38 -0000
> @@ -138,6 +138,8 @@ API_EXPORT(const char *) ap_get_remote_l
>  API_EXPORT(char *) ap_construct_url(pool *p, const char *uri, request_rec
*r);
>  API_EXPORT(const char *) ap_get_server_name(request_rec *r);
>  API_EXPORT(unsigned) ap_get_server_port(const request_rec *r);
> +API_EXPORT(const char *) ap_get_server_method(const request_rec *r);
> +API_EXPORT(unsigned) ap_get_default_port(const request_rec *r);
>  API_EXPORT(unsigned long) ap_get_limit_req_body(const request_rec *r);
>  API_EXPORT(void) ap_custom_response(request_rec *r, int status, char
*string);
>  API_EXPORT(int) ap_exists_config_define(char *name);
> Index: src/include/httpd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/httpd/src/include/httpd.h,v
> retrieving revision 1.30
> diff -u -p -r1.30 httpd.h
> --- src/include/httpd.h 25 Feb 2010 07:49:53 -0000      1.30
> +++ src/include/httpd.h 25 Jul 2011 06:45:38 -0000
> @@ -141,12 +141,8 @@ extern "C" {
>  #define DEFAULT_HTTP_PORT      80
>  #define DEFAULT_HTTPS_PORT     443
>  #define ap_is_default_port(port,r)     ((port) == ap_default_port(r))
> -#define ap_http_method(r)   (((r)->ctx != NULL && ap_ctx_get((r)->ctx, \
> -    "ap::http::method") != NULL) ? ((char *)ap_ctx_get((r)->ctx,       \
> -    "ap::http::method")) : "http")
> -#define ap_default_port(r)  (((r)->ctx != NULL && ap_ctx_get((r)->ctx, \
> -    "ap::default::port") != NULL) ? atoi((char *)ap_ctx_get((r)->ctx,  \
> -    "ap::default::port")) : DEFAULT_HTTP_PORT)
> +#define ap_http_method(r)   ap_get_server_method(r)
> +#define ap_default_port(r)  ap_get_default_port(r)
>
>  /* --------- Default user name and group name running standalone ----------
*/
>  /* --- These may be specified as numbers by placing a # before a number ---
*/
> Index: src/main/http_core.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/httpd/src/main/http_core.c,v
> retrieving revision 1.27
> diff -u -p -r1.27 http_core.c
> --- src/main/http_core.c        10 May 2010 02:00:50 -0000      1.27
> +++ src/main/http_core.c        25 Jul 2011 06:45:38 -0000
> @@ -804,6 +804,42 @@ ap_get_server_port(const request_rec *r)
>            : port;
>  }
>
> +API_EXPORT(const char *)
> +ap_get_server_method(const request_rec *r)
> +{
> +       const char *method;
> +
> +       if (r->ctx != NULL) {
> +               method = ap_ctx_get(r->ctx, "ap::http::method");
> +               if (method != NULL)
> +                       return (method);
> +       }
> +
> +       if (r->server->ctx != NULL) {
> +               method = ap_ctx_get(r->server->ctx, "ap::http::method");
> +               if (method != NULL)
> +                       return (method);
> +       }
> +
> +       return ("http");
> +}
> +
> +API_EXPORT(unsigned)
> +ap_get_default_port(const request_rec *r)
> +{
> +       const char *v = NULL;
> +
> +       if (r->ctx != NULL)
> +               v = ap_ctx_get(r->ctx, "ap::default::port");
> +       if (v == NULL && r->server->ctx != NULL)
> +               v = ap_ctx_get(r->server->ctx, "ap::default::port");
> +
> +       if (v == NULL)
> +               return (DEFAULT_HTTP_PORT);
> +
> +       return ((unsigned)ap_strtol(v, NULL, 10));
> +}
> +
>  API_EXPORT(char *)
>  ap_construct_url(pool *p, const char *uri, request_rec *r)
>  {
> @@ -1751,6 +1787,43 @@ static const char *set_server_string_slo
>     return NULL;
>  }
>
> +static const char *
> +set_server_name(cmd_parms *cmd, void *dummy, char *arg)
> +{
> +       const char *err = ap_check_cmd_context(cmd,
> +           NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT);
> +       const char *part;
> +       int port;
> +
> +       if (err != NULL)
> +               return (err);
> +
> +       if (strncmp("https://";, arg, 8) == 0) {
> +               ap_ctx_set(cmd->server->ctx, "ap::http::method", "https");
> +               ap_ctx_set(cmd->server->ctx, "ap::default::port", "443");
> +               arg += 8;
> +       } else if (strncmp("http://";, arg, 7) == 0) {
> +               /* defaults are fine */
> +               arg += 7;
> +       } else if (strstr(arg, "://") != NULL)
> +               return ("unsupported scheme");
> +
> +       part = strstr(arg, ":");
> +       if (part != NULL) {
> +               port = (int)strtonum(part + 1, 1, 65535, &err);
> +               if (err != NULL) {
> +                       return ap_pstrcat(cmd->temp_pool,
> +                           "The port number \"", part + 1, "\" is ", err,
NULL);

just use the same error than server_port() please.

> +               }
> +               cmd->server->port = port;
> +               cmd->server->server_hostname = ap_pstrndup(cmd->pool, arg,
> +                   part - arg);
> +       } else
> +               cmd->server->server_hostname = ap_pstrdup(cmd->pool, arg);
> +
> +       return (NULL);
> +}
> +
>  static const char *server_type(cmd_parms *cmd, void *dummy, char *arg)
>  {
>     const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
> @@ -3152,8 +3225,7 @@ static const command_rec core_cmds[] = {
>  { "ServerAdmin", set_server_string_slot,
>   (void *)XtOffsetOf (server_rec, server_admin), RSRC_CONF, TAKE1,
>   "The email address of the server administrator" },
> -{ "ServerName", set_server_string_slot,
> -  (void *)XtOffsetOf (server_rec, server_hostname), RSRC_CONF, TAKE1,
> +{ "ServerName", set_server_name, NULL, RSRC_CONF, TAKE1,
>   "The hostname of the server" },
>  { "ServerSignature", set_signature_flag, NULL, OR_ALL, TAKE1,
>   "En-/disable server signature (on|off|email)" },

Reply via email to