A very-very simple url shortener for Rust

Overview

urlshortener-rs

MIT licensed

A very simple urlshortener for Rust.

This library aims to implement as much URL shortener services as possible and to provide an interface as minimal and simple as possible. For easing pain with dependency hell, the library provides request objects since 0.9.0 version which can be used for performing requests via user http-client library.

Implementations

Currently the following URL shorteners are implemented:

With authentication:

  • goo.gl
  • bit.ly
  • kutt.it (supports self hosting)

Without authentication:

  • bn.gy
  • is.gd
  • v.gd
  • bam.bz
  • fifo.cc
  • tiny.ph
  • tny.im
  • s.coop
  • bmeo.org
  • hmm.rs
  • url-shortener.io

The following services are supported, but are discouraged from use, due to restrictions such as rate limits:

  • tinyurl.com
  • psbe.co
  • rlu.ru
  • sirbz.com
  • hec.su
  • abv8.me
  • nowlinks.net

Usage without "client" feature

You can make a Request object without "client" feature only via provider functions:

extern crate urlshortener;

use urlshortener::providers::{Provider, self};

fn main() {
    let long_url = "https://google.com";
    let key = "MY_API_KEY";
    let req = providers::request(long_url, &Provider::GooGl { api_key: key.to_owned() });
    println!("A request object for shortening URL via GooGl: {:?}", req);
}

Usage with "client" feature

Without authentication

extern crate urlshortener;

use urlshortener::client::UrlShortener;

fn main() {
    let us = UrlShortener::new().unwrap();
    let long_url = "https://google.com";
    println!("Short url for google: {:?}", us.try_generate(long_url, None));
}

With authentication (Goo.Gl)

extern crate urlshortener;

use urlshortener::{ client::UrlShortener, providers::Provider };

fn main() {
    let us = UrlShortener::new().unwrap();
    let long_url = "https://google.com";
    let key = "MY_API_KEY";
    println!("Short url for google: {:?}", us.generate(long_url, Provider::GooGl { api_key: key.to_owned() }));
}

Combined (Goo.Gl + Is.Gd)

extern crate urlshortener;

use urlshortener::{ client::UrlShortener, providers::Provider };

fn main() {    
    let us = UrlShortener::new().unwrap();
    let providers = vec![
        Provider::GooGl { api_key: "MY_API_KEY".to_owned() },
        Provider::IsGd,
    ];
    let long_url = "https://rust-lang.org";
    println!("Short url for google: {:?}", us.try_generate(long_url, Some(providers)));
}

License

This project is licensed under the MIT license.

