Giter Club home page Giter Club logo

go-curl's Introduction

go-curl

Build Status

my golang libcurl(curl) binding.

See more examples in ./examples/ directory~!

LICENSE

go-curl is licensed under the Apache License, Version 2.0 (http://www.apache.org/licenses/LICENSE-2.0.html).

Current Development Status

  • currently stable
  • READ, WRITE, HEADER, PROGRESS function callback
  • a Multipart Form supports file uploading
  • Most curl_easy_setopt option
  • partly implement share & multi interface
  • new callback function prototype

How to Install

Make Sure You Have libcurl (and its develop headers, static/dynamic libs) installed!

$ go get -u github.com/andelf/go-curl

Current Status

  • Linux x64
    • passed go1 (ArchLinux)
  • Windows x86
    • passed go1 (win7, mingw-gcc 4.5.2, curl 7.22.0)
  • Mac OS
    • passed go1 (Mac OS X 10.7.3, curl 7.21.4)

Sample Program

package main

import (
    "fmt"
    curl "github.com/andelf/go-curl"
)

func main() {
    easy := curl.EasyInit()
    defer easy.Cleanup()

    easy.Setopt(curl.OPT_URL, "http://www.baidu.com/")

    // make a callback function
    fooTest := func (buf []byte, userdata interface{}) bool {
        println("DEBUG: size=>", len(buf))
        println("DEBUG: content=>", string(buf))
        return true
    }

    easy.Setopt(curl.OPT_WRITEFUNCTION, fooTest)

    if err := easy.Perform(); err != nil {
        fmt.Printf("ERROR: %v\n", err)
    }
}

go-curl's People

Contributors

andelf avatar aquaklaster avatar atercattus avatar avsej avatar ceejatec avatar jhfeng avatar madisongh avatar markatwood avatar mn7z avatar notwa avatar ottob avatar pyrrvs avatar rilutham avatar umurkontaci avatar xiaopeng163 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-curl's Issues

panic: runtime error: invalid memory address or nil pointer dereference

Is go-curl thread safe? I've hit two panics one in goCallProgressFunction other in goCallWriteFunction after making concurrent requests in goroutines.

Code to replicate: https://gist.github.com/joaolsilva/bc4d73122049d6fe5bb9e2d79f81579c

panic: runtime error: invalid memory address or nil pointer dereference
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x409eb90]

goroutine 424 [running]:
github.com/andelf/go-curl.goCallProgressFunction(0x0, 0x0, 0x0, 0x0, 0x4886c00, 0x0)
/Users/jsilva/go/src/github.com/andelf/go-curl/callback.go:40 +0x40
github.com/andelf/go-curl._cgoexpwrap_b3b701c3ac65_goCallProgressFunction(0x0, 0x0, 0x0, 0x0, 0x4886c00, 0x4886c00)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:1449 +0x5b
github.com/andelf/go-curl._Cfunc_curl_easy_cleanup(0x4886c00)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:668 +0x41
github.com/andelf/go-curl.(*CURL).Cleanup.func1(0x4886c00)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:163 +0x60
github.com/andelf/go-curl.(*CURL).Cleanup(0xc4200edae0)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:163 +0x33
panic(0x40bd760, 0x4146c40)
/usr/local/Cellar/go/1.8.3/libexec/src/runtime/panic.go:489 +0x2cf
github.com/andelf/go-curl.goCallProgressFunction(0x0, 0x0, 0x0, 0x0, 0x4886c00, 0x0)
/Users/jsilva/go/src/github.com/andelf/go-curl/callback.go:40 +0x40
github.com/andelf/go-curl._cgoexpwrap_b3b701c3ac65_goCallProgressFunction(0x0, 0x0, 0x0, 0x0, 0x4886c00, 0x0)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:1449 +0x5b
github.com/andelf/go-curl._Cfunc_curl_easy_perform(0x4886c00, 0x0)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:795 +0x49
github.com/andelf/go-curl.(*CURL).Perform.func1(0x4886c00, 0x10)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:344 +0x60
github.com/andelf/go-curl.(*CURL).Perform(0xc4200edae0, 0x4e58, 0x40be540)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:344 +0x2e
main.GetURL(0x40dd2d0, 0x43, 0x10, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/jsilva/go/src/curl-crash/curl-crash.go:56 +0x4a1
created by main.main
/Users/jsilva/go/src/curl-crash/curl-crash.go:81 +0x97

If the progress func is removed the crash happens in the write func

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x10 pc=0x409ecb1]

goroutine 2434 [running]:
github.com/andelf/go-curl.goCallWriteFunction(0x8faf460, 0x867, 0x8f6fa00, 0xc400000008)
/Users/jsilva/go/src/github.com/andelf/go-curl/callback.go:31 +0x61
github.com/andelf/go-curl._cgoexpwrap_b3b701c3ac65_goCallWriteFunction(0x8faf460, 0x867, 0x8f6fa00, 0x0)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:1436 +0x72
github.com/andelf/go-curl._Cfunc_curl_easy_perform(0x8f6fa00, 0x0)
github.com/andelf/go-curl/_obj/_cgo_gotypes.go:795 +0x49
github.com/andelf/go-curl.(*CURL).Perform.func1(0x8f6fa00, 0x20)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:344 +0x60
github.com/andelf/go-curl.(*CURL).Perform(0xc422e40460, 0x4e2b, 0x40bba20)
/Users/jsilva/go/src/github.com/andelf/go-curl/easy.go:344 +0x2e
main.GetURL(0x40dd350, 0x43, 0x10, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/jsilva/go/src/curl-crash/curl-crash.go:58 +0x404
created by main.main
/Users/jsilva/go/src/curl-crash/curl-crash.go:83 +0x97

Before crashing it also prints "curl: Couldn't resolve host name". This error doesn't happen if only a request is made at a time.

请求curl返回的各项时间为 0

环境: ubuntu 16.04 x86_64
package main

import (
curl "github.com/andelf/go-curl"
"fmt"
)

func main() {
	easy := curl.EasyInit()
	defer easy.Cleanup()
	if easy != nil {
		easy.Setopt(curl.OPT_URL, "http://www.oslet.net/")
		fmt.Println(easy.Getinfo(curl.INFO_RESPONSE_CODE))
		fmt.Println(easy.Getinfo(curl.INFO_TOTAL_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_APPCONNECT_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_STARTTRANSFER_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_REDIRECT_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_NAMELOOKUP_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_PRETRANSFER_TIME))
		fmt.Println(easy.Getinfo(curl.INFO_CONNECT_TIME))
		
		ver := curl.VersionInfo(curl.VERSION_NOW)
		fmt.Printf("VersionInfo: Age: %d, Version:%s, Host:%s, Features:%d, SslVer: %s, LibzV: %s, ssh: %s\n",
			ver.Age, ver.Version, ver.Host, ver.Features, ver.SslVersion, ver.LibzVersion, ver.LibsshVersion)
	}
}

返回如下数据

0 <nil>
0 <nil>
0 <nil>
0 <nil>
0 <nil>
0 <nil>
0 <nil>
0 <nil>
VersionInfo: Age: 3, Version:7.47.0, Host:x86_64-pc-linux-gnu, Features:968605, SslVer: OpenSSL/1.0.2g, LibzV: 1.2.8, ssh: 

貌似有内存泄露呀

多次请求通过top能发现RES占用内存轻微持续上升,go1.4,linux 64,代码如下:
package main

import (
"fmt"
curl "github.com/andelf/go-curl"
)

func main() {
fooTest := func(buf []byte, userdata interface{}) bool {
//println("DEBUG: size=>", len(buf))
//println("DEBUG: content=>", string(buf))
return true
}
easy := curl.EasyInit()
defer easy.Cleanup()
for i := 0; i < 1000000; i++ {
easy.Setopt(curl.OPT_URL, "http://192.168.1.3/")
easy.Setopt(curl.OPT_WRITEFUNCTION, fooTest)
if err := easy.Perform(); err != nil {
fmt.Printf("ERROR: %v\n", err)
}
}
}
协程下同样如此:
package main

import (
"fmt"
curl "github.com/andelf/go-curl"
"sync"
)

func main() {
var wg sync.WaitGroup
var limit = make(chan struct{}, 200)
fooTest := func(buf []byte, userdata interface{}) bool {
//println("DEBUG: size=>", len(buf))
//println("DEBUG: content=>", string(buf))
return true
}
for i := 0; i < 1000000; i++ {
limit <- struct{}{}
wg.Add(1)
go func() {
easy := curl.EasyInit()
defer easy.Cleanup()
easy.Setopt(curl.OPT_URL, "http://192.168.1.3/")
easy.Setopt(curl.OPT_WRITEFUNCTION, fooTest)

        if err := easy.Perform(); err != nil {
            fmt.Printf("ERROR: %v\n", err)
        }
        <-limit
        defer wg.Done()
    }()
    wg.Wait()
}

}

compilation failure with libcurl 7.15.5

curl --version
curl 7.15.5 (x86_64-redhat-linux-gnu) libcurl/7.15.5 OpenSSL/0.9.8b zlib/1.2.3 libidn/0.6.5
Protocols: tftp ftp telnet dict ldap http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 
go get -v github.com/andelf/go-curl
github.com/andelf/go-curl
# github.com/andelf/go-curl
error: 'CURL_WRITEFUNC_PAUSE' undeclared (first use in this function)

Fails to compile

github.com/andelf/go-curl

../github.com/andelf/go-curl/c-callback.c: In function ‘header_function’:
../github.com/andelf/go-curl/c-callback.c:8:52: error: ‘GoUintptr’ undeclared (first use in this function)
../github.com/andelf/go-curl/c-callback.c:8:52: note: each undeclared identifier is reported only once for each function it appears in
../github.com/andelf/go-curl/c-callback.c:8:62: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:8:62: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c:9:70: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:9:70: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c: In function ‘write_function’:
../github.com/andelf/go-curl/c-callback.c:24:51: error: ‘GoUintptr’ undeclared (first use in this function)
../github.com/andelf/go-curl/c-callback.c:24:61: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:24:61: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c:25:70: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:25:70: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c: In function ‘read_function’:
../github.com/andelf/go-curl/c-callback.c:39:50: error: ‘GoUintptr’ undeclared (first use in this function)
../github.com/andelf/go-curl/c-callback.c:39:60: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:39:60: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c:40:70: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:40:70: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c: In function ‘progress_function’:
../github.com/andelf/go-curl/c-callback.c:55:54: error: ‘GoUintptr’ undeclared (first use in this function)
../github.com/andelf/go-curl/c-callback.c:55:64: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:55:64: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here
../github.com/andelf/go-curl/c-callback.c:56:69: error: expected ‘)’ before ‘ctx’
../github.com/andelf/go-curl/c-callback.c:56:69: error: too few arguments to function ‘goGetCurlField’
callback.go:23:16: note: declared here

