🌐 URL parsing and manipulation made easy.

Overview

furl

furl is a small Python library that makes parsing and
manipulating URLs easy.

Python's standard urllib and urlparse modules provide a number of URL
related functions, but using these functions to perform common URL
operations proves tedious. Furl makes parsing and manipulating URLs
easy.

Furl is well tested, Unlicensed in the public domain, and supports
Python 2, Python 3, PyPy2, and PyPy3.

Code time: Paths and query arguments are easy. Really easy.

>>> from furl import furl
>>> f = furl('http://www.google.com/?one=1&two=2')
>>> f /= 'path'
>>> del f.args['one']
>>> f.args['three'] = '3'
>>> f.url
'http://www.google.com/path?two=2&three=3'

Or use furl's inline modification methods.

>>> furl('http://www.google.com/?one=1').add({'two':'2'}).url
'http://www.google.com/?one=1&two=2'

>>> furl('http://www.google.com/?one=1&two=2').set({'three':'3'}).url
'http://www.google.com/?three=3'

>>> furl('http://www.google.com/?one=1&two=2').remove(['one']).url
'http://www.google.com/?two=2'

Encoding is handled for you. Unicode, too.

>>> f = furl('http://www.google.com/')
>>> f.path = 'some encoding here'
>>> f.args['and some encoding'] = 'here, too'
>>> f.url
'http://www.google.com/some%20encoding%20here?and+some+encoding=here,+too'
>>> f.set(host=u'ドメイン.テスト', path=u'джк', query=u'☃=☺')
>>> f.url
'http://xn--eckwd4c7c.xn--zckzah/%D0%B4%D0%B6%D0%BA?%E2%98%83=%E2%98%BA'

Fragments also have a path and a query.

>>> f = furl('http://www.google.com/')
>>> f.fragment.path.segments = ['two', 'directories']
>>> f.fragment.args = {'one': 'argument'}
>>> f.url
'http://www.google.com/#two/directories?one=argument'

Or get fancy.

>>> f = furl('http://www.google.com/search?q=query#1')
>>> f.copy().remove(path=True).set(host='taco.com')
...  .join('/pumps.html').add(fragment_path='party').url
'http://taco.com/pumps.html#party'
>>>
>>> f.asdict()
{ 'url': 'http://taco.com/pumps.html#party',
  'scheme': 'http',
  'username': None,
  'password': None,
  'host': 'taco.com',
  'host_encoded': 'taco.com',
  'port': 80,
  'netloc': 'taco.com',
  'origin': 'http://taco.com',
  'path': { 'encoded': '/pumps.html',
            'isabsolute': True,
            'isdir': False,
            'isfile': True,
            'segments': ['pumps.html']},
  'query': { 'encoded': '',
             'params': []},
  'fragment': { 'encoded': 'party',
                'path': { 'encoded': 'party',
                          'isabsolute': False,
                          'isdir': False,
                          'isfile': True,
                          'segments': ['party']},
                'query': { 'encoded': '',
                           'params': []},
                'separator': True}, }

API

See more furl magic and examples in furl's API document, API.md.

Installation

Installing furl with pip is easy.

