예제 #1
0
struct Address *
listener_lookup_server_address(const struct Listener *listener,
        const char *name, size_t name_len) {
    struct Address *new_addr = NULL;
    short set_to_fallback = 0;
    const struct Address *addr =
        table_lookup_server_address(listener->table, name, name_len);

    if (addr == NULL)
        addr = listener->fallback_address;

    if (addr == NULL)
        return NULL;

    int port = address_port(addr);

    if (address_is_wildcard(addr)) {
        new_addr = new_address(name);
        if (new_addr == NULL) {
            warn("Invalid hostname %.*s in client request",
                    (int)name_len, name);
            set_to_fallback = 1;
        } else if (address_is_sockaddr(new_addr)) {
            warn("Refusing to proxy to socket address literal %.*s in request",
                    (int)name_len, name);
            set_to_fallback = 1;
        }

        if (!set_to_fallback && port != 0)
            address_set_port(new_addr, port);
    } else {
        size_t len = address_len(addr);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);
            set_to_fallback = 1;
        }

        memcpy(new_addr, addr, len);
    }

    if (set_to_fallback) {
        size_t len = address_len(listener->fallback_address);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);
            return NULL;
        }
        memcpy(new_addr, listener->fallback_address, len);
    }
    
    if (!set_to_fallback && port == 0)
        address_set_port(new_addr, address_port(listener->address));

    return new_addr;
}
예제 #2
0
struct Address *
listener_lookup_server_address(const struct Listener *listener,
        const char *name, size_t name_len) {
    struct Address *new_addr = NULL;
    const struct Address *addr =
        table_lookup_server_address(listener->table, name, name_len);

    if (addr == NULL)
        addr = listener->fallback_address;

    if (addr == NULL)
        return NULL;

    int port = address_port(addr);

    if (address_is_wildcard(addr)) {
        new_addr = new_address(name);
        if (new_addr == NULL) {
            warn("Invalid hostname %.*s", (int)name_len, name);

            return listener->fallback_address;
        }

        if (port != 0)
            address_set_port(new_addr, port);
    } else {
        size_t len = address_len(addr);
        new_addr = malloc(len);
        if (new_addr == NULL) {
            err("%s: malloc", __func__);

            return listener->fallback_address;
        }

        memcpy(new_addr, addr, len);
    }

    if (port == 0)
        address_set_port(new_addr, address_port(listener->address));

    return new_addr;
}