Bug 59868 - HTMLManager's output of host name and IP address is misleading
Summary: HTMLManager's output of host name and IP address is misleading
Status: RESOLVED FIXED
Alias: None
Product: Tomcat 8
Classification: Unclassified
Component: Manager (show other bugs)
Version: 8.5.4
Hardware: PC All
: P2 normal (vote)
Target Milestone: ----
Assignee: Tomcat Developers Mailing List
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-07-16 11:43 UTC by Michael Osipov
Modified: 2016-08-02 15:42 UTC (History)
0 users



Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Michael Osipov 2016-07-16 11:43:05 UTC
I have configured my Connector to listen to address="127.0.0.1" only. Single hostname for this is "localhost". Though, the HTMLManager displays in Server Information my regular host name and the IP address of the second NIC (VirtualBox Host-Only Adapter).

Code:
        try {
            InetAddress address = InetAddress.getLocalHost();
            args[6] = address.getHostName();
            args[7] = address.getHostAddress();
        } catch (UnknownHostException e) {
            args[6] = "-";
            args[7] = "-";
        }

I would expect to display the information this Connector and Host is accepting, remove this information altogether or document that this information does not reflect configuration (docs/html-manager-howto.html#Server_Information).
Comment 1 Remy Maucherat 2016-07-18 10:19:32 UTC
This section is information on the server, so this looks fine to me.
Comment 2 Michael Osipov 2016-07-18 10:50:26 UTC
I would html-manager-howto.html#Server_Information at least expect to say that. No more, no less.
Comment 3 Michael Osipov 2016-07-18 12:44:34 UTC
I do not understand why you are unwilling to add two sentences to the docs about this. This is not rocket science.
Comment 4 Christopher Schultz 2016-07-18 16:55:16 UTC
(In reply to Michael Osipov from comment #0)
> I have configured my Connector to listen to address="127.0.0.1" only. Single
> hostname for this is "localhost". Though, the HTMLManager displays in Server
> Information my regular host name and the IP address of the second NIC
> (VirtualBox Host-Only Adapter).
>
> Code:
>         try {
>             InetAddress address = InetAddress.getLocalHost();
>             args[6] = address.getHostName();
>             args[7] = address.getHostAddress();
>         } catch (UnknownHostException e) {
>             args[6] = "-";
>             args[7] = "-";
>         }
> 
> I would expect to display the information this Connector and Host is
> accepting, remove this information altogether or document that this
> information does not reflect configuration
> (docs/html-manager-howto.html#Server_Information).

Yeah, InetAddress.getLocaleHost() doesn't behave the way that most people would expect. Most people would expect it to grab the "localhost" IP address and use that. It doesn't.

Instead, it asks the OS what the hostname of the current machine is, then uses that. So if your hostname is "erasmus", then InetAddress.getLocalHost will return that name + its IP address even if you have bound the connector to 127.0.0.1.

Note that there is no relationship whatsoever between your <Connector> and InetAddress.getLocaLhost. InetAddress has no idea you are running Tomcat or using a Connector or that your connector is bound to 127.0.0.1.

I'll have a look at this because, as you say, it's quite surprising.

Unfortunately, most servers will be configured to listen to 0.0.0.0 (all interfaces) and then ... we're back to using InetAddress.getLocalHost to figure out what our "host name" is.
Comment 5 Michael Osipov 2016-07-18 19:43:31 UTC
(In reply to Christopher Schultz from comment #4)
> (In reply to Michael Osipov from comment #0)
> > I have configured my Connector to listen to address="127.0.0.1" only. Single
> > hostname for this is "localhost". Though, the HTMLManager displays in Server
> > Information my regular host name and the IP address of the second NIC
> > (VirtualBox Host-Only Adapter).
> >
> > Code:
> >         try {
> >             InetAddress address = InetAddress.getLocalHost();
> >             args[6] = address.getHostName();
> >             args[7] = address.getHostAddress();
> >         } catch (UnknownHostException e) {
> >             args[6] = "-";
> >             args[7] = "-";
> >         }
> > 
> > I would expect to display the information this Connector and Host is
> > accepting, remove this information altogether or document that this
> > information does not reflect configuration
> > (docs/html-manager-howto.html#Server_Information).
> 
> Yeah, InetAddress.getLocaleHost() doesn't behave the way that most people
> would expect. Most people would expect it to grab the "localhost" IP address
> and use that. It doesn't.
> 
> Instead, it asks the OS what the hostname of the current machine is, then
> uses that. So if your hostname is "erasmus", then InetAddress.getLocalHost
> will return that name + its IP address even if you have bound the connector
> to 127.0.0.1.
> 
> Note that there is no relationship whatsoever between your <Connector> and
> InetAddress.getLocaLhost. InetAddress has no idea you are running Tomcat or
> using a Connector or that your connector is bound to 127.0.0.1.
> 
> I'll have a look at this because, as you say, it's quite surprising.
> 
> Unfortunately, most servers will be configured to listen to 0.0.0.0 (all
> interfaces) and then ... we're back to using InetAddress.getLocalHost to
> figure out what our "host name" is.

I am aware of this. That's the reason I am reporting this. The information displayed is misleading. I would at least expect the docs to be updated or this information removed.
Comment 6 Remy Maucherat 2016-07-18 20:35:26 UTC
(In reply to Christopher Schultz from comment #4)
> Instead, it asks the OS what the hostname of the current machine is, then
> uses that. So if your hostname is "erasmus", then InetAddress.getLocalHost
> will return that name + its IP address even if you have bound the connector
> to 127.0.0.1.

This is a manager webapp, and it is a section on server information, so it should display the server host name, not the particular connector information. This sounds really intuitive to me, it is like that in all admin webapps I've seen so far. So I will have to veto the proposed change for the time being and I also don't see the point of documenting it (server host name means the server host name ... ok, nice).
Comment 7 Michael Osipov 2016-07-18 20:39:44 UTC
(In reply to Remy Maucherat from comment #6)
> (In reply to Christopher Schultz from comment #4)
> > Instead, it asks the OS what the hostname of the current machine is, then
> > uses that. So if your hostname is "erasmus", then InetAddress.getLocalHost
> > will return that name + its IP address even if you have bound the connector
> > to 127.0.0.1.
> 
> This is a manager webapp, and it is a section on server information, so it
> should display the server host name, not the particular connector
> information. This sounds really intuitive to me, it is like that in all
> admin webapps I've seen so far. So I will have to veto the proposed change
> for the time being and I also don't see the point of documenting it (server
> host name means the server host name ... ok, nice).

The funny thing is, I do not even see my machines host address by the address of my VirtuaBox Host-Only device which has a higher priority for some reason:

C:\Users\mosipov>route print
===========================================================================
Schnittstellenliste
  8...0a 00 27 00 00 08 ......VirtualBox Host-Only Ethernet Adapter
  4...d0 50 99 93 d7 0e ......Intel(R) Ethernet Connection (2) I219-V
  1...........................Software Loopback Interface 1
  6...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter
  7...00 00 00 00 00 00 00 e0 Teredo Tunneling Pseudo-Interface
  3...00 00 00 00 00 00 00 e0 Microsoft ISATAP Adapter #2
===========================================================================
Comment 8 Christopher Schultz 2016-07-18 22:22:34 UTC
(In reply to Remy Maucherat from comment #6)
> (In reply to Christopher Schultz from comment #4)
> > Instead, it asks the OS what the hostname of the current machine is, then
> > uses that. So if your hostname is "erasmus", then InetAddress.getLocalHost
> > will return that name + its IP address even if you have bound the connector
> > to 127.0.0.1.
> 
> This is a manager webapp, and it is a section on server information, so it
> should display the server host name, not the particular connector
> information. This sounds really intuitive to me, it is like that in all
> admin webapps I've seen so far.


> So I will have to veto the proposed change for the time being and I
> also don't see the point of documenting it (server host name means
> the server host name ... ok, nice).

What proposed change? I merely re-opened this issue because there is a reasonable request from the community for clarification.
Comment 9 Remy Maucherat 2016-07-19 08:07:53 UTC
I wasn't fine with changing the output to something like request.getLocalName(). I am fine with a clarification but it did seem intuitive enough at this point.
Comment 10 Mark Thomas 2016-08-02 15:42:26 UTC
I've added some clarifications for the docs in:
9.0.x for 9.0.0.M10 onwards
8.5.x for 8.5.5. onwards
8.0.x for 8.0.37 onwards
7.0.x for 7.0.71 onwards