1717import java .net .http .HttpResponse ;
1818import java .time .Duration ;
1919import java .util .Map ;
20+ import java .util .Objects ;
2021import java .util .Random ;
2122import java .util .logging .Level ;
2223import java .util .logging .Logger ;
24+ import java .util .regex .Pattern ;
2325
2426/**
2527 * An HTTP forwarder that delivers DogStatsD HTTP payloads to a remote endpoint.
@@ -89,6 +91,8 @@ public void run() {
8991 * ({@link WhenFull#BLOCK} mode only)
9092 */
9193 public void send (URI url , byte [] payload ) throws InterruptedException {
94+ Objects .requireNonNull (url , "url" );
95+ Objects .requireNonNull (payload , "payload" );
9296 queue .add (new Payload (url , payload ));
9397 }
9498
@@ -171,6 +175,7 @@ void backoff() throws InterruptedException {
171175 * @param data the local-data string, or {@code null} to omit the header
172176 */
173177 public void setLocalData (String data ) {
178+ validateHeaderValue (data );
174179 logger .log (Level .INFO , "using local data: {0}" , data );
175180 localData = data ;
176181 }
@@ -185,7 +190,19 @@ public void setLocalData(String data) {
185190 * @param data the external-data string, or {@code null} to omit the header
186191 */
187192 public void setExternalData (String data ) {
193+ validateHeaderValue (data );
188194 logger .log (Level .INFO , "using external data: {0}" , data );
189195 externalData = data ;
190196 }
197+
198+ private static final Pattern validHeaderValue = Pattern .compile ("[\\ t\\ x20-\\ x7E\\ x80-\\ xFF]*" );
199+
200+ private static void validateHeaderValue (String value ) {
201+ if (value == null ) {
202+ return ;
203+ }
204+ if (!validHeaderValue .matcher (value ).matches ()) {
205+ throw new IllegalArgumentException ("invalid character" );
206+ }
207+ }
191208}
0 commit comments