$ pip install furl
Comments
  • Should percent encode the query key and value when being encoded as str

    Should percent encode the query key and value when being encoded as str

    I use furl(v1.1) in http proxy app, and receive url in server side(the http proxy received from client):

    >>> url_received = 'http://example.com/?redirect=http%3A%2F%2Fwww.example.com%2F'
    >>> parsed = furl.furl(url_received)
    

    After do something with the parsed url, and generate url in client side(to be sent to the real server):

    >>> url_to_be_sent = parsed.url 
    >>> print(url_to_be_sent)
    'http://example.com/?redirect=http://www.example.com/'
    >>> print(url_to_be_sent.query)
    'redirect=http://www.example.com/'
    

    Should the "redirect=http://www.example.com/" part be percent encoded as original query "redirect=http%3A%2F%2Fwww.example.com%2F"?

    opened by xiren7 28
  • test_join test fails

    test_join test fails

    Hey folks. Thanks for your work on this project!

    I wanted to package furl for NixOS, and the build throws this error for me:

    .........................F..................................................
    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/build/furl-2.1.0/tests/test_furl.py", line 2042, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    
    ----------------------------------------------------------------------
    Ran 76 tests in 9.423s
    

    It seems only this single test fails, all others are fine? That leads me to believe it's not a peculiarity of my packaging that's responsible.

    Anyways, for context here's the build nix expression I used:

    { lib, python3, radicale2 }:
    with python3.pkgs;
    
    buildPythonPackage rec {
        pname = "furl";
        version = "2.1.0";
    
        src = fetchPypi {
          inherit pname version;
          sha256 = "08dnw3bs1mk0f1ccn466a5a7fi1ivwrp0jspav9arqpf3wd27q60";
        };
    
        propagatedBuildInputs = [
          orderedmultidict six
        ];
    
        checkInputs = [
          flake8
        ];
    }
    
    opened by Valodim 17
  • we can't choose encoding of final url

    we can't choose encoding of final url

    this module is great and easy when manipulating urls

    adding "encoding" parameter to ".tostr" function would be nice rather than encoding everything in "utf8" since "utf8" is not only option in real life

    thanks

    opened by tuntapovski 10
  • Missing __hash__ method with Python 3.x

    Missing __hash__ method with Python 3.x

    Hi,

    I'm using your module directly and indirectly via the SQLAlchemy-Utils module and its URLType column type which coerces a URL into a furl object.

    I've found an issue when I try and use the URLType type on Python 3.x, I get the following error when I try and query an object using such a column:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/query.py", line 2588, in all
        return list(self)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 86, in instances
        util.raise_from_cause(err)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 189, in raise_from_cause
        reraise(type(exception), exception, tb=exc_tb, cause=exc_value)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/util/compat.py", line 183, in reraise
        raise value
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 71, in instances
        rows = [proc(row) for row in fetch]
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 71, in <listcomp>
        rows = [proc(row) for row in fetch]
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/loading.py", line 379, in _instance
        instance = session_identity_map.get(identitykey)
      File ".../venv-3.5/lib/python3.5/site-packages/sqlalchemy/orm/identity.py", line 146, in get
        if key not in self._dict:
    TypeError: unhashable type: 'furl'
    

    I've managed to fix this by monkeypatching the furl class with a __hash__ method like so:

    from sqlalchemy_utils import URLType
    from furl import furl
    
    def furl_hash(self):
        return hash(self.url)
    
    furl.__hash__ = furl_hash
    
    class Foo(Model):
        url = Column(URLType)
        ...
    

    Would it be possible to add such a method? I'm not sure if I'm 100% correct just using the value of self.url here but it looked close enough.

    opened by bodgit 10
  • Add test for unicode keys and values

    Add test for unicode keys and values

    This implements the test from the comments of https://github.com/gruns/furl/issues/32 and demonstrates a regression (bug was reported in 0.3.mumble, fixed in 0.3.8, and is now broken in 0.4.1 and 0.4.2)

    opened by doismellburning 8
  • New bugs with Python 3.9.2+

    New bugs with Python 3.9.2+

    Python 3.9.1 #121

    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 2060, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    

    Python 3.9.2

    ======================================================================
    FAIL: test_join (test_furl.TestFurl)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 2060, in test_join
        assert f.url == 'wss://slrp.com/foo:1'
    AssertionError
    
    ======================================================================
    FAIL: test_add (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 678, in test_add
        assert q.params.allitems() == runningsum
    AssertionError
    
    ======================================================================
    FAIL: test_params (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 806, in test_params
        assert item1 == item2
    AssertionError
    
    ======================================================================
    FAIL: test_remove (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 720, in test_remove
        assert len(q.params) == 0
    AssertionError
    
    ======================================================================
    FAIL: test_set (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 687, in test_set
        assert q.params.allitems() == items_omd.allitems()
    AssertionError
    
    ======================================================================
    FAIL: test_various (test_furl.TestQuery)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/shadchin/github/furl/tests/test_furl.py", line 650, in test_various
        assert q.params.allitems() == items.allitems()
    AssertionError
    
    opened by shadchin 7
  • [Improvement] Fix code quality issues

    [Improvement] Fix code quality issues

    Description

    Hi :wave: I ran the DeepSource static analyzer on the forked copy of this repo and found some interesting code quality issues. This PR fixes a few of them.

    Summary of changes

    • fixed ambiguous variable names
    • Used literal syntax instead of function calls to create data structure
    • Refactored if expression
    • Refactored unnecessary else / elif when if block has a return statement
    • added .deepsource.toml config
    opened by withshubh 7
  • Why ``furl.set`` call ``self.query.load`` not ``self.query.set``?

    Why ``furl.set`` call ``self.query.load`` not ``self.query.set``?

    In [1]: furl('http://www.google.com/?one=1&two=2').set({'one': 'one'})
    Out[1]: furl('http://www.google.com/?one=one')
    
    In [2]: furl('http://www.google.com/?one=1&two=2').remove('one').add({'one': 'one'})
    Out[2]: furl('http://www.google.com/?two=2&one=one')
    

    How to realize In [2] more simply

    opened by Brightcells 7
  • 'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'

    'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'

    I do not get this error with furl-0.3.7. I get this error with furl-0.4.2.

    In [3]: furl.furl()
    ---------------------------------------------------------------------------
    AttributeError                            Traceback (most recent call last)
    <ipython-input-3-a2bd23daefba> in <module>()
    ----> 1 furl.furl()
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in __init__(self, url, strict)
        847         self.strict = strict
        848 
    --> 849         self.load(url)  # Raises ValueError on invalid url.
        850 
        851     def load(self, url):
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in load(self, url)
        865         # Python 2.7+. In Python <= 2.6, urlsplit() doesn't raise a
        866         # ValueError on malformed IPv6 addresses.
    --> 867         tokens = urlsplit(url)
        868 
        869         self.netloc = tokens.netloc  # Raises ValueError in Python 2.7+.
    
    /Library/Python/2.7/site-packages/furl/furl.pyc in urlsplit(url)
       1308         url = _set_scheme(url, 'http')
       1309     toks = urllib.parse.urlsplit(url)
    -> 1310     return urllib.parse.SplitResult(*_change_urltoks_scheme(toks, original_scheme))
       1311 
       1312 
    
    AttributeError: 'Module_six_moves_urllib_parse' object has no attribute 'SplitResult'
    
    opened by dydt 7
  • encode(dont_quote) & tostr(query_dont_quote) not implemented

    encode(dont_quote) & tostr(query_dont_quote) not implemented

    It appears that the 2 keyword arguments described in the API documentation aren't there yet:

    >>> furl.__version__
    '2.0.0'
    >>> f.query.encode(dont_quote='@')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: encode() got an unexpected keyword argument 'don't_quote'
    >>> f.tostr(query_dont_quote=True)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: tostr() got an unexpected keyword argument 'query_don't_quote'
    
    opened by eyeteajay 6
  • fix get scheme error

    fix get scheme error

    As Below

    In [1]: from furl import urlsplit
    
    In [2]: urlsplit('http://x.com/api/test?url=http://a.com')
    Out[2]: SplitResult(scheme='http', netloc='x.com', path='/api/test', query='url=http://a.com', fragment='')
    
    In [3]: urlsplit('/api/test?url=http://a.com')
    Out[3]: SplitResult(scheme='/api/test?url=http', netloc='a.com', path='', query='', fragment='')
    
    In [4]: from furl import furl
    
    In [5]: furl('http://x.com/api/test?url=http://a.com').query
    Out[5]: Query('url=http://a.com')
    
    In [6]: furl('/api/test?url=http://a.com').query
    Out[6]: Query('')
    

    About Scheme

    I not find any description about scheme's format, just a list of registered schemes.

    • http://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml

    So I just add one line code to check whether ? in beforeColon to solve above problem.

    Preferred Solution

    What's your opinion?

    opened by Brightcells 6
  • Removes

    Removes "git@" from git remote URL

    Hi, ClearML uses furl to remove a user from a git remote URL, so furl removes username when the remote URL is like "ssh://[email protected]:1234/path/to/repo.git" (with "ssh://git@"):

    should I use more specific lib/tool to parse git-like URLs?

    opened by dev-rinchin 0
  • a method to set an individual query parameter without removing the rest or keeping the original value

    a method to set an individual query parameter without removing the rest or keeping the original value

    from furl import furl
    
    
    def url() -> furl:
        return furl("http://foo.com/?a=1&b=2")
    
    
    print(url().set({"a": 3}))  # http://foo.com/?a=3
    print(url().add({"a": 3}))  # http://foo.com/?a=1&b=2&a=3
    
    # i would like to be able do this in one method:
    print(url().remove(["a"]).add({"a": 3}))  # http://foo.com/?b=2&a=3
    

    the current behavior of add where it supports multiple query params with the same value seems like an edge case imo

    opened by DetachHead 0
  • Tolerate and correct IPv6 without brackets

    Tolerate and correct IPv6 without brackets

    This PR is based on #165 and fixes #124. If #124 is too controversial, I can rebase this PR on master, just tell me :)

    Depending on the contexts, people does not always agree on brackets usage with IPv6. For instance, the ipaddress core module handles IPv6 without brackets as do some other low-level python modules. Another example: DNS AAAA records usually handles IPv6 without brackets. However in a URL context, with a port number being optionally associated with an IP, the brackets become mandatory to distinguish the columns inside the IP from the column that separate the port number from the IP.

    As suggested in #124, I think this would be nice if a convenience utility like furl would tolerate and correct any usage. This would allow users to not need to check and correct manually the IPv6 they get from other libraries that may generate IPv6 without brackets because this is relevant in their development context. For instance a DNS SRV record being read with aiodns.

    This is what this PR allows. There is not much code here, everything lies here:

        def host(self, host):
            ...
            if (
                is_valid_ipv6(host)
                and callable_attr(host, 'startswith')
                and callable_attr(host, 'endswith')
                and not host.startswith("[")
                and not host.endswith("]")
            ):
                host = "[" + host + "]"
            ...
    

    This allows this usage:

            f.set(host="::1")
            assert f.host == "[::1]"
            assert f.url == "http://[::1]/"
    
            f.set(host="[::]")
            assert f.host == "[::]"
            assert f.url == "http://[::]/"
    
    opened by azmeuk 0
  • Use ipaddress to detect valid and invalid IPs

    Use ipaddress to detect valid and invalid IPs

    Fixes #164

    This leads to a breaking change: well-formed but invalid IPv6 such as [0:0:0:0:0:0:0:1:1:1:1:1:1:1:1:9999999999999] now raise a ValueError. However one can argue that this is not exactly a behavior change but more a bugfix.

    If you think the breaking change is too hash, I can do another PR that would raise a deprecation warning when a well-formed invalid IPv6 is encountered, to be merged and released before this PR is merged and released.

    What do you think?

    opened by azmeuk 0
  • Use the `ipaddress` module to detect valid IPV6

    Use the `ipaddress` module to detect valid IPV6

    I was surprised to see that furl would allow invalid but well-formed IPV6:

    https://github.com/gruns/furl/blob/774846234ff803606fdd289a7549f9b50b2b3677/tests/test_furl.py#L1658-L1661

    I would suggest to use the IPV6Address object from the python3 ipaddress module to validate IPV6. For python2 I would suggest using the ipaddress backport on pypi.

    If it is OK I would volunteer for a PR. What do you think?

    opened by azmeuk 0
Releases(v2.1.2)
  • v2.1.2(Apr 12, 2021)

    Fixed: Support Python 3.9's changed urllib.parse.urljoin() behavior.

    • < py3.9: furl('wss://slrp.com/').join('foo:1') -> 'wss://slrp.com/foo:1'
    • >= py3.9: furl('wss://slrp.com/').join('foo:1') -> 'foo:1'

    Changed: Drop semicolon query delimiters. See https://bugs.python.org/issue42967. Changed: Drop support for EOL Python 3.4 and Python 3.5.

    Source code(tar.gz)
    Source code(zip)
  • v2.1.1(Apr 9, 2021)

    Fixed: Export metadata variables (furl.__title__, furl.__version__, etc). Added: scheme, host, netloc, and origin as parameters to furl.remove(). Changed: Homogenize parameter order across furl.add(), furl.set(), and furl.remove(). Changed: furl.origin can be assigned None. This has the same behavior as furl.remove(origin=True).

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Sep 20, 2019)

    • Added: a dont_quote= parameter to Query.encode() and a query_dont_quote= parameter to furl.tostr() that exempt valid query characters from being percent-encoded, either in their entirety with dont_quote=True, or selectively with dont_quote=<string>, like dont_quote='/?@_'.

    • Changed: Move package info from __init__.py into the more standard __version__.py.

    • Fixed: Support Unicode usernames and passwords in Python 2.

    • Fixed: Update orderedmultdict to v1.0.1 to resolve a DeprecationWarning.

    • Fixed: Encode '/' consistently in query strings across both quote_plus=True and quote_plus=False.

    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Oct 16, 2018)

    • Added: All URL components (scheme, host, path, etc) to furl()'s constructor as keyword arguments. E.g. f = furl(scheme='http', host='host', path='/lolsup').

    • Changed: furl.truediv() and Path.truediv() now mirror Pathlib.truediv()'s behavior and return a new instance. The original instance is no longer modified. Old behavior: f = furl('1'); f / '2' -> str(f) == '1'. New behavior: f = furl('1'); f /= '2' -> str(f) == '1/2'.

    • Fixed: Path.load() now accepts Path instances, e.g. f.path.load(Path('hi')).

    • Removed: Support for Python 2.6, which reached EOL on 2013-10-29.

    Source code(tar.gz)
    Source code(zip)
  • 1.2.1(Aug 22, 2018)

  • v1.2(Jun 29, 2018)

    • Added: Path segment appending via the division operator (__truediv__()).
    • Changed: Bump orderedmultidict dependency to v1.0.
    • Changed: Check code style with flake8 instead of pycodestyle.
    • Changed: Percent-encode all non-unreserved characters in Query key=value pairs, including valid query characters (e.g. =, ?, etc). Old encoding: ?url=http://foo.com/; new encoding: ?url=http%3A%2F%2Ffoo.com%2F. Equal signs remain decoded in query values where the key is empty to allow for, and preserve, queries like ?==3==.
    Source code(tar.gz)
    Source code(zip)
  • v1.1(May 31, 2018)

    • Fixed: Support and preserve all query strings as provided. For example, preserve the query &&== of http://foo.com?&&== as-is. Empty key=value pairs are stored as ('', None) in Query.params, e.g. [('', None), ('', None)] for the query &.
    • Changed: Don't encode equal signs (=) in query values if the key is empty. That is, allow and preserve queries like ?==3== while also percent encoding equal signs in query values with an associted key, as expected. E.g. ?a=1%3D1.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.2(May 28, 2018)

    • Added: strip_scheme() public function.
    • Changed: Make get_scheme() and set_scheme() functions public.
    • Added: Support all schemes without a netloc/authority, like mailto:[email protected], without an explicit whitelist of such schemes (e.g. tel:, sms:, mailto:, etc).
    • Fixed: Restore furl.url's setter method. E.g. furl.url = 'http://www.foo.com/'.
    • Removed: Support for Python 3.3, which reached EOL on 2017-09-29.
    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Nov 20, 2017)

  • v1.0.0(Nov 20, 2017)

    • Added: Test against Python 3.6.
    • Changed: Bumped the version number to v1.0 to signify that furl is a mature and stable library. Furl has been marked Production/Stable in setup.py for a long time anyhow -- it's high time for the version number to catch up.
    Source code(tar.gz)
    Source code(zip)
  • v0.5.7(Mar 1, 2017)

  • 0.5.6(Oct 23, 2016)

  • 0.5.3(Sep 23, 2016)

  • v0.5.2(Aug 14, 2016)

  • v0.5.1(Jun 29, 2016)

Owner
Ansgar Grunseid
Ansgar Grunseid
UDdup - URLs Deduplication Tool

UDdup - URLs Deduplication Tool The tool gets a list of URLs, and removes "duplicate" pages in the sense of URL patterns that are probably repetitive

Rotem Reiss 128 Dec 21, 2022
coURLan: Clean, filter, normalize, and sample URLs

coURLan: Clean, filter, normalize, and sample URLs Why coURLan? “Given that the bandwidth for conducting crawls is neither infinite nor free, it is be

Adrien Barbaresi 20 Dec 14, 2022
Ukiyo - A simple, minimalist and efficient discord vanity URL sniper

Ukiyo - a simple, minimalist and efficient discord vanity URL sniper. Ukiyo is easy to use, has a very visually pleasing interface, and has great spee

13 Apr 14, 2022
declutters url lists for crawling/pentesting

uro Using a URL list for security testing can be painful as there are a lot of URLs that have uninteresting/duplicate content; uro aims to solve that.

Somdev Sangwan 677 Jan 07, 2023
a little project to make custom discord invites over a url

custom-dc-invite a little project to make custom discord invites over a url how it works you create a account for

baum1810 2 Oct 03, 2022
Yet another URL library

Yet another URL library

aio-libs 884 Jan 03, 2023
Use this module to detect if a URL is on discord's phishing list.

PhishDetector This module was made so you can check a URL and see if it's in discord's official list of phishing and suspicious URLs. Installation pip

Elijah 4 Mar 25, 2022
hugeURLer 是一个基于 Python 和 GitHub action 的短链接服务

hugeURLer 是一个基于 Python 和 GitHub action 的短链接服务 如何使用 您需要把库 clone 到本地,然后在终端执行 python3 .\src\addNewRedirection.py url ,就能创建一个指向你设置的 url 的跳转页面。

安东尼洪 2 Dec 22, 2021
Temporary-shortner - A webapp that shortner URLs but for limited time

temporary-shortner A webapp that shortens URLs but for a limited time Demo site

Vitor 2 Jan 07, 2022
A simple URL shortener built with Flask

A simple URL shortener built with Flask and MongoDB.

Mike Lowe 2 Feb 05, 2022
🌐 URL parsing and manipulation made easy.

furl is a small Python library that makes parsing and manipulating URLs easy. Python's standard urllib and urlparse modules provide a number of URL re

Ansgar Grunseid 2.4k Jan 04, 2023
Astra is a tool to find URLs and secrets.

Astra finds urls, endpoints, aws buckets, api keys, tokens, etc from a given url/s. It combines the paths and endpoints with the given domain and give

Stinger 198 Dec 27, 2022
A simple, immutable URL class with a clean API for interrogation and manipulation.

purl - A simple Python URL class A simple, immutable URL class with a clean API for interrogation and manipulation. Supports Pythons 2.7, 3.3, 3.4, 3.

David Winterbottom 286 Jan 02, 2023
This is a no-bullshit file hosting and URL shortening service that also runs 0x0.st. Use with uWSGI.

This is a no-bullshit file hosting and URL shortening service that also runs 0x0.st. Use with uWSGI.

mia 1.6k Dec 31, 2022
A tool programmed to shorten links/mask links

A tool programmed to shorten links/mask links

Anontemitayo 6 Dec 02, 2022
A friendly library for parsing HTTP request arguments, with built-in support for popular web frameworks, including Flask, Django, Bottle, Tornado, Pyramid, webapp2, Falcon, and aiohttp.

webargs Homepage: https://webargs.readthedocs.io/ webargs is a Python library for parsing and validating HTTP request objects, with built-in support f

marshmallow-code 1.3k Jan 01, 2023
Have you ever wondered: Where does this link go? The REDLI Tool follows the path of the URL.

Have you ever wondered: Where does this link go? The REDLI Tool follows the path of the URL. It allows you to see the complete path a redirected URL goes through. It will show you the full redirectio

JAYAKUMAR 28 Sep 11, 2022
A URL builder for genius :D

genius-url A URL builder for genius :D Usage from gurl import genius_url

ꌗᖘ꒒ꀤ꓄꒒ꀤꈤꍟ 12 Aug 14, 2021
Fast pattern fetcher, Takes a URLs list and outputs the URLs which contains the parameters according to the specified pattern.

Fast Pattern Fetcher (fpf) Coded with 3 by HS Devansh Raghav Fast Pattern Fetcher, Takes a URLs list and outputs the URLs which contains the paramete

whoami security 5 Feb 20, 2022
ShortenURL-model - The model layer class for shorten url service

ShortenURL Model The model layer class for shorten URL service Usage Complete th

TwinIsland 1 Jan 07, 2022