1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.jboss.netty.handler.codec.http2;
17
18 import java.io.UnsupportedEncodingException;
19 import java.net.URI;
20 import java.net.URISyntaxException;
21 import java.net.URLEncoder;
22 import java.nio.charset.Charset;
23 import java.nio.charset.UnsupportedCharsetException;
24 import java.util.ArrayList;
25 import java.util.List;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 public class QueryStringEncoder {
48
49 private final Charset charset;
50 private final String uri;
51 private final List<Param> params = new ArrayList<Param>();
52
53
54
55
56
57 public QueryStringEncoder(String uri) {
58 this(uri, HttpCodecUtil.DEFAULT_CHARSET);
59 }
60
61
62
63
64
65 public QueryStringEncoder(String uri, Charset charset) {
66 if (uri == null) {
67 throw new NullPointerException("uri");
68 }
69 if (charset == null) {
70 throw new NullPointerException("charset");
71 }
72
73 this.uri = uri;
74 this.charset = charset;
75 }
76
77
78
79
80 @Deprecated
81 public QueryStringEncoder(String uri, String charset) {
82 this(uri, Charset.forName(charset));
83 }
84
85
86
87
88 public void addParam(String name, String value) {
89 if (name == null) {
90 throw new NullPointerException("name");
91 }
92 if (value == null) {
93 throw new NullPointerException("value");
94 }
95 params.add(new Param(name, value));
96 }
97
98
99
100
101
102
103 public URI toUri() throws URISyntaxException {
104 return new URI(toString());
105 }
106
107
108
109
110
111
112 @Override
113 public String toString() {
114 if (params.isEmpty()) {
115 return uri;
116 } else {
117 StringBuilder sb = new StringBuilder(uri).append("?");
118 for (int i = 0; i < params.size(); i++) {
119 Param param = params.get(i);
120 sb.append(encodeComponent(param.name, charset));
121 sb.append("=");
122 sb.append(encodeComponent(param.value, charset));
123 if (i != params.size() - 1) {
124 sb.append("&");
125 }
126 }
127 return sb.toString();
128 }
129 }
130
131 private static String encodeComponent(String s, Charset charset) {
132 try {
133 return URLEncoder.encode(s, charset.name()).replaceAll("\\+", "%20");
134 } catch (UnsupportedEncodingException e) {
135 throw new UnsupportedCharsetException(charset.name());
136 }
137 }
138
139 private static final class Param {
140
141 final String name;
142 final String value;
143
144 Param(String name, String value) {
145 this.value = value;
146 this.name = name;
147 }
148 }
149 }