HTTP 403 bei HTTPSUrlConnection

ErfinderLabyrinth

Bekanntes Mitglied
Hi,
ich möchte ein Programm schreiben, wo man eine http/https Adresse eingibt und den html code der Seite bekommt. bei http funktioniert es einwandfrei, aber bei https gibt es bei manchen Seiten Probleme z.B. mit der curseforge.com Seite, hier bekomme ich immer den 403 Response Code zurück. Was muss ich anderst machen?
Code:
Java:
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://" + URLEncoder.encode("curseforge.com"));
        System.out.println(url.openConnection().getClass().getName());
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setRequestProperty("Connection", "keep-alives");
        con.setRequestProperty("DNT", "1");
        con.setRequestProperty("Prefer", "safe");
        con.setRequestProperty("Upgrade-Insecure-Requests", "1");
        con.addRequestProperty("User-Agent", "Mozilla/4.0");
        con.addRequestProperty("sec-ch-ua", "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"103\", \"Chromium\";v=\"103\"");
        con.addRequestProperty("sec-ch-ua-mobile", "?0");
        con.addRequestProperty("sec-ch-ua-platform", "\"Windows\"");
        con.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,q=0.8,application/signed-exchange;v=b3;q=0.9");
        con.addRequestProperty("Sec-Fetch-Site", "none");
        con.addRequestProperty("Sec-Fetch-Mode", "navigate");
        con.addRequestProperty("Sec-Fetch-User", "?1");
        con.addRequestProperty("Sec-Fetch-Dest", "document");
        con.addRequestProperty("Accept-Encoding", "gzip, deflate, br");
        con.addRequestProperty("Accept-Language", "de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
        con.connect();
        System.out.println(con.getResponseCode());
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getErrorStream()));
        String msg;
        while ((msg =reader.readLine()) != null) {
            System.out.println(msg);
        }
PS: bei den letzten drei Zeilen bekomme ich folgenden Text
Screenshot 2022-08-15 143216.jpg
Ich weiß nicht, wie es euch geht, aber ich verstehe hier nur Bahnhof. Wie kann man den Text leserlich decoden oder ist es gar nicht gewollt, dass man ihn decoden kann(Wenn ja, warum?)?
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe das mal kurz angetestet und curseforge sedet bei https Requests offenbar erst ein 403 mit einer Seite mit Scripts.

Die werden aber bei Dir nicht decodiert - frag mich nicht wieso.

Du kannst die ganzen Requests Properties erst einmal raus nehmen und dann bekommst du den 403 mit der Seite angezeigt.
 

ErfinderLabyrinth

Bekanntes Mitglied
Ich kann den Inputstream nicht öffnen, wenn die Seite eine 403 sendet, das wir eine Exception geworfen.
Code:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 403 for URL: https://curseforge.com
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2048)
    at java.base/sun.net.www.protocol.http.HttpURLConnection$10.run(HttpURLConnection.java:2043)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:569)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:2042)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1609)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:224)
    at testdownloader.test.main(test.java:76)
Caused by: java.io.IOException: Server returned HTTP response code: 403 for URL: https://curseforge.com
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1997)
    at java.base/sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1589)
    at java.base/java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:529)
    at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:308)
    at testdownloader.test.main(test.java:75)
Kannst du mir bitte ein Code geben, wo es funktioniert und man den html code lesen kann
 

KonradN

Super-Moderator
Mitarbeiter
Dein Code - hatte nur testweise as url encode rausgenommen und halt die RequestProperty Elemente auskommentiert:
Java:
package de.kneitzel;

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;

public class Test {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://curseforge.com/");
        System.out.println(url.openConnection().getClass().getName());
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
/*        con.setRequestProperty("Connection", "keep-alives");
        con.setRequestProperty("DNT", "1");
        con.setRequestProperty("Prefer", "safe");
        con.setRequestProperty("Upgrade-Insecure-Requests", "1");
        con.addRequestProperty("User-Agent", "Mozilla/4.0");
        con.addRequestProperty("sec-ch-ua", "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"103\", \"Chromium\";v=\"103\"");
        con.addRequestProperty("sec-ch-ua-mobile", "?0");
        con.addRequestProperty("sec-ch-ua-platform", "\"Windows\"");
        con.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,q=0.8,application/signed-exchange;v=b3;q=0.9");
        con.addRequestProperty("Accept-Encoding", "gzip, deflate, br");
        con.addRequestProperty("Accept-Language", "de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
*/
        con.connect();
        System.out.println(con.getResponseCode());
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getErrorStream()));
        String msg;
        while ((msg = reader.readLine()) != null) {
            System.out.println(msg);
        }
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Ach ja - auch direkt noch der Test, ob es daran lag: Einfach mal das gzip entfernt in der Auflistung:
Java:
package de.kneitzel;

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;

