View Javadoc
1   package com.ericsson.research.transport.ws;
2   
3   /*
4    * ##_BEGIN_LICENSE_##
5    * Transport Abstraction Package (trap)
6    * ----------
7    * Copyright (C) 2014 Ericsson AB
8    * ----------
9    * Redistribution and use in source and binary forms, with or without modification,
10   * are permitted provided that the following conditions are met:
11   * 
12   * 1. Redistributions of source code must retain the above copyright notice, this
13   *    list of conditions and the following disclaimer.
14   * 
15   * 2. Redistributions in binary form must reproduce the above copyright notice,
16   *    this list of conditions and the following disclaimer in the documentation
17   *    and/or other materials provided with the distribution.
18   * 
19   * 3. Neither the name of the Ericsson AB nor the names of its contributors
20   *    may be used to endorse or promote products derived from this software without
21   *    specific prior written permission.
22   * 
23   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26   * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28   * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
30   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
31   * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
32   * OF THE POSSIBILITY OF SUCH DAMAGE.
33   * ##_END_LICENSE_##
34   */
35  
36  
37  public class WSURI
38  {
39      
40      private static final String ERROR = "Wrong WebSocket URI: ";
41      
42      private final String        host;
43      private final int           port;
44      private final String        scheme;
45      private final String        path;
46      
47      public WSURI(String uri) throws IllegalArgumentException
48      {
49          int p = uri.indexOf("://");
50          if (p == -1)
51              throw new IllegalArgumentException(ERROR + uri);
52          this.scheme = uri.substring(0, p);
53          if (!"ws".equals(this.scheme) && !"wss".equals(this.scheme))
54              throw new IllegalArgumentException(ERROR + uri);
55          int q = uri.indexOf("/", p + 3);
56          if (q == -1)
57              q = uri.length();
58          String hostandport = uri.substring(p + 3, q);
59          int r = hostandport.lastIndexOf(":");
60          if (r != -1)
61          {
62              this.host = hostandport.substring(0, r);
63              try
64              {
65                  this.port = Integer.parseInt(hostandport.substring(r + 1));
66              }
67              catch (NumberFormatException e)
68              {
69                  throw new IllegalArgumentException(ERROR + uri);
70              }
71          }
72          else
73          {
74              this.host = hostandport;
75              if ("ws".equals(this.scheme))
76                  this.port = 80;
77              else
78                  this.port = 443;
79          }
80          if (q < uri.length())
81              this.path = uri.substring(q);
82          else
83              this.path = "/";
84      }
85      
86      public String getHost()
87      {
88          return this.host;
89      }
90      
91      public int getPort()
92      {
93          return this.port;
94      }
95      
96      public String getScheme()
97      {
98          return this.scheme;
99      }
100     
101     public String getPath()
102     {
103         return this.path;
104     }
105     
106     public String toString()
107     {
108         StringBuffer sb = new StringBuffer();
109         sb.append(this.scheme);
110         sb.append("://");
111         sb.append(this.host);
112         if (!(this.port == 80 && "ws".equals(this.scheme)) && !(this.port == 443 && "wss".equals(this.scheme)))
113         {
114             sb.append(":");
115             sb.append(Integer.toString(this.port));
116         }
117         sb.append(this.path);
118         return sb.toString();
119     }
120     
121 }