Comments
  • Provider: kutt.it

    Provider: kutt.it

    How about support for kutt.it? This would be cool because it's a shortener that is open-source and easily self hosted in contrast to the current list of supported shorteners. A kutt.it instance provides an API and uses an API key.

    What do you think? I might have some time to implement a provider for this.

    opened by timvisee 4
  • Parsing issue with bit.ly when long url contains

    Parsing issue with bit.ly when long url contains "#"

    ex: Long Url: google.com/asd#123 Output : {"status_code":200,"status_txt":"OK","data":{"url":"http://bit.ly/2nYsQDH","hash":"2nYsQDH","global_hash":"ipdYoe","long_url":"http://google.com/asd","new_hash":0}}

    bug junior job good first issue 
    opened by arshubham 3
  • Add Kutt provider

    Add Kutt provider

    This PR adds the kutt.it provider.

    It supports custom hosts through an optional host field.

    The provider definition looks like this:

    https://github.com/vityafx/urlshortener-rs/blob/c3dd0fcc7c31659e4833cfab454c6841178d2fff/src/providers.rs#L170-L176

    Please note that I've added a headers field to the Request object, because a kutt.it request needs to have an API key header set. This somewhat overlaps with the user_agent field.

    Fixes #16

    opened by timvisee 2
  • Update reqwest requirement from 0.8 to 0.9

    Update reqwest requirement from 0.8 to 0.9

    Updates the requirements on reqwest to permit the latest version.

    Release notes

    Sourced from reqwest's releases.

    v0.9.0

    Features

    • Upgrade to tokio 0.1.
    • Upgrade to hyper 0.12.
    • Upgrade to native-tls 0.2.
    • Add ClientBuilder::danger_accept_invalid_certs(bool) to disable certificate verification.
    • Add RequestBuilder::bearer_auth(token) to ease sending bearer tokens.
    • Add headers() and headers_mut() to multipart::Part to allow sending extra headers for a specific part.
    • Moved request::unstable::async to reqwest::async.

    Fixes

    • Fix panicking when passing a Url with a file:// scheme. Instead, an Error is returned.

    Breaking Changes

    • Changed ClientBuilder::danger_disable_hostname_verification() to ClientBuilder::danger_accept_invalid_hostnames(bool).

    • Changed ClientBuilder to be a by-value builder instead of by-ref.

      For single chains of method calls, this shouldn't affect you. For code that conditionally uses the builder, this kind of change is needed:

      // Old
      let mut builder = ClientBuilder::new();
      if some_val {
          builder.gzip(false);
      }
      let client = builder.build()?;
      
      // New
      let mut builder = ClientBuilder::new();
      if some_val {
          builder = builder.gzip(false);
      }
      let client = builder.build()?;
      
    • Changed RequestBuilder to be a by-value builder of by-ref.

      See the previous note about ClientBuilder for affected code and how to change it.

    • Removed the unstable cargo-feature, and moved reqwest::unstable::async to reqwest::async.

    • Changed multipart::Part::mime() to mime_str().

    ... (truncated)
    Changelog

    Sourced from reqwest's changelog.

    v0.9.0

    Features

    • Upgrade to tokio 0.1.
    • Upgrade to hyper 0.12.
    • Upgrade to native-tls 0.2.
    • Add ClientBuilder::danger_accept_invalid_certs(bool) to disable certificate verification.
    • Add RequestBuilder::bearer_auth(token) to ease sending bearer tokens.
    • Add headers() and headers_mut() to multipart::Part to allow sending extra headers for a specific part.
    • Moved request::unstable::async to reqwest::async.

    Fixes

    • Fix panicking when passing a Url with a file:// scheme. Instead, an Error is returned.

    Breaking Changes

    • Changed ClientBuilder::danger_disable_hostname_verification() to ClientBuilder::danger_accept_invalid_hostnames(bool).

    • Changed ClientBuilder to be a by-value builder instead of by-ref.

      For single chains of method calls, this shouldn't affect you. For code that conditionally uses the builder, this kind of change is needed:

      // Old
      let mut builder = ClientBuilder::new();
      if some_val {
          builder.gzip(false);
      }
      let client = builder.build()?;
      
      // New
      let mut builder = ClientBuilder::new();
      if some_val {
          builder = builder.gzip(false);
      }
      let client = builder.build()?;
      
    • Changed RequestBuilder to be a by-value builder of by-ref.

      See the previous note about ClientBuilder for affected code and how to change it.

    • Removed the unstable cargo-feature, and moved reqwest::unstable::async to reqwest::async.

    • Changed multipart::Part::mime() to mime_str().

    ... (truncated)
    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 2
  • Update to reqwest 0.8

    Update to reqwest 0.8

    Also ran cargo fmt with the newest rustfmt-nightly.

    This is a breaking change, because the reqwest error that is returned from some functions has changed.

    opened by ParadoxSpiral 2
  • Upgrade to GitHub-native Dependabot

    Upgrade to GitHub-native Dependabot

    Dependabot Preview will be shut down on August 3rd, 2021. In order to keep getting Dependabot updates, please merge this PR and migrate to GitHub-native Dependabot before then.

    Dependabot has been fully integrated into GitHub, so you no longer have to install and manage a separate app. This pull request migrates your configuration from Dependabot.com to a config file, using the new syntax. When merged, we'll swap out dependabot-preview (me) for a new dependabot app, and you'll be all set!

    With this change, you'll now use the Dependabot page in GitHub, rather than the Dependabot dashboard, to monitor your version updates, and you'll configure Dependabot through the new config file rather than a UI.

    If you've got any questions or feedback for us, please let us know by creating an issue in the dependabot/dependabot-core repository.

    Learn more about migrating to GitHub-native Dependabot

    Please note that regular @dependabot commands do not work on this pull request.

    dependencies 
    opened by dependabot-preview[bot] 1
  • Update reqwest requirement from 0.9 to 0.10

    Update reqwest requirement from 0.9 to 0.10

    Updates the requirements on reqwest to permit the latest version.

    Release notes

    Sourced from reqwest's releases.

    v0.10.0

    • Add std::future::Future support.

    • Add wasm32-unknown-unknown support (with fewer features).

    • Add ability to pass async Response as the body of another Request.

    • Add Body::as_bytes() method.

    • Add Response::bytes_stream() method to get body as an impl Stream.

    • Add Request::try_clone() method.

    • Change default Client API to async. The previous blocking client API is avaialble at reqwest::blocking.

    • Change to no longer send a default User-Agent header. Add one via ClientBuilder::user_agent().

    • Change to enable system/environment proxy detection by default.

    • Change default-tls feature to only include ClientBuilder options that both native-tls and rustls support.

    • Change default feature set to reduce unnecessary dependencies. Most features are disabled by default:

      • blocking: The reqwest::blocking (synchronous) client API.
      • cookies: Cookie store support.
      • gzip: Automatic response body decompression.
      • json: Request and response JSON body methods.
      • stream: futures::Stream support.
    • Change Error internal design, removing several Error::is_* inspector methods.

    • Change Redirect API:

      • Renamed types to be part of the redirect module (for example, reqwest::RedirectPolicy is now reqwest::redirect::Policy).
      • Removed loop_detected and too_many_redirect methods from redirect::Attempt, replaced with a generic error method.
      • The default policy no longer specifically looks for redirect loops (but they should be caught by the maximum limit).
    • Fix checking HTTP_PROXY environment variable if it the environment is from a CGI script.

    • Fix removal of username/password of parsed proxy URL.

    • Update url to v2.0.

    • Update hyper to v0.13.

    • Update http to v0.2.

    Changelog

    Sourced from reqwest's changelog.

    v0.10.0

    • Add std::future::Future support.

    • Add wasm32-unknown-unknown support (with fewer features).

    • Add ability to pass async Response as the body of another Request.

    • Add Body::as_bytes() method.

    • Add Response::bytes_stream() method to get body as an impl Stream.

    • Add Request::try_clone() method.

    • Change default Client API to async. The previous blocking client API is avaialble at reqwest::blocking.

    • Change to no longer send a default User-Agent header. Add one via ClientBuilder::user_agent().

    • Change to enable system/environment proxy detection by default.

    • Change default-tls feature to only include ClientBuilder options that both native-tls and rustls support.

    • Change default feature set to reduce unnecessary dependencies. Most features are disabled by default:

      • blocking: The reqwest::blocking (synchronous) client API.
      • cookies: Cookie store support.
      • gzip: Automatic response body decompression.
      • json: Request and response JSON body methods.
      • stream: futures::Stream support.
    • Change Error internal design, removing several Error::is_* inspector methods.

    • Change Redirect API:

      • Renamed types to be part of the redirect module (for example, reqwest::RedirectPolicy is now reqwest::redirect::Policy).
      • Removed loop_detected and too_many_redirect methods from redirect::Attempt, replaced with a generic error method.
      • The default policy no longer specifically looks for redirect loops (but they should be caught by the maximum limit).
    • Fix checking HTTP_PROXY environment variable if it the environment is from a CGI script.

    • Fix removal of username/password of parsed proxy URL.

    • Update url to v2.0.

    • Update hyper to v0.13.

    • Update http to v0.2.

    v0.9.19

    • Add ClientBuilder::use_sys_proxy() to enable automatic detect of HTTP proxies configured on the system.
    • Add ClientBuilder::no_proxy() to disable system proxies. This is the default for 0.9, but will change to detecting system proxies by default in 0.10.
    • Add support for streaming request bodies in the async client.
    • Add async::Response::text() that returns a Future of the full body decoded to a String.
    • Add Clone for Certificate.

    v0.9.18

    • Fix Cookie headers to no longer send as percent-encoded (instead, exactly as sent by the server).

    v0.9.17

    • Fix Cookie headers so as to not include attributes from the Set-Cookie (like HttpOnly, Secure, etc).

    v0.9.16

    ... (truncated)
    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Pull request limits (per update run and/or open at any time)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)
    dependencies 
    opened by dependabot-preview[bot] 1
  • Update url requirement from 1 to 2

    Update url requirement from 1 to 2

    Updates the requirements on url to permit the latest version.

    Commits
    • f491cb4 Auto merge of #525 - dekellum:future-proof, r=SimonSapin
    • 255aaa9 Auto merge of #526 - dekellum:fix-redundant-field-names-lint, r=SimonSapin
    • cce2d32 Remove redundant field names in struct init
    • 8cc477f Disambiguate Display::fmt calls for error types
    • 12ee459 Add FutureProof variants to ParseError and SyntaxViolation
    • 0ab166e Auto merge of #521 - servo:serde, r=SimonSapin
    • c2ff51b Optimise default string deserialization for Url
    • 171e65e Derive serde traits for Host and HostInternal
    • 8bbc39d Make HostInternal private
    • 3c71cac Auto merge of #518 - est31:idna_serde, r=nox
    • Additional commits viewable in compare view

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it). To ignore the version in this PR you can just close it
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language
    • @dependabot badge me will comment on this PR with code to add a "Dependabot enabled" badge to your readme

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 1
  • Update log requirement to 0.4

    Update log requirement to 0.4

    Updates the requirements on log to permit the latest version.

    Changelog

    Sourced from log's changelog.

    [0.4.2] - 2018-06-05

    Improved

    • Log invocations now generate less code.

    Fixed

    • Example Logger implementations now properly set the max log level.

    [0.4.1] - 2017-12-30

    Fixed

    • Some doc links were fixed.

    [0.4.0] - 2017-12-24

    The changes in this release include cleanup of some obscure functionality and a more robust public API designed to support bridges to other logging systems, and provide more flexibility to new features in the future.

    Compatibility

    Vast portions of the Rust ecosystem use the 0.3.x release series of log, and we don't want to force the community to go through the pain of upgrading every crate to 0.4.x at the exact same time. Along with 0.4.0, we've published a new 0.3.9 release which acts as a "shim" over 0.4.0. This will allow crates using either version to coexist without losing messages from one side or the other.

    There is one caveat - a log message generated by a crate using 0.4.x but consumed by a logging implementation using 0.3.x will not have a file name or module path. Applications affected by this can upgrade their logging implementations to one using 0.4.x to avoid losing this information. The other direction does not lose any information, fortunately!

    TL;DR Libraries should feel comfortable upgrading to 0.4.0 without treating that as a breaking change. Applications may need to update their logging implementation (e.g. env-logger) to a newer version using log 0.4.x to avoid losing module and file information.

    New

    • The crate is now no_std by default.
    • Level and LevelFilter now implement Serialize and Deserialize when the serde feature is enabled.
    • The Record and Metadata types can now be constructed by third-party code via a builder API.
    • The logger free function returns a reference to the logger implementation. This, along with the ability to construct Records, makes it possible to bridge from another logging framework to this one without digging into the private internals of the crate. The standard error! warn!, etc, macros now exclusively use the public API of the crate rather than "secret" internal APIs.
    • Log::flush has been added to allow crates to tell the logging implementation to ensure that all "in flight" log events have been persisted. This can be used, for example, just before an
    ... (truncated)
    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Note: This repo was added to Dependabot recently, so you'll receive a maximum of 5 PRs for your first few update runs. Once an update run creates fewer than 5 PRs we'll remove that limit.

    You can always request more updates by clicking Bump now in your Dependabot dashboard.

    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language

    Additionally, you can set the following in your Dependabot dashboard:

    • Update frequency (including time of day and day of week)
    • Automerge options (never/patch/minor, and dev/runtime dependencies)
    • Pull request limits (per update run and/or open at any time)
    • Out-of-range updates (receive only lockfile updates, if desired)
    • Security updates (receive only security updates, if desired)

    Finally, you can contact us by mentioning @dependabot.

    dependencies 
    opened by dependabot-preview[bot] 1
  • Let the crate to build requests without sending

    Let the crate to build requests without sending

    It would be useful for users of this crate just to have everything for requesting via their own method (not using hyper crate for example). To do this, we must add a method to the UrlShortener implementation which just returns an object which can be used for making requests by providing all the data: url, parameters, type of parameters, headers, and so on. By having this the user will be able to perform the requests as how it wants. For example, the user code may already have some hyper::Client instance, we may just use it instead of having our own client. Or, the user may have some another http-client library which he wants to use.

    This issue could be done in another way: we use some trait "NetworkSender" with method "send" which the user can implement for it network sender (hyper client or anything else). Then we write a method of UrlShortener which accepts a NetworkSender trait object and uses it for sending the request and getting response.

    enhancement help wanted junior job good first issue 
    opened by vityafx 1
  • Avoid Vec in try_generate, format with rustfmt-nightly

    Avoid Vec in try_generate, format with rustfmt-nightly

    By using a slice the user doesn't need to allocate in some cases, and all those who allocated with a vec can continue using the API via deref-coercion.

    opened by ParadoxSpiral 1
