Search in sources :

Example 1 with HeaderWrapper

use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.

the class LocalServiceDiscoveryClient method buildMessage.

/**
 * <p>新建本地发现消息</p>
 *
 * @param infoHashs InfoHash数组
 *
 * @return 本地发现消息
 */
private String buildMessage(String... infoHashs) {
    final String peerId = StringUtils.hex(PeerConfig.getInstance().peerId());
    final HeaderWrapper builder = HeaderWrapper.newBuilder(PROTOCOL);
    builder.header(LocalServiceDiscoveryMessageHandler.HEADER_HOST, SymbolConfig.Symbol.COLON.join(LocalServiceDiscoveryServer.lsdHost(), LocalServiceDiscoveryServer.LSD_PORT)).header(LocalServiceDiscoveryMessageHandler.HEADER_PORT, String.valueOf(SystemConfig.getTorrentPort())).header(LocalServiceDiscoveryMessageHandler.HEADER_COOKIE, peerId);
    for (String infoHash : infoHashs) {
        builder.header(LocalServiceDiscoveryMessageHandler.HEADER_INFOHASH, infoHash);
    }
    return builder.build();
}
Also used : HeaderWrapper(com.acgist.snail.pojo.wrapper.HeaderWrapper)

Example 2 with HeaderWrapper

use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.

the class UpnpMessageHandler method onMessage.

@Override
public void onMessage(String message, InetSocketAddress address) {
    final HeaderWrapper headers = HeaderWrapper.newInstance(message);
    // 判断是否支持UPNP设置
    final boolean support = headers.allHeaders().values().stream().anyMatch(list -> list.stream().anyMatch(value -> StringUtils.startsWith(value, UpnpServer.UPNP_ROOT_DEVICE)));
    if (!support) {
        LOGGER.warn("UPNP设置失败(不支持的驱动):{}", message);
        return;
    }
    final String location = headers.header(HEADER_LOCATION);
    if (StringUtils.isEmpty(location)) {
        LOGGER.warn("UPNP设置失败(没有描述文件地址):{}", message);
        return;
    }
    final UpnpContext upnpContext = UpnpContext.getInstance();
    try {
        upnpContext.load(location);
    } catch (NetException e) {
        LOGGER.error("UPNP端口映射异常:{}", location, e);
    } finally {
        // 可用才能释放:可能收到不是UPNP消息
        if (upnpContext.available()) {
            NatContext.getInstance().unlock();
        }
    }
}
Also used : NatContext(com.acgist.snail.context.NatContext) StringMessageCodec(com.acgist.snail.net.codec.StringMessageCodec) HeaderWrapper(com.acgist.snail.pojo.wrapper.HeaderWrapper) NetException(com.acgist.snail.context.exception.NetException) LoggerFactory(com.acgist.snail.logger.LoggerFactory) UpnpContext(com.acgist.snail.context.UpnpContext) Logger(com.acgist.snail.logger.Logger) UdpMessageHandler(com.acgist.snail.net.UdpMessageHandler) IMessageDecoder(com.acgist.snail.net.codec.IMessageDecoder) StringUtils(com.acgist.snail.utils.StringUtils) InetSocketAddress(java.net.InetSocketAddress) NetException(com.acgist.snail.context.exception.NetException) HeaderWrapper(com.acgist.snail.pojo.wrapper.HeaderWrapper) UpnpContext(com.acgist.snail.context.UpnpContext)

Example 3 with HeaderWrapper

use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.

the class LocalServiceDiscoveryMessageHandler method onMessage.

@Override
public void onMessage(String message, InetSocketAddress address) {
    final HeaderWrapper headers = HeaderWrapper.newInstance(message);
    final String host = address.getHostString();
    final String port = headers.header(HEADER_PORT);
    final String cookie = headers.header(HEADER_COOKIE);
    final List<String> list = headers.headerList(HEADER_INFOHASH);
    if (StringUtils.isNumeric(port) && CollectionUtils.isNotEmpty(list)) {
        final byte[] peerId = StringUtils.unhex(cookie);
        if (Arrays.equals(peerId, PeerConfig.getInstance().peerId())) {
            LOGGER.debug("本地发现消息处理失败:忽略本机");
        } else {
            list.forEach(infoHashHex -> this.doInfoHash(host, port, infoHashHex));
        }
    } else {
        LOGGER.debug("本地发现消息处理失败:{}", message);
    }
}
Also used : HeaderWrapper(com.acgist.snail.pojo.wrapper.HeaderWrapper)

Example 4 with HeaderWrapper

use of com.acgist.snail.pojo.wrapper.HeaderWrapper in project snail by acgist.

the class UpnpClient method buildMSearch.

/**
 * <p>新建M-SEARCH消息</p>
 *
 * @return 消息
 */
private String buildMSearch() {
    final HeaderWrapper builder = HeaderWrapper.newBuilder(PROTOCOL);
    builder.header("HOST", SymbolConfig.Symbol.COLON.join(UpnpServer.upnpHost(), UpnpServer.UPNP_PORT)).header("ST", UpnpServer.UPNP_ROOT_DEVICE).header("MAN", "\"ssdp:discover\"").header("MX", "3");
    return builder.build();
}
Also used : HeaderWrapper(com.acgist.snail.pojo.wrapper.HeaderWrapper)

Aggregations

HeaderWrapper (com.acgist.snail.pojo.wrapper.HeaderWrapper)4 NatContext (com.acgist.snail.context.NatContext)1 UpnpContext (com.acgist.snail.context.UpnpContext)1 NetException (com.acgist.snail.context.exception.NetException)1 Logger (com.acgist.snail.logger.Logger)1 LoggerFactory (com.acgist.snail.logger.LoggerFactory)1 UdpMessageHandler (com.acgist.snail.net.UdpMessageHandler)1 IMessageDecoder (com.acgist.snail.net.codec.IMessageDecoder)1 StringMessageCodec (com.acgist.snail.net.codec.StringMessageCodec)1 StringUtils (com.acgist.snail.utils.StringUtils)1 InetSocketAddress (java.net.InetSocketAddress)1