Using curl 7.22. libcurl is installed.

unexpected fault address 0xe7200000e72

遇到以下错误:
unexpected fault address 0xf8400472
throw: fault
[signal 0xb code=0x1 addr=0xf8400472 pc=0xf8400472b5]

goroutine 1 [running]:

goroutine 2 [syscall]:
created by runtime.main
/home/michael/DPKG/golang/src/pkg/runtime/proc.c:221

goroutine 3 [timer goroutine (idle)]:
created by addtimer
/home/michael/DPKG/golang/src/pkg/runtime/ztime_amd64.c:72
exit status 2

代码如下:
package main

import (
curl "github.com/andelf/go-curl"
"time"
)

func main() {
fooTest := func(buf []byte, userdata interface{}) bool {
println("DEBUG: size=>", len(buf))
//println("DEBUG: content=>", string(buf))
return true
}
mh := curl.MultiInit()
for i := 0; i < 100; i++ {
ch := curl.EasyInit()
ch.Setopt(curl.OPT_URL, "http://www.baidu.com")
ch.Setopt(curl.OPT_WRITEFUNCTION, fooTest)
mh.AddHandle(ch)
}
for {
nRunning, _ := mh.Perform()
// println("n =", nRunning)
if nRunning == 0 {
println("ok")
break
}
time.Sleep(1000)
}
}

循环请求10次没问题,100次出现以上错误。
不使用回调ch.Setopt(curl.OPT_WRITEFUNCTION, fooTest)正常,使用后出现以上错误。

cgo error

When I pass [] bytes variable to curl.Setopt with CURL_POSTFIELDS, I got error "cgo argument has go pointer to go pointer" at 268 line in easy.go:
panic(0x85ee60, 0xc8202200c0)
/usr/local/go/src/runtime/panic.go:464 +0x3e6
github.com/andelf/go-curl._cgoCheckPointer0(0x79f980, 0xc8202200a0, 0xc8202200b0, 0x1, 0x1, 0x7fc858001cc0)
??:0 +0x4d
github.com/andelf/go-curl.(*CURL).Setopt(0xc8201eb2c0, 0x271f, 0x78fb20, 0xc82020cca0, 0x0, 0x0)
/home/ubuntu/go/src/github.com/andelf/go-curl/easy.go:268 +0x2271

I changed the source file and tested as followings:
case []byte:
b := param.([]byte)
ptr := unsafe.Pointer(&b[0])
return newCurlError(C.curl_easy_setopt_string(p, C.CURLoption(opt), (*C.char)(ptr)))

How about my changed code.

.\multi.go:139: undefined: syscall.FdSet

编译报错.\multi.go:139: undefined: syscall.FdSet
在godoc.org文档上可以找到syscall.FdSet这个类型,但是在本地文档上就找不到这个类型了。
go1.4和1.3.3都不行(二进制包和源码编译也都试过),不知道是什么原因

is curl_global_init handled safely? is the library thread-safe?

is the library supposed to be thread safe? note that curl_global_init() is NOT thread-safe, and curl_easy_init is threadsafe ONLY IF curl_global_init() has already been executed. if you start several threads that all call curl_easy_init() at the same time, before curl_global_init has been executed, you may run into problems, how does this reflect on go-curl?

cannot find the PUT and GET method implementation

Hi,
This go-curl library really helped me in my project for getting the ssl communication to endpoint servers from my DUT. Currently, i found the POST method to send the data to the server, but i could not find the examples or API's for PUT and GET methods here..could you please help me with the examples of these both methods.
I'm really need of these methods asap..

Go 1.6 compatibility

https://tip.golang.org/doc/go1.6#cgo

$ go version
go version go1.6rc2 darwin/amd64
$ go test
--- FAIL: TestVersionInfo (0.00s)
    core_test.go:20: protocol should be in [dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp scp sftp] and is smb.
    core_test.go:20: protocol should be in [dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smtp smtps telnet tftp scp sftp] and is smbs.

--- FAIL: TestCallbackFunction (0.00s)
panic: runtime error: cgo argument has Go pointer to Go pointer [recovered]
    panic: runtime error: cgo argument has Go pointer to Go pointer

goroutine 19 [running]:
testing.tRunner.func1(0xc8200fa000)
    /usr/local/go/src/testing/testing.go:467 +0x192
github.com/andelf/go-curl._cgoCheckPointer0(0x42ece00, 0xc8200da0e0, 0x0, 0x0, 0x0, 0x6000000)
    ??:0 +0x4d
github.com/andelf/go-curl.(*CURL).Setopt(0xc8200da0e0, 0x4e2b, 0x4343140, 0xc8200d01e0, 0x0, 0x0)
    /Users/ottob/go/src/github.com/andelf/go-curl/easy.go:197 +0x10e7
