RFC2047Utilities.java
- /*
- * GovWay - A customizable API Gateway
- * https://govway.org
- *
- * Copyright (c) 2005-2025 Link.it srl (https://link.it).
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3, as published by
- * the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
- package org.openspcoop2.utils.transport.http;
- import java.util.List;
- import javax.mail.internet.MimeUtility;
- import org.apache.logging.log4j.Level;
- import org.openspcoop2.utils.LoggerWrapperFactory;
- import org.openspcoop2.utils.UtilsException;
- import org.openspcoop2.utils.resources.Charset;
- import org.slf4j.Logger;
- /**
- * RFC2047Utilities
- *
- * @author Andrea Poli (apoli@link.it)
- * @author $Author$
- * @version $Rev$, $Date$
- */
- public class RFC2047Utilities {
- public static void main(String[] args) throws Exception {
- test();
- }
-
- private static Logger log = null;
-
- private static void initLogger() {
- LoggerWrapperFactory.setDefaultConsoleLogConfiguration(Level.ALL);
- log = LoggerWrapperFactory.getLogger(RFC2047Utilities.class);
- }
-
- private static void logInfo(String msg) {
- log.info(msg);
- }
-
- private static final String VALORE_DIVERSO_ATTESO = "Riscontrato valore diverso da quello atteso";
- private static final String VALORE_DIVERSO_SORGENTE = "Valore decodificato diverso dal sorgente";
- private static final String ENCODED_IN = "] encoded in RFC2047(";
- private static final String DECODE = "Decode: ";
-
- public static void test() throws UtilsException {
-
- initLogger();
-
- // Test String con caratteri appartenenti all'ISO ISO_8859_1
- String stringIso88591 = "für psychisch";
- String stringUsAscii = "fur psychisch";
- String stringLunga = "Non è possibile inviare un header con questi/caratteri nella richiesta";
-
- boolean v = isAllCharactersInCharset(stringIso88591, Charset.ISO_8859_1);
- logInfo("IS ["+stringIso88591+"] in CHARSET ISO_8859_1 ?: "+v);
- if(!v) {
- throw new UtilsException(VALORE_DIVERSO_ATTESO);
- }
-
- v = isAllCharactersInCharset(stringIso88591, Charset.US_ASCII);
- logInfo("IS ["+stringIso88591+"] in CHARSET US_ASCII ?: "+v);
- if(v) {
- throw new UtilsException(VALORE_DIVERSO_ATTESO);
- }
-
- v = isAllCharactersInCharset(stringUsAscii, Charset.ISO_8859_1);
- logInfo("IS ["+stringUsAscii+"] in CHARSET ISO_8859_1 ?: "+v);
- if(!v) {
- throw new UtilsException(VALORE_DIVERSO_ATTESO);
- }
-
- v = isAllCharactersInCharset(stringUsAscii, Charset.US_ASCII);
- logInfo("IS ["+stringUsAscii+"] in CHARSET US_ASCII ?: "+v);
- if(!v) {
- throw new UtilsException(VALORE_DIVERSO_ATTESO);
- }
-
- logInfo("\n*** RFC2047 ISO_8859_1 B ***");
- String varRFC2047ISO88591B = encode(stringIso88591, Charset.ISO_8859_1, RFC2047Encoding.B);
- logInfo("["+stringIso88591+ENCODED_IN+Charset.ISO_8859_1+","+RFC2047Encoding.B+"): "+varRFC2047ISO88591B);
- String decode = decode(varRFC2047ISO88591B);
- logInfo(DECODE+decode);
- if(!stringIso88591.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
-
- logInfo("\n*** RFC2047 ISO_8859_1 Q ***");
- String varRFC2047ISO88591Q = encode(stringIso88591, Charset.ISO_8859_1, RFC2047Encoding.Q);
- logInfo("["+stringIso88591+ENCODED_IN+Charset.ISO_8859_1+","+RFC2047Encoding.Q+"): "+varRFC2047ISO88591Q);
- decode = decode(varRFC2047ISO88591Q);
- logInfo(DECODE+decode);
- if(!stringIso88591.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
-
- logInfo("\n*** RFC2047 US_ASCII B ***");
- String varRFC2047USASCIIB = encode(stringIso88591, Charset.US_ASCII, RFC2047Encoding.B);
- logInfo("["+stringIso88591+ENCODED_IN+Charset.US_ASCII+","+RFC2047Encoding.B+"): "+varRFC2047USASCIIB);
- decode = decode(varRFC2047USASCIIB);
- logInfo(DECODE+decode);
- if(!stringIso88591.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
-
- logInfo("\n*** RFC2047 US_ASCII Q ***");
- String varRFC2047USASCIIQ = encode(stringIso88591, Charset.US_ASCII, RFC2047Encoding.Q);
- logInfo("["+stringIso88591+ENCODED_IN+Charset.US_ASCII+","+RFC2047Encoding.Q+"): "+varRFC2047USASCIIQ);
- decode = decode(varRFC2047USASCIIQ);
- logInfo(DECODE+decode);
- if(!stringIso88591.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
-
- logInfo("\n*** RFC2047 US_ASCII B (stringa lunga) ***");
- varRFC2047USASCIIB = encode(stringLunga, Charset.US_ASCII, RFC2047Encoding.B);
- logInfo("["+stringLunga+ENCODED_IN+Charset.US_ASCII+","+RFC2047Encoding.B+"): "+varRFC2047USASCIIB);
- decode = decode(varRFC2047USASCIIB);
- logInfo(DECODE+decode);
- if(!stringLunga.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
-
- logInfo("\n*** RFC2047 US_ASCII Q (stringa lunga) ***");
- varRFC2047USASCIIQ = encode(stringLunga, Charset.US_ASCII, RFC2047Encoding.Q);
- logInfo("["+stringLunga+ENCODED_IN+Charset.US_ASCII+","+RFC2047Encoding.Q+"): "+varRFC2047USASCIIQ);
- decode = decode(varRFC2047USASCIIQ);
- logInfo(DECODE+decode);
- if(!stringLunga.equals(decode)) {
- throw new UtilsException(VALORE_DIVERSO_SORGENTE);
- }
- }
-
- public static String encode(String value,Charset charset,RFC2047Encoding encoding) throws UtilsException{
- try{
- return MimeUtility.encodeWord(value,charset.getValue(),encoding.name());
- }catch(Exception e){
- throw new UtilsException(e.getMessage(),e);
- }
- }
-
- public static String decode(String value) throws UtilsException{
- try{
- return MimeUtility.decodeText(value);
- }catch(Exception e){
- throw new UtilsException(e.getMessage(),e);
- }
- }
-
- public static boolean isAllCharactersInCharset(String value,Charset charset) throws UtilsException{
- try{
- java.nio.charset.CharsetEncoder encoder =
- java.nio.charset.Charset.forName(charset.getValue()).newEncoder();
- return encoder.canEncode(value);
- }catch(Exception e){
- throw new UtilsException(e.getMessage(),e);
- }
- }
-
-
-
- public static void validHeader(String key, List<String> values) throws UtilsException{
- if(values!=null && !values.isEmpty()) {
- for (String value : values) {
- validHeader(key, value);
- }
- }
- }
- public static void validHeader(String key, String value) throws UtilsException{
-
- // jdk/openjdk/6-b14/sun/net/www/protocol/http/HttpURLConnection.java
-
- char lf = '\n';
- int index = key.indexOf(lf);
- if (index != -1) {
- throw new UtilsException("Found illegal character(s) in message header field ["+key+"]");
- }
- else {
- if (value == null) {
- return;
- }
- index = value.indexOf(lf);
- while (index != -1) {
- index++;
- if (index < value.length()) {
- char c = value.charAt(index);
- if ((c==' ') || (c=='\t')) {
- // ok, check the next occurrence
- index = value.indexOf(lf, index);
- continue;
- }
- }
- throw new UtilsException("Found Illegal character(s) in message header ["+key+"]. Found value: ["+value+"]");
- }
- }
- }
- }