Owner
Victor Polevoy
An experienced C/C++/Rust systems and application developer, Certified Scrum Master.
Victor Polevoy
SockJS server for rust language

SockJS server SockJS server for Actix framework. API Documentation Cargo package: sockjs SockJS is built with Actix web Minimum supported Rust version

Actix 63 Oct 7, 2022
A WebSocket (RFC6455) library written in Rust

Rust-WebSocket Note: Maintainership of this project is slugglish. You may want to use tungstenite or tokio-tungstenite instead. Rust-WebSocket is a We

Rust Websockets 1.3k Jan 6, 2023
Lightweight, event-driven WebSockets for Rust.

WS-RS Lightweight, event-driven WebSockets for Rust. /// A WebSocket echo server listen("127.0.0.1:3012", |out| { move |msg| { out.send(ms

Jason Housley 1.3k Jan 8, 2023
Lightweight stream-based WebSocket implementation for Rust.

Tungstenite Lightweight stream-based WebSocket implementation for Rust. use std::net::TcpListener; use std::thread::spawn; use tungstenite::server::ac

Snapview GmbH 1.3k Jan 2, 2023
Synchronized state machines for Rust over WebSockets.

Aper is a framework for real-time sharing of application state over WebSockets.

null 191 Dec 20, 2022
A WebSocket (RFC6455) library written in Rust