github.com/andelf/go-curl.TestCallbackFunction(0xc8200fa000)
    /Users/ottob/go/src/github.com/andelf/go-curl/easy_test.go:45 +0x1a7
testing.tRunner(0xc8200fa000, 0x45ca0b0)
    /usr/local/go/src/testing/testing.go:473 +0x98
created by testing.RunTests
    /usr/local/go/src/testing/testing.go:582 +0x892
exit status 2
FAIL    github.com/andelf/go-curl   0.019s

Get cURL error code

I haven't found a way to get cURL error code so far. When using EasyInit, it's returning error message string like curl: Couldn't resolve host name.

func main() {
        easy := curl.EasyInit()
	defer easy.Cleanup()

	easy.Setopt(curl.OPT_URL, "http://zzzzzzzz---.com")

	if err := easy.Perform(); err != nil {
		fmt.Println(err, err.Error())
	}
}

But, how to get the cURL error code like the libcurl equivalent returns.

int main(int argc, char *argv[]) {
    CURL *easyhandle = curl_easy_init();
    curl_easy_setopt(easyhandle, CURLOPT_URL, "http://zzzzzzzz---.com");
    int errorCode = curl_easy_perform(easyhandle);
    printf("Error Code: %d %d\n", errorCode, errorCode == CURLE_COULDNT_RESOLVE_HOST);
    return 0;
}

license?

what's the license for go-curl?

为什么换个url就没有输出了

package main

import (
"fmt"
curl "github.com/andelf/go-curl"
)

func main() {
easy := curl.EasyInit()
defer easy.Cleanup()

easy.Setopt(curl.OPT_URL, "http://www.163.com/")

// make a callback function

easy.Setopt(curl.OPT_WRITEFUNCTION, fooTest)
if err := easy.Perform(); err != nil {
    fmt.Printf("ERROR: %v\n", err)
}

}

func fooTest(buf []byte, userdata interface{}) bool {
println("DEBUG: size=>", len(buf))
println("DEBUG: content=>", string(buf))
return true
}

HTTP2 support?

Curl has http2 support since some time ago https://curl.se/docs/http2.html. In fact, it is enabled by default when https is used.

Is it planned to get this options supported in the project?
If not, I would like to understand what it is needed to enable it.

Supporting these new options involves executing the pre-processor programs like: #51 or is it needed an extra effort to enable it?

Of course, I suppose that supporting some of the new HTTP2 features (streaming, bidirectional, etc.) will require an extra effort, but maybe a "light" version of http2 support would take advantage of most features in HTTP2 (speed, compression, security, etc.).

compilation failure with libcurl 7.19.7

Any chance you can support this older version of libcurl?

bash-4.1# curl --version
curl 7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.14.0.0 zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Protocols: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz 
bash-4.1# go get -v github.com/andelf/go-curl
error: 'CURL_VERSION_TLSAUTH_SRP' undeclared (first use in this function)
error: 'CURL_VERSION_NTLM_WB' undeclared (first use in this function)

help

go get -u github.com/andelf/go-curl

github.com/andelf/go-curl

C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\core.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_getdate': E:\go\src\github.com\andelf\go-curl/core.go:41: undefined reference to_imp__cu
rl_getdate'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\core.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_global_cleanup': E:\go\src\github.com\andelf\go-curl/core.go:50: undefined reference to_imp__cu
rl_global_cleanup'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\core.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_global_init': E:\go\src\github.com\andelf\go-curl/core.go:60: undefined reference to_imp__cu
rl_global_init'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\core.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_version': E:\go\src\github.com\andelf\go-curl/core.go:69: undefined reference to_imp__cu
rl_version'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\core.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_version_info': E:\go\src\github.com\andelf\go-curl/core.go:79: undefined reference to_imp__cu
rl_version_info'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_cleanup': E:\go\src\github.com\andelf\go-curl/easy.go:90: undefined reference to_imp__cu
rl_easy_cleanup'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_duphandle': E:\go\src\github.com\andelf\go-curl/easy.go:100: undefined reference to_imp__c
url_easy_duphandle'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_escape': E:\go\src\github.com\andelf\go-curl/easy.go:112: undefined reference to_imp__c
url_easy_escape'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_getinfo_double': E:\go\src\github.com\andelf\go-curl/easy.go:32: undefined reference to_imp__cu
rl_easy_getinfo'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_getinfo_long': E:\go\src\github.com\andelf\go-curl/easy.go:29: undefined reference to_imp__cu
rl_easy_getinfo'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_getinfo_slist': E:\go\src\github.com\andelf\go-curl/easy.go:35: undefined reference to_imp__cu
rl_easy_getinfo'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_getinfo_string': E:\go\src\github.com\andelf\go-curl/easy.go:26: undefined reference to_imp__cu
rl_easy_getinfo'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_init': E:\go\src\github.com\andelf\go-curl/easy.go:169: undefined reference to_imp__c
url_easy_init'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_pause': E:\go\src\github.com\andelf\go-curl/easy.go:180: undefined reference to_imp__c
url_easy_pause'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_perform': E:\go\src\github.com\andelf\go-curl/easy.go:190: undefined reference to_imp__c
url_easy_perform'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_recv': E:\go\src\github.com\andelf\go-curl/easy.go:203: undefined reference to_imp__c
url_easy_recv'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_reset': E:\go\src\github.com\andelf\go-curl/easy.go:212: undefined reference to_imp__c
url_easy_reset'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_send': E:\go\src\github.com\andelf\go-curl/easy.go:225: undefined reference to_imp__c
url_easy_send'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_setopt_long': E:\go\src\github.com\andelf\go-curl/easy.go:10: undefined reference to_imp__cu
rl_easy_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_setopt_off_t': E:\go\src\github.com\andelf\go-curl/easy.go:22: undefined reference to_imp__cu
rl_easy_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_setopt_pointer': E:\go\src\github.com\andelf\go-curl/easy.go:19: undefined reference to_imp__cu
rl_easy_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_setopt_slist': E:\go\src\github.com\andelf\go-curl/easy.go:16: undefined reference to_imp__cu
rl_easy_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_easy_setopt_string': E:\go\src\github.com\andelf\go-curl/easy.go:13: undefined reference to_imp__cu
rl_easy_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_strerror': E:\go\src\github.com\andelf\go-curl/easy.go:295: undefined reference to_imp__c
url_easy_strerror'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_easy_unescape': E:\go\src\github.com\andelf\go-curl/easy.go:308: undefined reference to_imp__c
url_easy_unescape'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_formadd_name_content_length': E:\go\src\github.com\andelf\go-curl/easy.go:40: undefined reference to_imp__cu
rl_formadd'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_formadd_name_content_length_type': E:\go\src\github.com\andelf\go-curl/easy.go:47: undefined reference to_imp__cu
rl_formadd'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function curl_formadd_name_file_type': E:\go\src\github.com\andelf\go-curl/easy.go:55: undefined reference to_imp__cu
rl_formadd'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_free': E:\go\src\github.com\andelf\go-curl/easy.go:360: undefined reference to_imp__c
url_free'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\easy.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_slist_append': E:\go\src\github.com\andelf\go-curl/easy.go:371: undefined reference to_imp__c
url_slist_append'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_add_handle': E:\go\src\github.com\andelf\go-curl/multi.go:43: undefined reference to_imp__c
url_multi_add_handle'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_cleanup': E:\go\src\github.com\andelf\go-curl/multi.go:53: undefined reference to_imp__c
url_multi_cleanup'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_init': E:\go\src\github.com\andelf\go-curl/multi.go:62: undefined reference to_imp__c
url_multi_init'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_perform': E:\go\src\github.com\andelf\go-curl/multi.go:73: undefined reference to_imp__c
url_multi_perform'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_remove_handle': E:\go\src\github.com\andelf\go-curl/multi.go:84: undefined reference to_imp__c
url_multi_remove_handle'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function curl_multi_setopt_long': E:\go\src\github.com\andelf\go-curl/multi.go:8: undefined reference toimp__cu
rl_multi_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function curl_multi_setopt_pointer': E:\go\src\github.com\andelf\go-curl/multi.go:11: undefined reference toimp__c
url_multi_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_strerror': E:\go\src\github.com\andelf\go-curl/multi.go:118: undefined reference toimp

curl_multi_strerror'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\multi.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_multi_timeout': E:\go\src\github.com\andelf\go-curl/multi.go:129: undefined reference toimp

curl_multi_timeout'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\share.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_share_cleanup': E:\go\src\github.com\andelf\go-curl/share.go:41: undefined reference to_imp__c
url_share_cleanup'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\share.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_share_init': E:\go\src\github.com\andelf\go-curl/share.go:50: undefined reference to_imp__c
url_share_init'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\share.cgo2.o: In function curl_share_setopt_long': E:\go\src\github.com\andelf\go-curl/share.go:7: undefined reference to_imp__cu
rl_share_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\share.cgo2.o: In function curl_share_setopt_pointer': E:\go\src\github.com\andelf\go-curl/share.go:10: undefined reference to_imp__c
url_share_setopt'
C:\Users\think\AppData\Local\Temp\go-build789965335\github.com\andelf\go-curl_o
bj\share.cgo2.o: In function cgo_99b504ba8303_Cfunc_curl_share_strerror': E:\go\src\github.com\andelf\go-curl/share.go:84: undefined reference to_imp__c
url_share_strerror'
collect2: ld returned 1 exit status

what is wrong?

No Windows 7 x64 Support

Running in Windows 7 x64

go get -v github.com/andelf/go-curl

gives the error

cc1.exe: sorry, unimplemented: 64-bit mode not compiled in

and therefore cant be used.

Gcc-Version: gcc.exe (GCC) 4.9.3

Fail to compile under linux 2.6.32, curl 7.12.