public class Test {
    public static void main(String[] args) throws IOException {
        URL url = new URL("https://curseforge.com/");
        System.out.println(url.openConnection().getClass().getName());
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setRequestProperty("Connection", "keep-alives");
        con.setRequestProperty("DNT", "1");
        con.setRequestProperty("Prefer", "safe");
        con.setRequestProperty("Upgrade-Insecure-Requests", "1");
        con.addRequestProperty("User-Agent", "Mozilla/4.0");
        con.addRequestProperty("sec-ch-ua", "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"103\", \"Chromium\";v=\"103\"");
        con.addRequestProperty("sec-ch-ua-mobile", "?0");
        con.addRequestProperty("sec-ch-ua-platform", "\"Windows\"");
        con.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,q=0.8,application/signed-exchange;v=b3;q=0.9");
        con.addRequestProperty("Accept-Encoding", "deflate, br");
        con.addRequestProperty("Accept-Language", "de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
        con.connect();
        System.out.println(con.getResponseCode());
        BufferedReader reader = new BufferedReader(new InputStreamReader(con.getErrorStream()));
        String msg;
        while ((msg = reader.readLine()) != null) {
            System.out.println(msg);
        }
    }
}

Und siehe da, man bekommt nun auch die lesbare Ausgabe.
 

KonradN

Super-Moderator
Mitarbeiter
Und aus Langeweile weil ich etwas auf meine Frau warten darf:
  • Wenn der Status >= 400 ist, dann wird der error Stream genommen, sondern der input stream
  • Wenn content encoding "gzip" ist, dann entpacken wir das.

Java:
package de.kneitzel;

import javax.net.ssl.HttpsURLConnection;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Objects;
import java.util.zip.GZIPInputStream;

public class HttpTest {

    public static void main(String[] args) throws IOException {
        URL url = new URL("https://" + URLEncoder.encode("curseforge.com"));
        System.out.println(url.openConnection().getClass().getName());
        HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
        con.setRequestProperty("Connection", "keep-alives");
        con.setRequestProperty("DNT", "1");
        con.setRequestProperty("Prefer", "safe");
        con.setRequestProperty("Upgrade-Insecure-Requests", "1");
        con.addRequestProperty("User-Agent", "Mozilla/4.0");
        con.addRequestProperty("sec-ch-ua", "\" Not;A Brand\";v=\"99\", \"Microsoft Edge\";v=\"103\", \"Chromium\";v=\"103\"");
        con.addRequestProperty("sec-ch-ua-mobile", "?0");
        con.addRequestProperty("sec-ch-ua-platform", "\"Windows\"");
        con.addRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,q=0.8,application/signed-exchange;v=b3;q=0.9");
        con.addRequestProperty("Sec-Fetch-Site", "none");
        con.addRequestProperty("Sec-Fetch-Mode", "navigate");
        con.addRequestProperty("Sec-Fetch-User", "?1");
        con.addRequestProperty("Sec-Fetch-Dest", "document");
        con.addRequestProperty("Accept-Encoding", "gzip, deflate, br");
        con.addRequestProperty("Accept-Language", "de,de-DE;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6");
        con.connect();
        System.out.println("Response Code: " + con.getResponseCode());
        System.out.println("Content Encoding: " + con.getContentEncoding());

        InputStream stream;
        if (con.getResponseCode() >= 400) {
            stream = con.getErrorStream();
        } else {
            stream  = con.getInputStream();
        }

        if (Objects.equals("gzip", con.getContentEncoding())) {
            stream = new GZIPInputStream(stream);
        }

        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));

        String msg;
        while ((msg = reader.readLine()) != null) {
            System.out.println(msg);
        }
    }
}
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben