FTP client package for Go

Related tags

Network go ftp ftp-client
Overview

goftp

Build Status Coverage Status Go ReportCard godoc.org

A FTP client package for Go

Install

go get -u github.com/jlaffaye/ftp

Documentation

https://pkg.go.dev/github.com/jlaffaye/ftp?tab=doc

Example

c, err := ftp.Dial("ftp.example.org:21", ftp.DialWithTimeout(5*time.Second))
if err != nil {
    log.Fatal(err)
}

err = c.Login("anonymous", "anonymous")
if err != nil {
    log.Fatal(err)
}

// Do something with the FTP conn

if err := c.Quit(); err != nil {
    log.Fatal(err)
}

Store a file example

data := bytes.NewBufferString("Hello World")
err = c.Stor("test-file.txt", data)
if err != nil {
	panic(err)
}

Read a file example

r, err := c.Retr("test-file.txt")
if err != nil {
	panic(err)
}
defer r.Close()

buf, err := ioutil.ReadAll(r)
println(string(buf))
Issues
  •  Use MLST if supported

    Use MLST if supported

    Since vsftpd does not support MLST, I added ProFTPD.

    Further improvements:

    • Test vsftpd and proftpd in parallel
    • Use Ubuntu 14.04 instead of 12.04

    closes #46

    opened by corny 22
  • glob method && Implement FTPS implicit FTP over TLS

    glob method && Implement FTPS implicit FTP over TLS

    glob method

    ported Glob method from filepath - https://golang.org/pkg/path/filepath/#Glob and also present in sftp client http://godoc.org/github.com/pkg/sftp#Client.Glob

    Implement FTPS implicit FTP over TLS

    This will allow the package to also be able to connect to FTPS on servers that have implicit tls enabled added new method func DialImplicitTLS(addr string, config *tls.Config) (*ServerConn, error) added new TLS server and ran tests over TLS also, all pass

    increase test coverage

    opened by catalint 13
  • Implement STARTTLS (explicit TLS) support

    Implement STARTTLS (explicit TLS) support

    Hi,

    I have added simple support for STARTTLS. It is a very basic implementation that probably only works in a few usecases, for mine it works fine.

    Please tell me what I should extend / improve to get this merged upstream.

    Thanks.

    stale 
    opened by xperimental 8
  • allow to send custom command

    allow to send custom command

    I use this patch in my test cases, for example:

    code, response, err := client.SendCustomCommand(fmt.Sprintf("MFMT %v %v", mtime, testFileName))
    assert.NoError(t, err)
    assert.Equal(t, ftp.StatusFile, code)
    assert.Equal(t, fmt.Sprintf("Modify=%v; %v", mtime, testFileName), response)
    

    or

    code, response, err := client.SendCustomCommand(fmt.Sprintf("SITE CHMOD 600 %v", testFileName))
    assert.NoError(t, err)
    assert.Equal(t, ftp.StatusCommandOK, code)
    assert.Equal(t, "SITE CHMOD command successful", response)
    
    stale 
    opened by drakkan 7
  • Add Dial option to disable UTF8

    Add Dial option to disable UTF8

    Describe the bug The FTP server one of my client's ISP is using doesn't recognize the UTF8 option and refuses to continue from there. I had to comment the line in the library to get it to work.

    To Reproduce

    Connect to ftpcluster.loopia.se and enable UTF8.
    
    accepted defect 
    opened by codr7 7
  • Added Quotas Func

    Added Quotas Func

    Please see the commits below to see a new function that I've added to get the storage quotas that are set on an FTP account. This will return a good amount of information as a map[string]string. The keys are Uppercase Camel Case Formatted. I've also put together a small project to use the implementation of this function, you can find it here.

    I have a sample of what values can be received via FTP here. The data is not converted to a struct as the data may vary between servers.

    stale 
    opened by nhalstead 7
  • ReadResponse(StatusReady)  in DialTimeout hang

    ReadResponse(StatusReady) in DialTimeout hang

    https://github.com/jlaffaye/ftp/blob/master/ftp.go#L88

    Hi,

    my program have multiple connections to LIST different directories per second and the ftp server is Serv-U v5.0. after a while, some connections hang. netstat command shows that the tcp state is ESTABLISHED. run ftp.DialTimeout with some duration does not help.

    func ftpListDirectory(path string) ([]*ftp.Entry, error) {
    	conn, err := ftp.DialTimeout(cfg.FtpSrvAddr, 5*time.Second)
    	if err != nil {
    		return nil, err
    	}
    	conn.DisableEPSV = true
    	defer conn.Quit()
    
    	if err = conn.Login(cfg.FtpSrvUser, cfg.FtpSrvPwd); err != nil {
    		return nil, err
    	}
    
    	return conn.List(path)
    }
    
    stale 
    opened by alexzyp 7
  • Ftp FEAT: operation timed out

    Ftp FEAT: operation timed out

    Hi, I track this code caused timed out. if i cancel ServerConn.feat(), ftp could connect server smoothly. code, message, err := c.cmd(-1, "FEAT") https://github.com/jlaffaye/ftp/blob/master/ftp.go#L97

    deeply, i find error was thrown from reader.ReadResponse. c.conn.ReadResponse(expected) https://github.com/jlaffaye/ftp/blob/master/ftp.go#L295

    An expectCode <= 0 disables the check of the status code.

    as golang doc said, i cancel this code temporarily. actually i'm not a big fan of feat causes connection failed.

    Could you give a suggestion.

    defect 
    opened by han2015 7
  • when call ftp.Connect ,the error  returned is not nil in  some net environment

    when call ftp.Connect ,the error returned is not nil in some net environment

    when call ftp.Connect ,the error returned is not nil in some net environment .But others ftp clients like winscp works well in the same net enviroment. somebody can tell me the reason?

    opened by kekemuyu 7
  • Fix golangci-lint warnings

    Fix golangci-lint warnings

    This proposal does not introduce behavior changes, just makes the library code a little bit cleaner.

    If you run golangci-lint run . on the library, it will warn many function invocations that implicitly drop returned values without analysis. This patch makes the drops explicit.

    stale 
    opened by ivandeex 6
  • Implement FTPS implicit FTP over TLS

    Implement FTPS implicit FTP over TLS

    Implement FTPS implicit FTP over TLS This will allow the package to also be able to connect to FTPS on servers that have implicit tls enabled added new method func DialImplicitTLS(addr string, config *tls.Config) (*ServerConn, error) added new TLS server and ran tests over TLS also, all pass

    opened by catalint 6
  • Bump github.com/stretchr/testify from 1.7.2 to 1.7.4

    Bump github.com/stretchr/testify from 1.7.2 to 1.7.4

    Bumps github.com/stretchr/testify from 1.7.2 to 1.7.4.

    Commits
    • 48391ba Fix panic in AssertExpectations for mocks without expectations (#1207)
    • 840cb80 arrays value types in a zero-initialized state are considered empty (#1126)
    • 07dc7ee Bump actions/setup-go from 3.1.0 to 3.2.0 (#1191)
    • c33fc8d Bump actions/checkout from 2 to 3 (#1163)
    • 3c33e07 Added Go 1.18.1 as a build/supported version (#1182)
    • e2b56b3 Bump github.com/stretchr/objx from 0.1.0 to 0.4.0
    • See full diff in compare view

    Dependabot compatibility score

    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)
    dependencies 
    opened by dependabot[bot] 1
  • Question around FEAT support

    Question around FEAT support

    Describe the bug

    I try to access an FTP server and the client fails to detect the available features.

    The server response looks like this:

    Tx: "FEAT"
    Rx: "211-Features:"
    Rx: "211-CLNT"
    Rx: "211-EPRT"
    Rx: "211-EPSV"
    Rx: "211-HOST"
    Rx: "211-LANG fr-FR"
    Rx: "211-MDTM"
    Rx: "211-MFF modify;UNIX.group;UNIX.mode;"
    Rx: "211-MFMT"
    Rx: "211-MLST modify*;perm*;size*;type*;unique*;UNIX.group*;UNIX.groupname*;UNIX.mode*;UNIX.owner*;UNIX.ownername*;"
    Rx: "211-RANG STREAM"
    Rx: "211-REST STREAM"
    Rx: "211-SITE COPY"
    Rx: "211-SITE MKDIR"
    Rx: "211-SITE RMDIR"
    Rx: "211-SITE SYMLINK"
    Rx: "211-SITE UTIME"
    Rx: "211-SIZE"
    Rx: "211-TVFS"
    Rx: "211-UTF8"
    Rx: "211 End"
    

    The response does not follow "RFC 2389", I could track this notation to the following issue for ProFTPD (fixed since then):

    http://bugs.proftpd.org/show_bug.cgi?id=2752

    But I can't tell for sure the server I'm facing uses an old version of ProFTPD.

    Expected behavior

    I'm not sure actually, this project strictly follows the FTP specifications but at the same time there is this known bug in ProFTPD...

    Ideally it may be nice to support this unfortunate output since when you work with various FTPs you do not always have a choice.

    I can't really ask every impacted users to upgrade their FTP server.

    Context

    The feature detection is used to enables the efficient lookup (https://github.com/jlaffaye/ftp/pull/258)

    defect 
    opened by panthony 0
  • Add Stat based on MLST command

    Add Stat based on MLST command

    Hi,

    The idea of this new method is provide a more efficient way to lookup a single entry when supported by the remote server.

    I exposed a new ErrNotSupported error to ease the detection of an unsupported method & implement a fallback strategy.

    There is a subtle difference between MLST and MLSD, the former has a space in front of each line entry (except BEGIN/END), I was not sure if the trim should be done here or in parseRFC3659ListLine.

    I'm not sure if Stat is the appropriate name though, it matches the commonly used os.Stat() function but there is a STAT FTP command (that does something else entirely.)

    opened by panthony 4
  • connection to bad ftp server hangs whole connection most of the time

    connection to bad ftp server hangs whole connection most of the time

    Describe the bug The connection attempts to not abort properly

    To Reproduce I've set up an ftp server that can be reached somewhat, but is not fully functional (as tested via telnet)

    package main
    
    import (
    	"log"
    	"time"
    
    	"github.com/jlaffaye/ftp"
    )
    
    func main() {
    	c, err := ftp.Dial("10.0.2.2:21", ftp.DialWithTimeout(5*time.Second))
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	err = c.Login("anonymous", "anonymous")
    	if err != nil {
    		log.Fatal(err)
    	}
    
    	// Do something with the FTP conn
    
    	if err := c.Quit(); err != nil {
    		log.Fatal(err)
    	}
    }
    

    Expected behavior dialing is aborted after timeout p.s.: adding DialWithContext and adding a context that is cancelled after x seconds does not work either

    FTP server

    • Name and version: Windows 10 1909 integrated FTP via IIS services
    • Public URL if applicable

    Debug output DialWithDebugOutput literally does nothing when it comes to the error. I guess that somethings waiting for more data to be submitted by the FTP server, but that never happens - thus its hanging.

    Additional context Go: go version go1.18.1 linux/amd64

    sometime EOF error, sometimes not image

    corresponds to telnet tests, but this is still not a working FTP connection (command line FTP clients do not work either) note the ^C in the lower left. The connection would stay open until I did something, while the first one aborts immediately (i guess thats the EOF case) image

    accepted defect 
    opened by boindil 1
  • Timeout when using ftps to invoke .List and .NameList (TLS)

    Timeout when using ftps to invoke .List and .NameList (TLS)

    Describe the bug Timeout when using ftps to invoke .List and .NameList. Error is "context deadline exceeded".

    Maybe (??) related to an underlying TLS issue - possibly #249 and #252

    To Reproduce

    c, err = ftp.Dial(
    	ftpsString,
            ftp.DialWithTimeout(time.Duration(20)*time.Second), // 20 seconds is default for Filezilla.
    	ftp.DialWithExplicitTLS(&tls.Config{InsecureSkipVerify: true}),
    	ftp.DialWithDisabledEPSV(true), // both true and false have same error 'context deadline exceeded'
    )
    
    // c.Login, as applicable
    
    entries, err := c.List("/dir-to-access") // or use "/" ... same error
    if err != nil {
    	return err // context deadline exceeded
    }
    

    Expected behavior The list of file names should be retrieved.

    FTP server

    This is all TLS v1.2. From the hosting provider...

    image

    Debug output

    220 Welcome to XXXX.XXXXX.XXX
    USER [email protected]
    331 Password required for [email protected]
    PASS XXXXXXXXXXXX
    230 Login OK. Proceed.
    FEAT
    211-Features supported:
     COMB target;source_list
     REST STREAM
     SIZE
     MDTM
     MFMT
     XCRC filename;start;end
     SSCN
     MLST Size*;Modify*;Create;Type*;Unique;Perm*;Lang;Media-Type;CharSet;
     MODE Z 
     XNOP 
     UTF8
     UTF-8
     LANG EN*
     CLNT
    211 END
    TYPE I
    200 Type set to I.
    OPTS UTF8 ON
    200 Entering UTF-8 mode.
    PBSZ 0
    200 PBSZ Command OK. Protection buffer size set to 0.
    PROT P
    200 PROT Command OK. Using Private data connection.
    PWD
    257 "/" is current folder.
    PASV
    227 Entering Passive Mode (74,51,209,105,82,8).
    failed to list entries of ftp server path '/MY DIRECTORY'; context deadline exceeded
    

    The vendor's ftp-server logged the following commands.

    image

    Below is output from the vendor's ftp-server when I connected from within Filezilla from the same development workstation. Notice it succeeded at MLSD but the prior connection using jlaffaye/ftp failed at MLSD (it wasn't present above - timed out after 227 Entering Passive Mode).

    image

    Filezilla's client-side output is shown below. This shows success and lists the directory. The command that failed with jlaffaye/ftp MLSD begins at ftp.line-619 but error occurs lower in the stack in the submission of the tcp data that is issued to the server.

    Additional context

    Command:	PWD
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	257 "/" is current folder.
    Trace:	CFtpChangeDirOpData::ParseResponse() in state 1
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpChangeDirOpData::Reset(0) in state 1
    Trace:	CFtpListOpData::SubcommandResult(0) in state 1
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpListOpData::Send() in state 2
    Trace:	CFtpRawTransferOpData::Send() in state 0
    Trace:	CFtpRawTransferOpData::Send() in state 1
    Command:	TYPE I
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	200 Type set to I.
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 1
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 2
    Command:	PASV
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	227 Entering Passive Mode (74,51,209,105,82,8).
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 2
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 4
    Trace:	Binding data connection source IP to control connection source IP XXX.XXX.XXX.XXX
    Trace:	tls_layer_impl::client_handshake()
    Trace:	Trying to resume existing TLS session.
    
    THIS COMMAND "MLSD" IS WHERE THE TIMEOUT ERROR IS HAPPENING.
    IT IS ASSIGNED IN THE CLIENT in ftp.go, line 619, AND ERROS WHEN ISSUED TO THE SERVER,
    BUT IN FILEZILLA IT WORKS FINE.
    
    Command:	MLSD
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	150 Opening BINARY mode data connection for MLSD /.
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 4
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 5
    Trace:	tls_layer_impl::on_send()
    Trace:	tls_layer_impl::continue_handshake()
    Trace:	TLS handshake: About to send CLIENT HELLO
    Trace:	TLS handshake: Sent CLIENT HELLO
    Trace:	tls_layer_impl::on_read()
    Trace:	tls_layer_impl::continue_handshake()
    Trace:	TLS handshake: Received SERVER HELLO
    Trace:	TLS handshake: Processed SERVER HELLO
    Trace:	TLS handshake: Received FINISHED
    Trace:	TLS handshake: Processed FINISHED
    Trace:	TLS handshake: About to send FINISHED
    Trace:	TLS handshake: Sent FINISHED
    Trace:	TLS Handshake successful
    Trace:	TLS Session resumed
    Trace:	Protocol: TLS1.2, Key exchange: ECDHE-SECP256R1, Cipher: AES-256-GCM, MAC: AEAD
    Trace:	tls_layer_impl::verify_certificate()
    Trace:	CTransferSocket::OnConnect
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	tls_layer_impl::on_read()
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	226 Transfer complete. 136 bytes transferred. 136 bps.
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 5
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 8
    Trace:	tls_layer_impl::on_read()
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	CTransferSocket::TransferEnd(1)
    Trace:	tls_layer_impl::shutdown()
    Trace:	tls_layer_impl::continue_shutdown()
    Trace:	CFtpControlSocket::TransferEnd()
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpRawTransferOpData::Reset(0) in state 8
    Trace:	CFtpListOpData::SubcommandResult(0) in state 3
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpListOpData::Reset(0) in state 3
    Status:	Directory listing of "/" successful
    Trace:	CFileZillaEnginePrivate::ResetOperation(0)
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpListOpData::Send() in state 0
    Status:	Retrieving directory listing of "/MY DIRECTORY"...
    Trace:	CFtpChangeDirOpData::Send() in state 0
    Trace:	CFtpChangeDirOpData::Send() in state 2
    Command:	CWD /MY DIRECTORY
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	250 Folder changed to "/MY DIRECTORY".
    Trace:	CFtpChangeDirOpData::ParseResponse() in state 2
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpChangeDirOpData::Reset(0) in state 2
    Trace:	CFtpListOpData::SubcommandResult(0) in state 1
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpListOpData::Send() in state 2
    Trace:	CFtpRawTransferOpData::Send() in state 0
    Trace:	CFtpRawTransferOpData::Send() in state 2
    Command:	PASV
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	227 Entering Passive Mode (74,51,209,105,82,18).
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 2
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 4
    Trace:	Binding data connection source IP to control connection source IP XXX.XXX.XXX.XXX
    Trace:	tls_layer_impl::client_handshake()
    Trace:	Trying to resume existing TLS session.
    Command:	MLSD
    Trace:	tls_layer_impl::on_send()
    Trace:	tls_layer_impl::continue_handshake()
    Trace:	TLS handshake: About to send CLIENT HELLO
    Trace:	TLS handshake: Sent CLIENT HELLO
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	150 Opening BINARY mode data connection for MLSD /MY DIRECTORY.
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 4
    Trace:	CControlSocket::SendNextCommand()
    Trace:	CFtpRawTransferOpData::Send() in state 5
    Trace:	tls_layer_impl::on_read()
    Trace:	tls_layer_impl::continue_handshake()
    Trace:	TLS handshake: Received SERVER HELLO
    Trace:	TLS handshake: Processed SERVER HELLO
    Trace:	TLS handshake: Received FINISHED
    Trace:	TLS handshake: Processed FINISHED
    Trace:	TLS handshake: About to send FINISHED
    Trace:	TLS handshake: Sent FINISHED
    Trace:	TLS Handshake successful
    Trace:	TLS Session resumed
    Trace:	Protocol: TLS1.2, Key exchange: ECDHE-SECP256R1, Cipher: AES-256-GCM, MAC: AEAD
    Trace:	tls_layer_impl::verify_certificate()
    Trace:	CTransferSocket::OnConnect
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	tls_layer_impl::on_read()
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	tls_layer_impl::on_read()
    Trace:	CTransferSocket::OnReceive(), m_transferMode=0
    Trace:	CTransferSocket::TransferEnd(1)
    Trace:	tls_layer_impl::shutdown()
    Trace:	tls_layer_impl::continue_shutdown()
    Trace:	CFtpControlSocket::TransferEnd()
    Trace:	tls_layer_impl::on_read()
    Trace:	CFtpControlSocket::OnReceive()
    Response:	226 Transfer complete. 2889 bytes transferred. 2889 bps.
    Trace:	CFtpRawTransferOpData::ParseResponse() in state 7
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpRawTransferOpData::Reset(0) in state 7
    Trace:	CFtpListOpData::SubcommandResult(0) in state 3
    Trace:	CFtpControlSocket::ResetOperation(0)
    Trace:	CControlSocket::ResetOperation(0)
    Trace:	CFtpListOpData::Reset(0) in state 3
    Status:	Directory listing of "/MY DIRECTORY" successful
    
    accepted defect 
    opened by jpfluger 4
Owner
Julien Laffaye
Production Engineer @Shopify
Julien Laffaye
An experimental go FTP server framework

graval Go FTP server framework. By providing a simple driver class that responds to a handful of methods you can have a complete FTP server. Some samp

Koofr 27 Mar 3, 2022
Access ftp through caddy

Access ftp through caddy

null 2 Mar 16, 2022
Grab your files periodically from a remote FTP or SFTP server easily

About FTPGrab is a CLI application written in Go and delivered as a single executable (and a Docker image) to grab your files from a remote FTP or SFT

CrazyMax 395 Jun 23, 2022
FTP server in Golang - Donovan and Kernighan´s excercise 8.2

This is my implementation of Exercise 8.2 in Donovan and Kernighan’s “The Go Programming Language”. With a LOT of help from Angus Morrison´s article h

Svein W 0 Feb 6, 2022
Prisma Client Go is an auto-generated and fully type-safe database client

Prisma Client Go Typesafe database access for Go Quickstart • Website • Docs • API reference • Blog • Slack • Twitter Prisma Client Go is an auto-gene

Prisma 1.2k Jun 20, 2022
The Dual-Stack Dynamic DNS client, the world's first dynamic DNS client built for IPv6.

dsddns DsDDNS is the Dual-Stack Dynamic DNS client. A dynamic DNS client keeps your DNS records in sync with the IP addresses associated with your hom

Ryan Young 10 Jun 20, 2022
Go Substrate RPC Client (GSRPC)Go Substrate RPC Client (GSRPC)

Go Substrate RPC Client (GSRPC) Substrate RPC client in Go. It provides APIs and types around Polkadot and any Substrate-based chain RPC calls. This c

Chino Chang 1 Nov 11, 2021
Server and client implementation of the grpc go libraries to perform unary, client streaming, server streaming and full duplex RPCs from gRPC go introduction

Description This is an implementation of a gRPC client and server that provides route guidance from gRPC Basics: Go tutorial. It demonstrates how to u

Joram Wambugu 0 Nov 24, 2021
Godaddy-domains-client-go - Godaddy domains api Client golang - Write automaticly from swagger codegen

Go API client for swagger Overview This API client was generated by the swagger-codegen project. By using the swagger-spec from a remote server, you c

Mickael Stanislas 0 Jan 9, 2022
Tailscale-client-go - A client implementation for the Tailscale HTTP API

tailscale-client-go A client implementation for the Tailscale HTTP API Example p

David Bond 9 Jun 8, 2022
Comunicación de envios de archivos entres cliente-servidor, client-client.

Client - Server - Client Estes es un proyecto simple de comunicacion de envios de archivos del cliente al servidor y viceversamente, y de cliente a cl

Melvin RB 0 Feb 11, 2022
A STOMP Client package for go developers, supporting all STOMP specification levels.

stompngo - A STOMP 1.0, 1.1 and 1.2 Client Package Features Full support of STOMP protocols: Protocol Level 1.0 Protocol Level 1.1 Protocol Level 1.2

Guy M. Allard 138 Mar 7, 2022
Full-featured BitTorrent client package and utilities

torrent This repository implements BitTorrent-related packages and command-line utilities in Go. The emphasis is on use as a library from other projec

Matt Joiner 4.4k Jun 20, 2022
a simple ntp client package for go

ntp The ntp package is an implementation of a Simple NTP (SNTP) client based on RFC5905. It allows you to connect to a remote NTP server and request i

Brett Vickers 387 Jun 23, 2022
An API Client package for Studyplus for School SYNC API

Studyplus for School SYNC API Client This project is currently alpha, possibility having breaking changes. studyplus_for_school_sync_go is a API clien

atomiyama 4 Aug 2, 2021
A minimal analytics package to start collecting traffic data without client dependencies.

go-web-analytics A minimal analytics package to start collecting traffic data without client dependencies. Logging incoming requests import "github.co

Jake Kalstad 0 Nov 23, 2021
Tscert - Minimal package for just the HTTPS cert fetching part of the Tailscale client API

tscert This is a stripped down version of the tailscale.com/client/tailscale Go

Tailscale 13 May 31, 2022
Fetch-npm-package - A small utility that can be used to fetch a given version of a NPM package

Use fetch-npm-package <package> <version> <output-dir> E.g. fetch-npm-package is

Bjørn Erik Pedersen 1 May 21, 2022