curl 7.12.1 (x86_64-redhat-linux-gnu) libcurl/7.12.1 OpenSSL/0.9.7a zlib/1.2.1.2 libidn/0.5.6
Protocols: ftp gopher telnet dict ldap http file https ftps 
Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
1: error: 'CURLOPT_INTERLEAVEFUNCTION' undeclared (first use in this function)
1: note: each undeclared identifier is reported only once for each function it appears in
1: error: 'CURL_READFUNC_PAUSE' undeclared (first use in this function)
1: error: 'CURLPAUSE_CONT' undeclared (first use in this function)
1: error: 'CURLOPT_CONV_FROM_NETWORK_FUNCTION' undeclared (first use in this function)
1: error: 'CURLINFO_PRIMARY_PORT' undeclared (first use in this function)
1: error: 'CURLOPT_KRBLEVEL' undeclared (first use in this function)
1: error: 'CURLOPT_COPYPOSTFIELDS' undeclared (first use in this function)
1: error: 'CURLOPT_POSTREDIR' undeclared (first use in this function)
1: error: 'CURLOPT_RESOLVE' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_ACCOUNT' undeclared (first use in this function)
1: error: 'CURLOPT_SEEKFUNCTION' undeclared (first use in this function)
1: error: 'CURLINFO_PRIMARY_IP' undeclared (first use in this function)
1: error: 'CURLOPT_MAIL_FROM' undeclared (first use in this function)
1: error: 'CURLE_SSL_ENGINE_INITFAILED' undeclared (first use in this function)
1: error: 'CURLOPT_PROTOCOLS' undeclared (first use in this function)
1: error: 'CURLMOPT_SOCKETDATA' undeclared (first use in this function)
1: error: 'CURLOPT_CRLFILE' undeclared (first use in this function)
1: error: 'CURLOPT_TIMEOUT_MS' undeclared (first use in this function)
1: error: 'CURLE_QUOTE_ERROR' undeclared (first use in this function)
1: error: 'CURLINFO_CONDITION_UNMET' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_KEYDATA' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_SERVER_CSEQ' undeclared (first use in this function)
1: error: 'CURLE_TFTP_UNKNOWNID' undeclared (first use in this function)
1: error: 'CURLMOPT_SOCKETFUNCTION' undeclared (first use in this function)
1: error: 'CURLOPT_DIRLISTONLY' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_AUTH_TYPES' undeclared (first use in this function)
1: error: 'CURLOPT_CONV_TO_NETWORK_FUNCTION' undeclared (first use in this function)
1: error: 'CURLFTP_CREATE_DIR' undeclared (first use in this function)
1: error: 'CURLOPT_CERTINFO' undeclared (first use in this function)
1: error: 'CURLOPT_MAX_SEND_SPEED_LARGE' undeclared (first use in this function)
1: error: 'CURLVERSION_FOURTH' undeclared (first use in this function)
1: error: 'CURLOPT_IOCTLDATA' undeclared (first use in this function)
1: error: 'CURLINFO_CERTINFO' undeclared (first use in this function)
1: error: 'CURLE_RTSP_SESSION_ERROR' undeclared (first use in this function)
1: error: 'CURLPAUSE_RECV' undeclared (first use in this function)
1: error: 'CURLOPT_PASSWORD' undeclared (first use in this function)
1: error: 'CURLOPT_APPEND' undeclared (first use in this function)
1: error: 'CURLE_CONV_FAILED' undeclared (first use in this function)
1: error: 'CURLPROXY_HTTP_1_0' undeclared (first use in this function)
1: error: 'CURLPROXY_SOCKS4A' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_PRIVATE_KEYFILE' undeclared (first use in this function)
1: error: 'CURLE_TFTP_NOTFOUND' undeclared (first use in this function)
1: error: 'CURLE_USE_SSL_FAILED' undeclared (first use in this function)
1: error: 'CURLE_SSL_CACERT_BADFILE' undeclared (first use in this function)
1: error: 'CURLINFO_FTP_ENTRY_PATH' undeclared (first use in this function)
1: error: 'CURLE_CONV_REQD' undeclared (first use in this function)
1: error: 'CURLOPT_FTPSSLAUTH' undeclared (first use in this function)
1: error: 'CURLOPT_TRANSFER_ENCODING' undeclared (first use in this function)
1: error: 'CURLM_BAD_SOCKET' undeclared (first use in this function)
1: error: 'CURLOPT_CHUNK_END_FUNCTION' undeclared (first use in this function)
1: error: 'CURLE_REMOTE_FILE_NOT_FOUND' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_REQUEST' undeclared (first use in this function)
1: error: 'CURLFTP_CREATE_DIR_RETRY' undeclared (first use in this function)
1: error: 'CURLOPT_IOCTLFUNCTION' undeclared (first use in this function)
1: error: 'CURLE_RANGE_ERROR' undeclared (first use in this function)
1: error: 'CURLPROXY_SOCKS5_HOSTNAME' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_FILEMETHOD' undeclared (first use in this function)
1: error: 'CURL_VERSION_SSPI' undeclared (first use in this function)
1: error: 'CURLMOPT_TIMERDATA' undeclared (first use in this function)
1: error: 'CURLINFO_RTSP_CLIENT_CSEQ' undeclared (first use in this function)
1: error: 'CURLOPT_SOCKS5_GSSAPI_NEC' undeclared (first use in this function)
1: error: 'CURLOPT_HTTP_TRANSFER_DECODING' undeclared (first use in this function)
1: error: 'CURLE_REMOTE_FILE_EXISTS' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_SSL_CCC' undeclared (first use in this function)
1: error: 'CURLOPT_NEW_DIRECTORY_PERMS' undeclared (first use in this function)
1: error: 'CURLE_UPLOAD_FAILED' undeclared (first use in this function)
1: error: 'CURLINFO_APPCONNECT_TIME' undeclared (first use in this function)
1: error: 'CURLOPT_HTTP_CONTENT_DECODING' undeclared (first use in this function)
1: error: 'CURLOPT_TLSAUTH_TYPE' undeclared (first use in this function)
1: error: 'CURLFTP_CREATE_DIR_NONE' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_SKIP_PASV_IP' undeclared (first use in this function)
1: error: 'CURLE_RTSP_CSEQ_ERROR' undeclared (first use in this function)
1: error: 'CURLOPT_FNMATCH_FUNCTION' undeclared (first use in this function)
1: error: 'CURLOPT_PROXY_TRANSFER_MODE' undeclared (first use in this function)
1: error: 'CURLINFO_REDIRECT_URL' undeclared (first use in this function)
1: error: 'CURLE_FTP_BAD_FILE_LIST' undeclared (first use in this function)
1: error: 'CURLOPT_MAIL_RCPT' undeclared (first use in this function)
1: error: 'CURLOPT_PROXYPASSWORD' undeclared (first use in this function)
1: error: 'CURLOPT_SEEKDATA' undeclared (first use in this function)
1: error: 'CURLINFO_RTSP_SESSION_ID' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_USE_PRET' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_KEYFUNCTION' undeclared (first use in this function)
1: error: 'CURLINFO_SSL_ENGINES' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_CLIENT_CSEQ' undeclared (first use in this function)
1: error: 'CURLPAUSE_ALL' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_PUBLIC_KEYFILE' undeclared (first use in this function)
1: error: 'CURLINFO_RTSP_SERVER_CSEQ' undeclared (first use in this function)
1: error: 'CURLINFO_LASTSOCKET' undeclared (first use in this function)
1: error: 'CURLOPT_CONV_FROM_UTF8_FUNCTION' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_SESSION_ID' undeclared (first use in this function)
1: error: 'CURLOPT_USERNAME' undeclared (first use in this function)
1: error: 'CURLOPT_CONNECT_ONLY' undeclared (first use in this function)
1: error: 'CURLOPT_ISSUERCERT' undeclared (first use in this function)
1: error: 'CURLINFO_NUM_CONNECTS' undeclared (first use in this function)
1: error: 'CURLOPT_REDIR_PROTOCOLS' undeclared (first use in this function)
1: error: 'CURLOPT_PROXYUSERNAME' undeclared (first use in this function)
1: error: 'CURLOPT_RTSPHEADER' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_STREAM_URI' undeclared (first use in this function)
1: error: 'CURLE_SSL_SHUTDOWN_FAILED' undeclared (first use in this function)
1: error: 'CURLOPT_LOCALPORT' undeclared (first use in this function)
1: error: 'CURLOPT_OPENSOCKETFUNCTION' undeclared (first use in this function)
1: error: 'CURLINFO_RTSP_CSEQ_RECV' undeclared (first use in this function)
1: error: 'CURLOPT_TLSAUTH_USERNAME' undeclared (first use in this function)
1: error: 'CURLE_PEER_FAILED_VERIFICATION' undeclared (first use in this function)
1: error: 'CURLOPT_OPENSOCKETDATA' undeclared (first use in this function)
1: error: 'CURLM_UNKNOWN_OPTION' undeclared (first use in this function)
1: error: 'CURLPAUSE_RECV_CONT' undeclared (first use in this function)
1: error: 'CURLE_FTP_COULDNT_SET_TYPE' undeclared (first use in this function)
1: error: 'CURLOPT_IGNORE_CONTENT_LENGTH' undeclared (first use in this function)
1: error: 'CURL_VERSION_TLSAUTH_SRP' undeclared (first use in this function)
1: error: 'CURLOPT_INTERLEAVEDATA' undeclared (first use in this function)
1: error: 'CURLINFO_OS_ERRNO' undeclared (first use in this function)
1: error: 'CURLOPT_SOCKS5_GSSAPI_SERVICE' undeclared (first use in this function)
1: error: 'CURLOPT_USE_SSL' undeclared (first use in this function)
1: error: 'CURLE_TFTP_NOSUCHUSER' undeclared (first use in this function)
1: error: 'CURLINFO_COOKIELIST' undeclared (first use in this function)
1: error: 'CURL_VERSION_CURLDEBUG' undeclared (first use in this function)
1: error: 'CURLOPT_LOCALPORTRANGE' undeclared (first use in this function)
1: error: 'CURLOPT_KEYPASSWD' undeclared (first use in this function)
1: error: 'CURLOPT_SERVER_RESPONSE_TIMEOUT' undeclared (first use in this function)
1: error: 'CURLE_TFTP_ILLEGAL' undeclared (first use in this function)
1: error: 'CURL_VERSION_CONV' undeclared (first use in this function)
1: error: 'CURLOPT_CONNECTTIMEOUT_MS' undeclared (first use in this function)
1: error: 'CURLE_TFTP_PERM' undeclared (first use in this function)
1: error: 'CURLINFO_LOCAL_PORT' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' undeclared (first use in this function)
1: error: 'CURLE_SSH' undeclared (first use in this function)
1: error: 'CURLOPT_ACCEPT_ENCODING' undeclared (first use in this function)
1: error: 'CURLOPT_FNMATCH_DATA' undeclared (first use in this function)
1: error: 'CURLINFO_LOCAL_IP' undeclared (first use in this function)
1: error: 'CURLOPT_SOCKOPTDATA' undeclared (first use in this function)
1: error: 'CURLMOPT_MAXCONNECTS' undeclared (first use in this function)
1: error: 'CURLOPT_WILDCARDMATCH' undeclared (first use in this function)
1: error: 'CURLE_REMOTE_ACCESS_DENIED' undeclared (first use in this function)
1: error: 'CURLE_CHUNK_FAILED' undeclared (first use in this function)
1: error: 'CURLOPT_RTSP_TRANSPORT' undeclared (first use in this function)
1: error: 'CURLOPT_ADDRESS_SCOPE' undeclared (first use in this function)
1: error: 'CURLOPT_CHUNK_DATA' undeclared (first use in this function)
1: error: 'CURLOPT_MAX_RECV_SPEED_LARGE' undeclared (first use in this function)
1: error: 'CURL_VERSION_NTLM_WB' undeclared (first use in this function)
1: error: 'CURLOPT_TFTP_BLKSIZE' undeclared (first use in this function)
1: error: 'CURLOPT_SOCKOPTFUNCTION' undeclared (first use in this function)
1: error: 'CURLE_SEND_FAIL_REWIND' undeclared (first use in this function)
1: error: 'CURLOPT_TLSAUTH_PASSWORD' undeclared (first use in this function)
1: error: 'CURLOPT_FTP_ALTERNATIVE_TO_USER' undeclared (first use in this function)
1: error: 'CURLMOPT_PIPELINING' undeclared (first use in this function)
1: error: 'CURLMOPT_TIMERFUNCTION' undeclared (first use in this function)
1: error: 'CURLOPT_SSL_SESSIONID_CACHE' undeclared (first use in this function)
1: error: 'CURLE_LOGIN_DENIED' undeclared (first use in this function)
1: error: 'CURLPAUSE_SEND' undeclared (first use in this function)
1: error: 'CURLOPT_CHUNK_BGN_FUNCTION' undeclared (first use in this function)
1: error: 'CURLOPT_SSH_KNOWNHOSTS' undeclared (first use in this function)
1: error: 'CURLOPT_NEW_FILE_PERMS' undeclared (first use in this function)
1: error: 'CURLE_REMOTE_DISK_FULL' undeclared (first use in this function)
1: error: 'CURLOPT_COOKIELIST' undeclared (first use in this function)
1: error: 'CURLPAUSE_SEND_CONT' undeclared (first use in this function)
1: error: 'CURLOPT_NOPROXY' undeclared (first use in this function)

