public static <K,V> Tuple<K,V> empty(){ return new Tuple<>(null, null); }
@Override public Set<Entry<K, V>> entrySet() { return isEmpty() ? Collections.emptySet() : Collections.singleton( Tuple.of( null, value ) ); } }
static Tuple<String, String> fixContentType( String contentType, String defaultEncoding ){ if ( contentType == null ) return Tuple.empty(); final StringCursor cursor = new StringCursor(contentType); if ( cursor.shiftCursorToNextChar( ';' ) ) { contentType = cursor.substringFromLastMark( 1 ); cursor.mark(1); cursor.end(); defaultEncoding = cursor.substringFromLastMark(); } return Tuple.of( contentType, defaultEncoding ); } }
@Override public Credential readCredential(HttpServerExchange exchange) throws IOException { final Tuple<String,String> contentTypeAndEncoding = URL .fixContentType( exchange.getRequestHeaders().getFirst(Headers.CONTENT_TYPE ), null ); if ( Mimes.JSON.equals( contentTypeAndEncoding.getFirst() ) && formAuthConfiguration.isTryingToLogin( exchange ) ) { if ( !exchange.isBlocking() ) exchange.startBlocking(); final JSONCredentials json = jackson.objectMapper().readValue(exchange.getInputStream(), JSONCredentials.class); return new UsernameAndPasswordCredential(json.username, json.password); } return null; }