export const useWebhook = (
path: string,
onDisconnect?: () => void,
override?: WebhookOverride
): WebhookHookOutput => {
const cache = useGlobalCache()
const { accessToken, userId } = override ?? cache
const [connectedUserId, setConnectedUserId] = useState<string>()
const [attempts, setAttempts] = useState<number>(1)
const [isConnected, setIsConnected] = useState(false)
const [isLogged, setIsLogged] = useState(false)
const [socket, setSocket] = useState<Socket>()
useEffect(() => {
if (!userId || (connectedUserId && connectedUserId !== userId)) {
setConnectedUserId(undefined)
setIsConnected(false)
setSocket(undefined)
return
}
if (!socket) {
setSocket(
accessToken && accessToken.length && tokenStillValid(accessToken)
? io(`${process.env.baseurl}${path}`, {
path,
transports: ["websocket"],
auth: {
Authorization: `Bearer ${accessToken}`
},
extraHeaders: socketConfig.extraHeaders,
autoConnect: false
})
: undefined
)
setIsLogged(!!accessToken && !!accessToken.length)
setConnectedUserId(userId)
}
}, [accessToken, connectedUserId, path, socket, userId])
useEffect(() => {
if (socket) {
socket.on("connect", () => {
setIsConnected(true)
setAttempts(0)
})
socket.on("disconnect", () => {
onDisconnect?.()
setIsConnected(false)
setSocket(undefined)
})
socket.connect()
return () => {
socket.off("connect")
socket.off("disconnect")
socket.disconnect()
}
}
}, [onDisconnect, socket])
useEffect(() => {
if (socket && !isConnected && attempts < 10) {
socket.connect()
const interval = setTimeout(() => {
setAttempts(attempts + 1)
}, 5000)
return () => clearInterval(interval)
}
}, [isConnected, attempts, socket])
return useMemo(
// memo necessary to avoid app wide rerenders
() => ({
isConnected: isConnected || attempts === 0,
isLogged,
socket,
setSocket,
userId
}),
[isConnected, isLogged, attempts, socket, userId]
)
}
同一套程序,web端可以正常连接到websocket服务器,而如果是react-native则会报服务器内部错误,刚开始我以为是https证书的问题,本地模拟了一个https服务,结果也能正常访问,最后发现是服务器防火墙拒绝了访问,
Firewall 拒绝没有 User-Agent 字段的访问通常是出于安全和筛选流量的考虑。User-Agent 字符串在 HTTP 请求中扮演重要角色,它提供了关于发起请求的客户端(如浏览器或应用程序)的信息。以下是一些原因,说明为什么缺少 User-Agent 可能导致 Firewall 拒绝访问:
- 安全筛选
识别恶意软件:某些恶意软件和爬虫可能不发送标准的 User-Agent 字符串。Firewalls 和安全系统可能会拒绝没有 User-Agent 的请求,以防止此类恶意活动。
防止自动化攻击:自动化的网络攻击(如 DDoS 攻击)可能不会包括 User-Agent 字符串。拒绝这些请求可以作为一种防御措施。 - 流量管理
区分人类和非人类流量:没有 User-Agent 的请求可能被视为非人类流量(如脚本或爬虫),而某些服务可能只想为人类用户提供服务。
分析和日志记录:User-Agent 信息对于理解和分析网站流量至关重要。缺少此信息可能使得流量管理和日志记录变得更加困难。 - 兼容性和规范
遵守协议:虽然 HTTP 规范没有强制要求每个请求都必须包含 User-Agent 字段,但许多网站和应用仍然期望它,并可能基于此设计了安全策略。
确保内容适配:在某些情况下,服务器可能根据 User-Agent 来决定发送什么样的内容或格式。 - 配置和策略
特定的网络策略:某些网络环境或组织可能有特定的策略,要求所有请求都必须包含 User-Agent 字段,作为访问控制的一部分。