No such file or directory: stdio.h

测试环境:ubuntu12.10
使用readme里的例子
在本地环境下 go run test.go 无异常
但是通过如下操作:
CGO_ENABLED=0 GOOS=windows GOARCH=386 go build ~/www/go/src/test/test.go

提示:

github.com/andelf/go-curl

../github.com/andelf/go-curl/c-callback.c:2 8c: No such file or directory: stdio.h

ERROR: curl: Out of memory

Hi there! Thank you for opensourcing!

My go version:
go version go1.7.4 linux/amd64
My libcurl version:
7.52.1-2

I have such function:

func curlIt(url string, host string)  {
	start := time.Now()
	easy := curl.EasyInit()
	defer easy.Cleanup()

	callBackDataFunc := func(buf []byte, userdata interface{}) bool {
		elapsed := time.Since(start)
		log := fmt.Sprintf("\n=>URL:%v  Time spent:%v, size=>%v", url, elapsed, len(buf))
		logger.Output(1, log)
		return true
	}

	optResolve := fmt.Sprintf("somehost:443:%v", host)

	easy.Setopt(curl.OPT_WRITEFUNCTION, callBackDataFunc)
	easy.Setopt(curl.OPT_RESOLVE, []string{optResolve})
	easy.Setopt(curl.OPT_URL, url)
	if err := easy.Perform(); err != nil {
		fmt.Printf("ERROR: %v\n", err)
	}
}

Which I run inside goroutine in for loop, where url is valid url I want to fetch and host is existing ipv4 address I want curllib resolve instead of host inside url. Like this:

	for {
		<-time.After(time.Duration(period) * time.Second)
		for _, square := range squaresSlice {
			//dunno how to do it better than []int{1,2,3}
			for range []int{1,2,3} {
				url := generateUrl(square)
				go func() {
					for _, host := range hosts {
                                                // !Here!
						curlIt(url, host)
					}
				}()
			}
		}
	}

I want you to pay attention to such string as easy.Setopt(curl.OPT_RESOLVE, []string{optResolve})

When I added this option to curl - I get strange result: for all, exept of one urls in the ONLY FIRST iteration of for _, square := range squaresSlice I get:

ERROR: curl: Out of memory
ERROR: curl: Out of memory
logger: main.go:96: 
=>URL:https://url_address  Time spent:19.594906ms, size=>16045

In all follow iterations of for _, square := range squaresSlice I get no Out of memory error at all, never. Only first start, only all, except one of urls fails with out of memory.

And when I remove this option, like this:

       	// optResolve := fmt.Sprintf("somehost:443:%v", host)
        ....
	// easy.Setopt(curl.OPT_RESOLVE, []string{optResolve})

I have no such problem at all.

Do you have any suggestions what could be cause?

Fails to build on go weekly.2011-12-01 and beyond

go-curl fails to build on go releases after November 30, 2011. The time package was rewritten in this commit, which causes the following error:

github.com/andelf/go-curl/curl: build failed: exit status 2
cd "/opt/go/src/pkg/github.com/andelf/go-curl/curl" && "bash gomake -f- install"
6g  -I "/opt/go/pkg/linux_amd64"  -p github.com/andelf/go-curl/curl -o _go_.6  _obj/callback.cgo1.go _obj/const.cgo1.go _obj/core.cgo1.go _obj/easy.cgo1.go _obj/multi.cgo1.go _obj/share.cgo1.go _obj/_cgo_gotypes.go
core.go:82[_obj/core.cgo1.go:85]: undefined: time.SecondsToUTC
make: *** [_go_.6] Error 1

core.go:99 can be changed from return time.SecondsToUTC(int64(t)) to return time.Unix(int64(t)) to fix this issue. However, time.Unix() returns a time.Time value in the local timezone unlike time.SecondsToUTC() which returns a time.Time value in the UTC timezone, so I'm not sure if further modifications are necessary to convert the Time value to UTC.

Problem with compat.h

Hi,

First, I would like to thank you for your work on go-curl.

In compat.h, you are using ifndefs and defines to define the options/errors/infos that have been added over time to libcurl. From what I understand it has been done in order to allow old version of libcurl to run with go-curl.

The problem is that if you have a look at curl.h, you will see that the options/errors/infos are not #defines, they are part of enums which means that your ifndefs will always evaluate to true and your #defines will shadow the actual values in the enums.

I've been trying to retrieve info like CURLINFO_OS_ERRNO, and got errors from libcurl that say: "A libcurl function was given a bad argument".
After removing compat.h, everything worked well.

In my opinion, you should probably remove the compat.h file which prevent the user to use recent features from libcurl.

Best regards,
Gauthier Lamaison

how to know the compiled in libcurl version?

I'm using centos6, it has default curl 7.19 installed, and cant be removed by yum becaused it is needed by many other program
i'm trying to compile 7.72 with go-curl, is there a way to show the libcurl version the go-curl currently using?
I executed go get -v in my project dir, and recompiled my program, and it didn't work.
What commands do i need to tell the cgo compiler to use my curl7.72 instead not 7.19 , thanks.

Curl --data-urlencode

Hello!

First, thank you for this awesome curl binding, it works very well.
But i want to send a POST payload with "\n" in the message.

With command line :

curl -X POST --data-urlencode 'payload={"msg": "First line\nSecond Line"}'

And the \n is encoded : %5Cn

This is the entire payload encoded :

payload=%7B%22msg%22%3A%20%22First%20line%5CnSecond%20Line%22%7D

How to do this with your library please?

go test failed !!!

go test failed , maebe because callback function!!
below is info :go test 不过。

go版本 go version go1.1.1 linux/amd64

~/workspace/golang/src/github.com/andelf/go-curl/ [master] go test

unexpected fault address 0xfffff8250c8b4864
fatal error: fault
[signal 0xb code=0x1 addr=0xfffff8250c8b4864 pc=0xfffff8250c8b4864]

goroutine 8 [running]:
[fp=0x7ff0fdd7ed10] runtime.throw(0x9c79f7)
/usr/local/go/src/pkg/runtime/panic.c:473 +0x67
[fp=0x7ff0fdd7ed28] runtime.sigpanic()
/usr/local/go/src/pkg/runtime/os_linux.c:239 +0xe7
created by testing.RunTests
/usr/local/go/src/pkg/testing/testing.go:433 +0x86b

goroutine 1 [chan receive]:
testing.RunTests(0x6c9ec8, 0x9c6300, 0x7, 0x7, 0x66cb01, ...)
/usr/local/go/src/pkg/testing/testing.go:434 +0x88e
testing.Main(0x6c9ec8, 0x9c6300, 0x7, 0x7, 0x9dc6e0, ...)
/usr/local/go/src/pkg/testing/testing.go:365 +0x8a
main.main()
github.com/andelf/go-curl/_test/_testmain.go:55 +0x9a

goroutine 2 [syscall]:

