Documentation
¶
Overview ¶
Package internetdata is the official Go client library for the InternetData API: licensed IP and network datasets, downloaded as CSV.GZ or MMDB.
Start with New and Client.Database.List. Every database published today is licensed, so pass WithAPIKey a key carrying the db.download scope; the option is optional because what this API serves without one is a product decision rather than the client's to refuse.
Index ¶
- Constants
- type Checksums
- type Client
- type Database
- type DatabaseAPI
- func (d *DatabaseAPI) Checksums(ctx context.Context, id string, format Format) (*Checksums, error)
- func (d *DatabaseAPI) Download(ctx context.Context, id string, format Format, dst io.Writer) (int64, error)
- func (d *DatabaseAPI) DownloadBytes(ctx context.Context, id string, format Format) ([]byte, error)
- func (d *DatabaseAPI) DownloadFile(ctx context.Context, id string, format Format, path string) (int64, error)
- func (d *DatabaseAPI) DownloadURL(ctx context.Context, id string, format Format) (string, error)
- func (d *DatabaseAPI) Downloads(ctx context.Context, limit int) ([]DownloadAttempt, error)
- func (d *DatabaseAPI) List(ctx context.Context) ([]Database, error)
- func (d *DatabaseAPI) Metadata(ctx context.Context, id string) (*DatabaseMetadata, error)
- type DatabaseMetadata
- type DatabaseMetadataColumn
- type DatabaseVersion
- type Date
- type DownloadAttempt
- type DownloadOutcome
- type Error
- type ErrorKind
- type Format
- type LicenseType
- type Option
- type Standing
Constants ¶
const ( StandingLicensed = api.DatabaseStandingLicensed StandingExpired = api.DatabaseStandingExpired StandingUnlicensed = api.DatabaseStandingUnlicensed )
Standing tells you whether a database is yours today. It never says a database does not exist: a family built for one customer is simply absent from another organization's listing.
const ( LicenseTypeEvaluation = api.Evaluation LicenseTypeStandard = api.Standard LicenseTypeRedistribute = api.Redistribute )
LicenseType is nil rather than one of these when there is no licence at all, so read the pointer before comparing it.
const ( DownloadOutcomeOK = api.DownloadOutcomeOk DownloadOutcomeDenied = api.DownloadOutcomeDenied DownloadOutcomeExpired = api.DownloadOutcomeExpired DownloadOutcomeUnknown = api.DownloadOutcomeUnknown )
const DefaultBaseURL = "https://internetdata.io"
DefaultBaseURL is the production API. Override it with WithBaseURL.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Checksums ¶
type Checksums struct {
MD5 string `json:"md5"`
SHA1 string `json:"sha1"`
SHA256 string `json:"sha256"`
SHA512 string `json:"sha512"`
}
Checksums are the digests of one published file.
Spelled out rather than aliased to the generated struct, whose Md5 and Sha256 are not the names a Go caller expects, and which every other InternetData and VPNDetection SDK writes the same way.
type Client ¶
type Client struct {
// Database is the licensed database catalog and its downloads. Every call
// hangs off it rather than off the client, which is how the VPNDetection
// SDKs read too, so one program holding both clients spells the two the
// same way.
Database *DatabaseAPI
}
Client is a client for the InternetData API. It is safe for concurrent use.
Nothing it answers is cached. What your organization may see depends on the key, so a listing held from one client is not an answer for another, and a catalog is small enough that re-reading it costs less than being wrong about whose it was.
type Database ¶
Database is one database FAMILY, with your organization's licence beside it. LicenseType, Starts and Expires are nil when there is no licence.
type DatabaseAPI ¶
type DatabaseAPI struct {
// contains filtered or unexported fields
}
DatabaseAPI is the licensed database catalog and its downloads, reached through Client.Database.
Spelled DatabaseAPI rather than Database because Database is already this API's own shape for one database family, and it is what the other InternetData SDKs call this type.
func (*DatabaseAPI) Checksums ¶
Checksums are the digests of one published file, for verifying a download. All four the exporter writes are returned, because which of them a caller wants is not this library's decision.
func (*DatabaseAPI) Download ¶
func (d *DatabaseAPI) Download( ctx context.Context, id string, format Format, dst io.Writer, ) (int64, error)
Download streams one database file into dst and returns the bytes written.
Nothing beyond a single chunk is ever held in memory, whatever the file weighs. The transfer takes its deadline from ctx rather than from the HTTP client's Timeout, which would cap the whole body: 30 seconds is a sane bound on a catalog read and the wrong one on a gigabyte.
A failure DURING the transfer is returned as it happened rather than wrapped in an *Error: a reset socket and a full disk are different problems, and only one of them is ours.
func (*DatabaseAPI) DownloadBytes ¶
DownloadBytes downloads one database file and hands back its bytes.
This holds the ENTIRE file in memory, and the catalog spans five orders of magnitude, from bogon_asn_v1 at a few hundred bytes to the largest IP feeds at several gigabytes. Metadata publishes a Size per format; read it first, or use Download or DownloadFile for anything you have not measured.
func (*DatabaseAPI) DownloadFile ¶
func (d *DatabaseAPI) DownloadFile( ctx context.Context, id string, format Format, path string, ) (int64, error)
DownloadFile writes one database file to path and returns the bytes written.
The bytes land in a neighboring .part file that is renamed on completion, so a transfer that dies half way leaves no truncated file that reads as a whole database, and a failed refresh cannot destroy the copy already there. Otherwise identical to Download.
func (*DatabaseAPI) DownloadURL ¶
DownloadURL is the time-limited URL for one database file.
The API answers 302 to object storage and the redirect is NOT followed: the URL is returned so a caller can decide how to transfer a file that runs to gigabytes, hand it to a downloader, or pass it on without passing on the API key. The link is presigned and so authorizes itself; it authorizes the START of a transfer, so one already running is not interrupted when it lapses.
func (*DatabaseAPI) Downloads ¶
func (d *DatabaseAPI) Downloads(ctx context.Context, limit int) ([]DownloadAttempt, error)
Downloads is your organization's recent download attempts, newest first. A limit of zero or less takes the API's own default of 50, and it is clamped to 200.
Refusals are listed too: a denial is what answers "it stopped working", and its absence answers nothing.
func (*DatabaseAPI) List ¶
func (d *DatabaseAPI) List(ctx context.Context) ([]Database, error)
List is the published catalog, with your organization's licence beside each family. A licence covers a family, while a download names one of its versions, so the ids the download and checksum calls take come from Database.Versions.
The listing is the SERVER's answer about YOUR key and nothing else assembles it. A database commissioned for a single customer is absent for every other organization rather than listed as unlicensed, so what you get back is not necessarily what another key gets back, and neither the whole catalog nor any part of it can be reconstructed from another source.
func (*DatabaseAPI) Metadata ¶
func (d *DatabaseAPI) Metadata(ctx context.Context, id string) (*DatabaseMetadata, error)
Metadata is what is inside one database: its columns per format, sample rows, the row count and the byte size of each file. It carries Updated and Entries without downloading anything, so poll it to decide whether today's build is worth fetching, and read Size to budget a transfer before starting one.
One document describes every format the database is built in, which is why there is no format argument.
type DatabaseMetadata ¶
type DatabaseMetadata = api.DatabaseMetadata
DatabaseMetadata is the build document the exporter writes, served through unchanged.
type DatabaseMetadataColumn ¶
type DatabaseMetadataColumn = api.DatabaseMetadataColumn
DatabaseMetadataColumn is one column of one format's schema.
type DatabaseVersion ¶
type DatabaseVersion = api.DatabaseVersion
DatabaseVersion is one published version of a family. Its ID is what the download, checksum and metadata calls take. Old versions are frozen rather than migrated, so both stay downloadable.
type DownloadAttempt ¶
DownloadAttempt is one entry of the download history, refusals included. Bytes is the object size at redirect time rather than bytes delivered: the transfer runs straight from object storage, so how much of it was taken is not observed.
type DownloadOutcome ¶
type DownloadOutcome = api.DownloadOutcome
DownloadOutcome is how one download attempt ended.
type Error ¶
type Error struct {
Kind ErrorKind
// Message is the API's own result code, or a transport failure's text. The
// codes are deliberately not an enum on the wire, so one added later stays
// readable to a client built today.
Message string
// StatusCode is the HTTP status, or 0 when no response was received.
StatusCode int
// RetryAfter is how long the server asked us to wait. Zero when it did not
// ask, which on a 429 means an allowance is spent rather than throttled.
RetryAfter time.Duration
// contains filtered or unexported fields
}
Error is what every failure from this package unwraps to. Recover it with errors.As and branch on Kind.
type ErrorKind ¶
type ErrorKind string
ErrorKind says why a request failed.
KindRateLimited and KindQuotaExceeded both arrive as HTTP 429 and are NOT the same thing. A rate limit is the API protecting itself, carries Retry-After, and retrying works. A spent quota carries no such header and retrying will not help until the window rolls over or the limit is raised. The header is the only thing that distinguishes them.
type Format ¶
type Format string
Format is a format a database is published in. Not every one is built in every format: the _provider catalogs are keyed by provider id rather than by IP range, so no MMDB exists for them, and asking for one is an error rather than an empty answer. DatabaseVersion.Formats says which exist.
type LicenseType ¶ added in v1.1.0
type LicenseType = api.DatabaseLicenseType
LicenseType is what a licence permits you to do with the data.
type Option ¶
type Option func(*config) error
Option configures a Client.
func WithAPIKey ¶
WithAPIKey authenticates as the key's organization, which is what decides which databases are listed at all and which of them may be downloaded.
The key comes from the console and needs the db.download scope. Keys are default-deny, so an existing key does not reach these endpoints until the scope is added to it.
func WithBaseURL ¶
WithBaseURL points the client at a different deployment of the API.
func WithHTTPClient ¶
WithHTTPClient supplies the HTTP client to send with, for a custom transport, proxy or timeout. Without it the SDK uses a client with a 30 second timeout.
The client is copied rather than mutated, and the copy adds a CheckRedirect that defers to yours (see DatabaseAPI.DownloadURL). A dataset transfer runs on a second copy with Timeout cleared, and is bounded by its context instead.
func WithRetries ¶
WithRetries sets how many further attempts a transient failure gets. Default 2.
type Standing ¶
type Standing = api.DatabaseStanding
Standing is where a licence stands: live, lapsed, or never bought.