Rust-WebSocket Rust-WebSocket is a WebSocket (RFC6455) library written in Rust. Rust-WebSocket provides a framework for dealing with WebSocket connect

Jason N 19 Aug 22, 2022
An aria2 websocket jsonrpc in Rust.

aria2-ws An aria2 websocket jsonrpc in Rust. Built with tokio. Docs.rs aria2 RPC docs Features Almost all methods and structed responses Auto reconnec

null 8 Sep 7, 2022
Rust + wasm + websockets

This is a template repo for eframe, a framework for writing apps using egui.

Emil Ernerfeldt 12 Oct 3, 2022
Composable WebSockets made easy, for Rust 🦀

ezsockets Have you ever struggle with creating a WebSocket server or a client in Rust? This crate is for you. High level abstraction of WebSocket, han

Grzegorz Baranski 55 Dec 30, 2022
Rust API connector for Bybit's WebSockets APIs.

rust-bybit English | 简体中文 Unofficial Rust API connector for Bybit's WebSockets APIs. Disclaimer This is an unofficial Rust API connector for Bybit's A

yufuquant 12 Nov 12, 2022
A MITM Proxy Written in Rust 🦀! Toolkit for HTTP/1, HTTP/2, and WebSockets with SSL/TLS Capabilities. Learning Project.