goroutine 9 [IO wait]:
net.runtime_pollWait(0x7ff0fdf17f00, 0x72, 0x0)
/usr/local/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82
net.(_pollDesc).WaitRead(0xc2000bc3e0, 0xb, 0xc2000b2db0)
/usr/local/go/src/pkg/net/fd_poll_runtime.go:75 +0x31
net.(_netFD).accept(0xc2000bc360, 0x6c9fd8, 0x0, 0xc2000b2db0, 0xb, ...)
/usr/local/go/src/pkg/net/fd_unix.go:385 +0x2c1
net.(_TCPListener).AcceptTCP(0xc200000410, 0x41b278, 0x9ddc30, 0xc2000e9000)
/usr/local/go/src/pkg/net/tcpsock_posix.go:229 +0x45
net.(_TCPListener).Accept(0xc200000410, 0x7ff0fdd7dfb0, 0x41b123, 0x6ca008, 0x7ff0fde9bf00, ...)
/usr/local/go/src/pkg/net/tcpsock_posix.go:239 +0x25
net/http/httptest.(_historyListener).Accept(0xc2000e32d0, 0x0, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/pkg/net/http/httptest/server.go:48 +0x54
net/http.(_Server).Serve(0xc2000a35f0, 0xc20009fc40, 0xc2000e32d0, 0x0, 0x0, ...)
/usr/local/go/src/pkg/net/http/server.go:1542 +0x85
created by net/http/httptest.(*Server).Start
/usr/local/go/src/pkg/net/http/httptest/server.go:109 +0x21a

goroutine 7 [runnable]:
net.runtime_pollWait(0x7ff0fdf17e60, 0x72, 0x0)
/usr/local/go/src/pkg/runtime/znetpoll_linux_amd64.c:118 +0x82
net.(_pollDesc).WaitRead(0xc2000bc230, 0xb, 0xc2000b2db0)
/usr/local/go/src/pkg/net/fd_poll_runtime.go:75 +0x31
net.(_netFD).Read(0xc2000bc1b0, 0xc2000e2000, 0x1000, 0x1000, 0x0, ...)
/usr/local/go/src/pkg/net/fd_unix.go:195 +0x2b3
net.(_conn).Read(0xc200000390, 0xc2000e2000, 0x1000, 0x1000, 0xa, ...)
/usr/local/go/src/pkg/net/net.go:123 +0xc3
net/http.(_liveSwitchReader).Read(0xc2000bc268, 0xc2000e2000, 0x1000, 0x1000, 0x1, ...)
/usr/local/go/src/pkg/net/http/server.go:205 +0x91
io.(_LimitedReader).Read(0xc2000bb660, 0xc2000e2000, 0x1000, 0x1000, 0x666240, ...)
/usr/local/go/src/pkg/io/io.go:394 +0xc0
net/http.(_switchReader).Read(0xc200084820, 0xc2000e2000, 0x1000, 0x1000, 0x0, ...)
/usr/local/go/src/pkg/net/http/chunked.go:0 +0x62
bufio.(_Reader).fill(0xc2000c6360)
/usr/local/go/src/pkg/bufio/bufio.go:79 +0x10c
bufio.(_Reader).ReadSlice(0xc2000c6360, 0x40e20a, 0x0, 0x0, 0x0, ...)
/usr/local/go/src/pkg/bufio/bufio.go:262 +0x202
bufio.(_Reader).ReadLine(0xc2000c6360, 0x0, 0x0, 0x0, 0x7ff0fdd6ec00, ...)
/usr/local/go/src/pkg/bufio/bufio.go:293 +0x61
net/textproto.(_Reader).readLineSlice(0xc2000e3030, 0xe004a42bb, 0x422a4f, 0xc2000a6680, 0x654500, ...)
/usr/local/go/src/pkg/net/textproto/reader.go:55 +0x51
net/textproto.(_Reader).ReadLine(0xc2000e3030, 0xc2000a6680, 0x7ff0fdd6ed6f, 0x10, 0xc200084520, ...)
/usr/local/go/src/pkg/net/textproto/reader.go:36 +0x25
net/http.ReadRequest(0xc2000c6360, 0xc2000a6680, 0x0, 0x0)
/usr/local/go/src/pkg/net/http/request.go:510 +0x86
net/http.(_conn).readRequest(0xc2000bc240, 0x0, 0x0, 0x0)
/usr/local/go/src/pkg/net/http/server.go:547 +0x1bc
net/http.(_conn).serve(0xc2000bc240)
/usr/local/go/src/pkg/net/http/server.go:1052 +0x398
created by net/http.(_Server).Serve
/usr/local/go/src/pkg/net/http/server.go:1564 +0x266

goroutine 10 [runnable]:
syscall.Syscall()
/usr/local/go/src/pkg/syscall/asm_linux_amd64.s:36 +0x64
syscall.write(0x9, 0xc2000e8000, 0x85, 0x1000, 0x0, ...)
/usr/local/go/src/pkg/syscall/zerrors_linux_amd64.go:2717 +0x70
syscall.Write(0x9, 0xc2000e8000, 0x85, 0x1000, 0xc2000e3120, ...)
/usr/local/go/src/pkg/syscall/syscall_unix.go:143 +0x5a
net.(_netFD).Write(0xc2000bc3f0, 0xc2000e8000, 0x85, 0x1000, 0x0, ...)
/usr/local/go/src/pkg/net/fd_unix.go:286 +0x24e
net.(_conn).Write(0xc200000448, 0xc2000e8000, 0x85, 0x1000, 0x7ff0fdd7de10, ...)
/usr/local/go/src/pkg/net/net.go:131 +0xc3
net/http.(_switchWriter).Write(0xc2000849a0, 0xc2000e8000, 0x85, 0x1000, 0x10, ...)
/usr/local/go/src/pkg/net/http/chunked.go:0 +0x62
bufio.(_Writer).Flush(0xc20009fec0, 0xc2000848a0, 0x0)
/usr/local/go/src/pkg/bufio/bufio.go:465 +0xb9
net/http.(_response).finishRequest(0xc2000bea10)
/usr/local/go/src/pkg/net/http/server.go:931 +0x9c
net/http.(_conn).serve(0xc2000bc480)
/usr/local/go/src/pkg/net/http/server.go:1100 +0x796
created by net/http.(*Server).Serve
/usr/local/go/src/pkg/net/http/server.go:1564 +0x266
exit status 2
FAIL github.com/andelf/go-curl 0.039s

Use method like DELETE

Hello, it's me again !

I can not find how to use a custom HTTP method.
I use your libcurl bind to communicate with an API and I need to send GET,POST,PUT,DELETE and HEAD HTTP requests please.

Question about userdata interface{} argument to callback function

Firstly, thank you very much for the go-curl package!
I have a question :
In my implementation, when I print out the user data field from the callback function that gets passed to WRITEFUNCTION, i get
{[] 0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0}

What is it supposed to contain ?

The following is the code I use
// Callback function to save data instead of redirecting it into stdout.
	writeToBufferFunc := func(buf []byte, userdata interface{}) bool {
		if silent == false {
			b.Write([]byte(buf))
		}
		logging.Infof("\n\n %v \n\n ", userdata)
		return true
	}

	this.myCurl.Setopt(curl.OPT_WRITEFUNCTION, writeToBufferFunc)

	this.myCurl.Setopt(curl.OPT_WRITEDATA, b)

	if err := this.myCurl.Perform(); err != nil {
		if show_error == true {
			return nil, err
		} else {
			return nil, nil
		}
	}

No package 'libcurl' found

package main

import (
"fmt"
curl "github.com/andelf/go-curl"
)

func main() {
easy := curl.EasyInit()
defer easy.Cleanup()
if easy != nil {
easy.Setopt(curl.OPT_URL, "http://www.google.com/")
easy.Perform()
}
}

run result as:
[ replay | done: 282.65ms ]
# pkg-config --cflags libcurl
Package libcurl was not found in the pkg-config search path.
Perhaps you should add the directory containing `libcurl.pc'
to the PKG_CONFIG_PATH environment variable
No package 'libcurl' found
exit status 1

exit status 2

package “libcurl” where?

sudo apt-get install libcurl3-dev

如何在windows上安装?

试了好多次,不知道如何安装 也装了MINGW 然后编译完的libcurl文件不知道应该扔哪里

I don't know how to install curl in Windows(不知道怎么装curl 在windows)

HI, I'm new for golang/c. When I run example, it will throw an exception "..\callback.go:6:23: fatal error: curl/curl.h: No such file or directory". I know I need to install curl but I don't know how to do that. Could you give me more detail to fix this.

我不知道怎么装curl, 能给写详细点么怎么装curl

大神,您好

我自己用go写了一个 客户端 测试性能,我的服务端什么都没做直接返回,用curl 测试性能比我用go写的快了一倍多,go上面开的goroutine 与 curl开的线程数是一样的,弄了好久也没找出问题来,而且客户端connection复用之类的都用上了,body每次用完也关闭了。弄了很久很久都没找出原因,快有3个月了,而且网上找了一些也没答案。我看您写这个了 想问问您知道我这个问题怎么回事吗?
如果您需要我可以把完整代码发给您,这个问题我实在不知道怎么弄了。您能指点一下我吗?
我的微信shanghaichaoren 期待您的回复,万分感谢,涕零顿首!!!

运行一会儿报错

goroutine 246 [syscall]:
github.com/andelf/go-curl._Cfunc_curl_easy_perform(0x7f9aac05caa0, 0x7f9af4b64ad8)
    github.com/andelf/go-curl/_obj/_cgo_defun.c:132 +0x31
github.com/andelf/go-curl.(*CURL).Perform(0xc2119ad3c0, 0x4e2b, 0x63a2c0)
    /home/golang/ab/src/github.com/andelf/go-curl/easy.go:281 +0x2a
main.(*Curlx).Send(0xc2119b02d0, 0x0, 0x0)
    /home/golang/ab/curl.go:123 +0x734
main.fastcc(0x6b57c0, 0x3, 0xc21001fb40, 0x42, 0x0, ...)
    /home/golang/ab/cc.go:132 +0x6c9
created by main.workerConfig
    /home/golang/ab/worker.go:143 +0xe26

goroutine 385 [syscall]:
github.com/andelf/go-curl._Cfunc_curl_easy_perform(0x7f9ad80008c0, 0x7f9af4b62ad8)
    github.com/andelf/go-curl/_obj/_cgo_defun.c:132 +0x31
github.com/andelf/go-curl.(*CURL).Perform(0xc2119c5780, 0x4e2b, 0x63a2c0)
    /home/golang/ab/src/github.com/andelf/go-curl/easy.go:281 +0x2a
main.(*Curlx).Send(0xc21197ad20, 0x0, 0x0)
    /home/golang/ab/curl.go:123 +0x734
main.fastcc(0x6b57c0, 0x3, 0xc21001fb40, 0x42, 0x0, ...)
    /home/golang/ab/cc.go:132 +0x6c9
created by main.workerConfig
    /home/golang/ab/worker.go:143 +0xe26

Error on using go get to install your packages in go1

Hello andelf,

I just wanted to try your package on my machine (Ubuntu 11.10, 64bit / go 1), but on issuing the "go get" command from your readme, I get the following error-messages from go :

go get -u github.com/andelf/go-curl/curl

github.com/andelf/go-curl/curl

1: error: 'CURL_VERSION_NTLM_WB' undeclared (first use in this function)
1: note: each undeclared identifier is reported only once for each function it appears in
1: error: 'CURLOPT_CLOSESOCKETDATA' undeclared (first use in this function)
1: error: 'CURLOPT_CLOSESOCKETFUNCTION' undeclared (first use in this function)

Kind regards
Thomas

Return HTTP status

Hello, I'm relatively new to Go and don't know on how to approach on debugging Go libraries.

My question is how do we log the HTTP Status (200, 400, 502) when using this library? The doc only shows how to get the response.

Thanks for the help!

Couldn't read Getinfo Informations

Hello,

I couldn't read response total time.


package main

import (
    "fmt"
    curl "github.com/andelf/go-curl"
)

func main() {
    easy := curl.EasyInit()
    defer easy.Cleanup()

    easy.Setopt(curl.OPT_URL, "http://www.baidu.com/")

    // make a callback function
    fooTest := func (buf []byte, userdata interface{}) bool {
        //println("DEBUG: size=>", len(buf))
        //println("DEBUG: content=>", string(buf))
        return true
    }

    x,err:=easy.Getinfo(curl.INFO_TOTAL_TIME)
    if err != nil {
    }
    fmt.Printf("total:%f",x)


    easy.Setopt(curl.OPT_WRITEFUNCTION, fooTest)

    if err := easy.Perform(); err != nil {
        fmt.Printf("ERROR: %v\n", err)
    }
}

Returned :
total:0.000000

Other options are like same too

curled zip files are roughly double in size

Here is the header info from verbose output:

< HTTP/1.1 200 OK
* Server Apache-Coyote/1.1 is not blacklisted
< Server: Apache-Coyote/1.1
< Set-Cookie: cq-authoring-mode=CLASSIC; Path=/
< Last-Modified: Wed, 26 Nov 2014 22:33:43 GMT
< Content-Type: application/zip
< Content-Length: 68339
< Date: Fri, 28 Nov 2014 18:04:21 GMT

After curling the file size is 129168, which is about double. Here is the WRITEFUNCTION I have:

// callback function for OPT_WRITEFUNCTION. See libcurl docs.
func WriteData(ptr []byte, userdata interface{}) bool {
    // Create ptr reference to tempfile to which we are writing
    writePtr := userdata.(*os.File)

    // Create a bufio reader and writer
    reader := bufio.NewReader(bytes.NewReader(ptr))
    writer := bufio.NewWriter(writePtr)

    // Create a buffer of 1024 bytes
    buf := make([]byte, 1024)

    // Loop until break
    for {
        // read 1024 bytes and return actual number of bytes read into n
        nin, err := reader.Read(buf)
        if err != nil && err != io.EOF {
            panic(err)
        }
        // If we have nothing left to read, then break
        if nin == 0 {
            break
        }

        // write a buffer data from 0 to number of bytes read
        nout, err := writer.Write(buf[:nin])
        if err != nil {
            panic(err)
        }
        fmt.Printf("%d bytes written\n", nout)
    }

    // Flush the writer after we're done writing
    err := writer.Flush()
    if err != nil {
        panic(err)
    }

    return true
}

I tried copying and pasting a WRITEFUNCTION from the code examples in the the project, but they give me the same results.

Another thing that I've noticed, is that when I double click the downloaded zip file, it creates a file of the same name, with .cpgz appended to it. Double click it again and it creates a file of the same original name. This creates an infinite loop: http://osxdaily.com/2013/02/13/open-zip-cpgz-file/

unziping with the unzip binary works okay.

What could be causing the file to have extra data written to it?

Perform() hangs when passing in false to WRITEFUNCTION

Hi,

I was trying to write data returned into a buffer. However if there is a write error in the call back function then it looks like easy.Perform() hangs and never returns.

`b := NewBuffer(make([]byte, 0, 10), capacity)

// Callback function to save data instead of redirecting it into stdout.
writeToBufferFunc := func(buf []byte, userdata interface{}) bool {
	if silent == false {
		_, err := b.Write([]byte(buf))
		if err != nil {
			return false
		}
	}
	return true
}
    // the above callback function returns false in my case. Since there is a write error
    // I am trying to restrict the buffer capacity. 

this.myCurl.Setopt(curl.OPT_WRITEFUNCTION, writeToBufferFunc)

this.myCurl.Setopt(curl.OPT_WRITEDATA, b.mybuf)
logging.Infof("\n\n ---------------- Reaches here \n")

    // Hangs here and never reaches 2. 
if err := this.myCurl.Perform(); err != nil {
            logging.Infof("\n\n ---------------- Reaches here 2 \n")
	if show_error == true {
		return nil, err
	} else {
		return nil, nil
	}
}

`

Is there a way for me to fix this in my code ?

Thanks
Isha

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.