LorenEteval / Furious

A GUI proxy client based on PySide6. Support Xray-core & hysteria
GNU General Public License v3.0
972 stars 86 forks source link

h2 configs connection #57

Closed khashayarxy closed 10 months ago

khashayarxy commented 10 months ago

Hello, hope you are well :)

The app seems to have an issue with h2 configs. I have recently added "vless h2 reality" configs to my subscription and they don't work on Furious.

These configs work with other apps like Nekoray.

Please kindly look into this, thanks.

LorenEteval commented 10 months ago

Examples. No time for guessing problems like #53 again.

khashayarxy commented 10 months ago

What do you mean by examples?

khashayarxy commented 10 months ago

After connecting to h2 servers there is no internet at all.

LorenEteval commented 10 months ago

This project currently does not have an issue template. So what I mean is your configuration in URI or JSON format. There's no use for me just providing some stream type isn't working.

khashayarxy commented 10 months ago

Ok so I found the problem in json config. My h2 server doesn't have "host address" on my side. When I import it to Furious it fills "empty host address" with "server address".

here's the config: vless://f8ed56d0-6ca2-4666-8ee2-f24f8f47abd6@example.com:443?security=reality&encryption=none&pbk=KKJRn45F3dZpCmRBZk1K1RCeWI80Cy30nkJ_i6S19mY&fp=chrome&type=h2&sni=mega.io&sid=721f9e372064136a#TEST

khashayarxy commented 10 months ago

I can confirm that deleting the host part in json config resolved the issue in Furious.

"host": [
            "example.com"
          ],
LorenEteval commented 10 months ago

The issue seems not on the application side. Please confirm:

a. Parsing URI to client config follows a URI standard as posted here. In 4.3.3 part:

4.3.3 (HTTP/2) host
客户端进行 HTTP/2 通信时所发送的 Host 头部。

省略时复用 remote-host,但不可以为空字符串。

4.3.3 (HTTP/2) host
The Host header sent by the client during HTTP/2 communication.

When omitted, remote-host is reused, but it cannot be an empty string.

Implementation based on the standard, which uses remote_host as host by default:

https://github.com/LorenEteval/Furious/blob/bf27577000d53f9d28cd0867a09018dbfd8e8068/Furious/Core/Configuration.py#L627-L637

b. The host part is defined here, which requires:

若不写 "httpSettings" 或 "host": [] 值留空时,会使用默认值 "www.example.com",需要两端 "host" 值一致才能连接成功。"host": [""] 不是值留空。

If "httpSettings" is not written or the "host": [] value is left blank, the default value "www.example.com" will be used. The "host" value on both ends needs to be consistent for the connection to be successful. "host": [""] is not a value left blank.

So to solve this, you might want to specify consistent host value on the server side, since the application will always fill host value as remote_host by default according to standard.

khashayarxy commented 10 months ago

We have reported this issue to the Streisand team, and they have fixed it.

As I mentioned earlier, Nekoray works fine with this type of server. they fixed h2 issues several times in their latest releases.

It also works on v2rayN (v6.32), v2rayNG (v1.8.12), NekoBox (v.1.2.9), Shadowrocket (v2.2.44) and other apps.

So I'm sure there's a way around this on your side. as I did with Furious built-in Editor and it worked.

khashayarxy commented 10 months ago

here's some (real-delay test) and (download/connection test) from v2rayN, NekoRay and Furious.

Edit: (The dates on v2rayN and NekoRay refers to that version release date and I censored addresses for privacy)

v2rayN

NekoRay

Furious

LorenEteval commented 10 months ago

I don't care if other client follows the standard or not. I don't see any workaround on the application. If you want to use www.example.com as host, then explicitly specify this.

khashayarxy commented 10 months ago

I think this could be the solution.

if self.protocol == 'vless':
        host = self.remote_host or host

this basically uses remote_host if available otherwise falls back to host.

khashayarxy commented 10 months ago

or maybe this

self.remote_host = remote_host or host
LorenEteval commented 10 months ago

You are writing some alien logic. If you think there's bug in the code then create a PR and fix it.