Man In The Middle Proxy Description Rust-based Man in the Middle proxy, an early-stage project aimed at providing visibility into network traffic. Cur

null 158 Mar 9, 2023
RuTTY - Rust TTY Server

RuTTY - Rust TTY Server Demo RuTTY (aka Ruthie) is a CLI-powered websocket server written in Rust that allows you to expose your commands via browser.

Gershon Papi 4 Jun 4, 2023
A simple url checker for finding fraud url(s) or nearest url

urlchecker A simple url checker for finding fraud url(s) or nearest url while being fast (threading) Eg:- use std::collections::HashMap; use urlchecke

Subconscious Compute 2 Aug 7, 2022
A mini paste bin and url shortener written in rust without databases.

pb Build $ cargo build --release Environment Variables PB_DATA: /some/path (Default: ./pb_data) PB_SITE: Url of your site. (Default: http://localhost:

Edward P 5 Jul 26, 2022
A URL shortener that uses emojis, only emojis.

emojied Shorten your URLs with emojis! Features Well, shorten your URLs! Customize what emoji to use. e.g Want to use an eggplant emoji? Sure, as long

SEKUN 99 Dec 31, 2022
Shurly, this is a URL shortener with API management

Shurly Shurly, this is a URL shortener with API management Features Management of destinations through a REST'ish API Permanent/temporary redirects; p

WorkplaceBuddy 3 Nov 30, 2022
A modest URL shortener for personal usage.

bref A modest URL shortener for personal usage. Shortens URLs to a 6 characters-length key that is generated based on current time. Why? Why not? Usag

Nicolas Gryman 3 Oct 8, 2023
Easy c̵̰͠r̵̛̠ö̴̪s̶̩̒s̵̭̀-t̶̲͝h̶̯̚r̵̺͐e̷̖̽ḁ̴̍d̶̖̔ ȓ̵͙ė̶͎ḟ̴͙e̸̖͛r̶̖͗ë̶̱́ṉ̵̒ĉ̷̥e̷͚̍ s̷̹͌h̷̲̉a̵̭͋r̷̫̊ḭ̵̊n̷̬͂g̵̦̃ f̶̻̊ơ̵̜ṟ̸̈́ R̵̞̋ù̵̺s̷̖̅ţ̸͗!̸̼͋

Rust S̵̓i̸̓n̵̉ I̴n̴f̶e̸r̵n̷a̴l mutability! Howdy, friendly Rust developer! Ever had a value get m̵̯̅ð̶͊v̴̮̾ê̴̼͘d away right under your nose just when

null 294 Dec 23, 2022
A simple but production-ready link shortener. Repository belonging to one of my YouTube videos

What is this? This is a simple link shortener, which is the result of a tutorial I did on YouTube. Important technologies used Rust (as our most belov

Oliver Jumpertz 7 Apr 21, 2024
High-performance link shortener

shorty High-performance link shortener written in Rust ?? Hosting In addition to being easy to build from source, shorty is available as a Docker imag

Caleb Denio 49 Jan 3, 2023