Giter VIP home page Giter VIP logo

rest-client's People

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  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

rest-client's Issues

RestClient breaks uploaded files

I'm trying to upload some files into CouchDB through RestClient but every uploading file is broken.

irb(main):001:0> require 'restclient'
=> true
irb(main):002:0> puts RestClient.put 'http://localhost:5984/test/2800f191127269544ba41da2f61fd572/test.psd?rev=1-57cd04a9cba53c9230093bba73742594', :file => File.new('test.psd')
{"ok":true,"id":"2800f191127269544ba41da2f61fd572","rev":"2-cb64f5ed963d72e1d3238fd6733f6d21"}
=> nil

The file has been changed and the one contains the following text at the beginning of file:

--154081

Content-Disposition: form-data; name="file"; filename="test.psd"

Content-Type: text/plain

The Exception class extends nil with a method_missing which causes a stack overflow if nil is called with an undefined method

In the Exception#initialize exceptions.rb, rest-client extends the response given with a module which includes a method_missing which makes the rest-client response compatible with net http response.

If later nil is called with an undefined method, it throws ruby into an infinite loop because it's trying to grab the net_http_res of nil so that it can call respond_to? on it.

Handle array parameter values

RestClient does not handle parameter values that are Arrays. Typically this translates into a query parameter that looks like this:

:q => [1,2,3]

into this:

?q=1&q=2&q=3

Specifically this patch does it (request.rb line 75):

      query_string = get_params.collect do |k, v|
        if v.is_a?(Array)
          v.map do |x|
            "#{k.to_s}=#{CGI::escape(x.to_s)}" 
          end.join('&')
        else
          "#{k.to_s}=#{CGI::escape(v.to_s)}" 
        end
      end.join('&')

Facebook Graph API Access Tokens are not recognized as valid URI

URIs that contain Access Tokens as used by Facebook's new Graph API are not recognized as valid.

For example, in an irb session (yup, there is a dot in the end of that URI...):

>> r = RestClient.get 'http://graph.facebook.com/btaylor?access_token=2227470867|2.4ZGC2oYAumfR2sqhRORCfA__.3600.1272560400-663966986|vB4dVnF6rhyh6QDJmwfEgmKvKlE.'
URI::InvalidURIError: bad URI(is not URI?): http://graph.facebook.com/btaylor?access_token=2227470867|2.4ZGC2oYAumfR2sqhRORCfA__.3600.1272560400-663966986|vB4dVnF6rhyh6QDJmwfEgmKvKlE.

undefined method `body' for nil:NilClass (NoMethodError) on nil @response in RestClient::Exception

Sometimes RestClient initializes a RestClient::Exception instance with a nil @response value. If you call http_code on this instance nil is returned because of:

def http_code
  # return integer for compatibility
  @response.code.to_i if @response
end

But if you call http_body you get an "undefined method `body' for nil:NilClass (NoMethodError)" because http_body doees not have the "if @response" guard:

def http_body
  @response.body
end

Shouldn't http_body have this guard as well?

Error with ruby 1.9.2: Can't modify frozen object

I get this error openenin the shell restclient in ruby 1.9.2:

restclient
/home/jmcervera/.rvm/gems/ruby-1.9.2-p0@rails2/gems/rest-client-1.6.1/bin/restclient:36:in r': can't modify frozen object (RuntimeError) from /home/jmcervera/.rvm/gems/ruby-1.9.2-p0@rails2/gems/rest-client-1.6.1/bin/restclient:64:inmethod_missing'
from internal:lib/rubygems/custom_require:29:in require' from <internal:lib/rubygems/custom_require>:29:inrequire'
from /home/jmcervera/.rvm/gems/ruby-1.9.2-p0@rails2/gems/rest-client-1.6.1/bin/restclient:73:in <top (required)>' from /home/jmcervera/.rvm/gems/ruby-1.9.2-p0@rails2/bin/restclient:19:inload'
from /home/jmcervera/.rvm/gems/ruby-1.9.2-p0@rails2/bin/restclient:19:in `

'

Cookies bug

I got error that client doesn't support cookies when trying to issue this command:
RestClient.get "http://vip.hr"

TypeError: can't convert RestClient::Payload::Base into String

The calling code is:

fb_response = RestClient.post(@fb_url, req_xml, :content_type=>:xml)

That's correct right?

And the backtrace is:

TypeError: can't convert RestClient::Payload::Base into String
    /usr/local/lib/ruby/site_ruby/1.9.1/openssl/buffering.rb:227:in `do_write'
    /usr/local/lib/ruby/site_ruby/1.9.1/openssl/buffering.rb:249:in `write'
    /usr/local/lib/ruby/1.9.1/net/protocol.rb:191:in `write0'
    /usr/local/lib/ruby/1.9.1/net/protocol.rb:167:in `block in write'
    /usr/local/lib/ruby/1.9.1/net/protocol.rb:182:in `writing'
    /usr/local/lib/ruby/1.9.1/net/protocol.rb:166:in `write'
    /usr/local/lib/ruby/gems/1.9.1/gems/http_connection-1.3.0/lib/net_fix.rb:98:in `send_request_with_body'
    /usr/local/lib/ruby/gems/1.9.1/gems/http_connection-1.3.0/lib/net_fix.rb:83:in `exec'
    /usr/local/lib/ruby/gems/1.9.1/gems/http_connection-1.3.0/lib/net_fix.rb:144:in `request'
    /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.1/lib/restclient/request.rb:167:in `block in transmit'
    /usr/local/lib/ruby/1.9.1/net/http.rb:627:in `start'
    /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.1/lib/restclient/request.rb:166:in `transmit'
    /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.1/lib/restclient/request.rb:60:in `execute'
    /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.1/lib/restclient/request.rb:31:in `execute'
    /usr/local/lib/ruby/gems/1.9.1/gems/rest-client-1.6.1/lib/restclient.rb:72:in `post'
    /mnt/appoxy_grid/projects/cdecdeca-b4ce-11df-8dec-123139141148/app.rb:38:in `block in <class:MyApp>'

This is in Ruby 1.9.2, not sure if the same occurs in 1.9.1

Getting the response body even if it's an HTTP error

Hi,

I'm consuming a WebService via RestClient.
Sometimes, I don't give the good params in the POST payload and I get an HTTP error with a response body indicating the error.

The WebService may be wrong giving me a standard HTTP Error with the real value in the response body, but there it is and it would be cool to be able to get it.

Thank you very much for maintaing this very good piece of software that RestClient is.

Sincerly
Jeremy

Backwards-incompatible change in 1.3.0

Getting (in the heroku client)

./bin/../lib/heroku/client.rb:189:in console': undefined methodbody' for #RestClient::Response:0x101f7bfa0 (NoMethodError)
from ./bin/../lib/heroku/commands/app.rb:139:in console_session' from ./bin/../lib/heroku/commands/app.rb:128:inconsole'
from ./bin/../lib/heroku/command.rb:45:in send' from ./bin/../lib/heroku/command.rb:45:inrun_internal'
from ./bin/../lib/heroku/command.rb:17:in `run'
from bin/heroku:14

I can't figure out where body exists in 1.2.0, but it works there.

Should handle multiple attributes inside a hash

It seems like even the simplest typical usage of an objects attributes as a hash fails in the current rest-client.

RestClient.post "http://localhost:3000/movies", :movie => {:title => "Foo", :description => "Bar"}

Will only send the title but not the description.

Example of a failing test for payload_spec.rb

it "should handle many attributes inside a hash" do
  parameters = RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz', :baz => 'qux'}}).to_s
  parameters.should include("foo[bar]=baz", "foo[baz]=qux")
end

I recall this working in the old branch of rest-client. The one that didn't have multipart etc.

Question: where to put api key

I need to pass a hash (api key) someplace in the request. Where is the best place for that? :cookie data, as a param? I'm a bit fuzzy on that and didn't see an example illustrating that form of authentication.

Thanks in advance.

User and password are not CGI.unescape'd

Hi,

when using usernames and passwords containing HTTP's chars (like :, / and - most common: @), you have to escape those chars for using them in an URI, e.g. @ => %40.

URI.parse doesn't do that for us, but RestClient::Request#parse_url_with_auth does neither. As a result I cannot make authenticated requests with a [email protected] username.

Patch is at lgierth/rest-client@f20c5de4702090c8dbc5292e96850eede682e03f

Best regards,
Lars

Problem with nested parameters

Hi,

I'm trying to do a post request with nested parameters, e.g.

RestClient.post "url", {:foo => {:bar1 => "bar1", :bar2 => "bar2"}}, {:cookies => @cookie}

For some reason only the first one of those nested parameters goes through. Thus, the parameters that the API behind the url receives are {:foo => {:bar1 => "bar1"}}. This seems like a bug to me since the same code worked with all the previous versions. Any idea on what causes this?

lib/rest-client.rb not included in gemspec

Therefore the gem can't load in e.g. Rails using config.gem "rest-client"

--- a/rest-client.gemspec
+++ b/rest-client.gemspec
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
           "VERSION",
           "bin/restclient",
           "lib/rest_client.rb",
+          "lib/rest-client.rb",
           "lib/restclient.rb",
           "lib/restclient/exceptions.rb",
           "lib/restclient/abstract_response.rb",

Response cookies calls CGI::Cookie::parse which unescapes cookies, they are never re-escaped

AbstractResponse.cookies calls CGI::Cookie::parse on the cookie values:

http://github.com/archiloque/rest-client/blob/1.5.1/lib/restclient/abstract_response.rb#L26

However, if you have a cookie value like:

BAh7BzoNYXBwX25hbWUiEGFwcGxpY2F0aW9uOgpsb2dpbiIKYWRtaW4%3D%0A--08114ba654f17c04d20dcc5228ec672508f738ca

It will get parsed with a '\n' character response.cookies:

BAh7BzoNYXBwX25hbWUiEGFwcGxpY2F0aW9uOgpsb2dpbiIKYWRtaW4=\n--08114ba654f17c04d20dcc5228ec672508f738ca

When the cookies are passed into another request, they are not re-escaped and the server rejects the cookie, therefore this code wouldn't work:

  res = RestClient.post(
    "http://localhost/login",
     {:login => login, :password => password}.to_json, :content_type => :json)
  RestClient.post("http://localhost/some_auth_route",'',{:cookies => res.cookies})

Is this expected behavior or is there another way to use cookies in a series of requests?

According to this bug report, http://redmine.ruby-lang.org/issues/show/2124, CGI::Cookie.parse should not be used client-side.

bug in cookies

if a set-cookie comes in like this:

sdid=ZJ/HQVH6YE+rVkTpn0zvTQ==

key, *val = cookie.split(";").first.split("=")
out[key] = val.join("=")

will return

sdid=ZJ/HQVH6YE+rVkTpn0zvTQ
because the split doesn't preserve the empty entries, I think this'll work:

data = cookie.split(";").first.match(/(.?)=(.)/)
out[data[1]] = data[2]

#<NoMethodError: undefined method `empty?' for nil:NilClass>

Hello,
I'm doing the following (issuing a PUT request against RIAK server) and am receiving a undefined method `empty?' for nil:NilClass> exception from a 204 response code.

RestClient.put "http://127.0.0.1:8091/raw/patents/#{patent["doc_number"]}", patent.to_json, :content_type => :json
RestClient.put "http://127.0.0.1:8091/raw/patents/D0607626", 172 byte length, "Accept"=>"/; q=0.5, application/xml", "Accept-encoding"=>"gzip, deflate", "Content-type"=>"application/json", "Content-Length"=>"172"

=> 204 NoContent | application/json 0 bytes

The PUT request succeeds (i.e. I can see my object in RIAK with the correct content) but each time an exception is raised.

Am I doing something wrong with RestClient?

Which branch, which version ?

Hi

I've noticed that there is a new version on Gemcutter : 1.3.0. I was looking for changes so I went on the GitHub page and looked in the commit history. By the way it would be great to have a simple (at least) History or Changelog file to summarize the changes between version.

I don't understand what commits are in the gem on Gemcutter. I suspect this is the "master" branch that is built for Gemcutter, but there is also a "1.3.0" branch.
For example, the commit 619e1bf seems to be in the "master" branch history, but I can't find the corresponding code in the gem downloaded from Gemcutter.

Do you have any enlightenment about this ?

Thanks

Library require

Being that the library is called "rest-client", there should probably either a single way to require the library (exactly the same as the name of the library itself) or add "rest-client.rb" to ./lib.

This becomes an annoying quirk when using something like bundler and expecting that the name itself should just work. Its always bothered me knowing that there is restclient and rest_client but no rest-client

Passing parameters in a DELETE request

I have to send an API key with a delete request. It seems that rest-client 1.6.1 wasn't sending those params. I made a modification to /lib/restclient/request.rb at line 65 to include the addition of parameters with delete requests, as you have it for get and head. So this:

if [:get, :head].include? method

becomes this

if [:get, :head, :delete].include? method

Can this be updated in the main trunk?

Cheers,
Aaron.

can't convert RestClient::Response into String

Hi,

It's half a surprise because the history.md file says that there is a change in how the response is formatted, but there is no pointer on what we should change in our implementation.

Also, the version change is just "minor". It is advised to update the major version number if there is a backward incompatibility in the public API (cf. http://semver.org/)

redirection with method post

I need redirection with method post.
The server send me 302 in response to post and a have to load a newn page with method get

This is a patch that work. in module AbstractResponse:
def return! request = nil, result = nil, & block
if (200..207).include? code
self
elsif [301, 302, 307].include? code
unless [:get, :head, :post].include? args[:method]
raise Exceptions::EXCEPTIONS_MAP[code].new(self, code)
else
args[:method] = :get if args[:method] == :get
follow_redirection(request, result, & block)
end
elsif code == 303
args[:method] = :get
args.delete :payload
follow_redirection(request, result, & block)
elsif Exceptions::EXCEPTIONS_MAP[code]
raise Exceptions::EXCEPTIONS_MAP[code].new(self, code)
else
raise RequestFailed self
end
end

Thanks

[PATCH] Allow RestClient to stream payloads from Files, Tempfiles and more

I'm working on a CouchDB library that uses RestClient and CouchDB allows users to send files to the database with a simple PUT command.

The PUT command isn't a multipart form, but the HTTP payload is simply the file's contents.

To upload the file right now with RestClient, I have to read in the file and convert it to a string, but with a small modification I was able to add a new Payload type "Streamed" which simply sets the Payload's @stream to the stream that's passed into to Payload.generate.

This Payload type just overrides the #size method so that it works with File objects that provide stat.size and for objects of classes like StringIO and Tempfile that provide just a size method.

Here is my modification:

http://github.com/caleb/rest-client/commit/6f3a5055bad116c2ee945fde9bd3ea946ef2e152

What do you think?

Incorrect redirect processing

When following redirects, RestClient blindly rewrites the original request into a GET request. The HTTP 1.1 specification explicitly forbids automatic redirect for most cases if the original request is not a GET or HEAD.

From http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html :

"If the 301 status code is received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.

Note: When automatically redirecting a POST request after receiving a 301 status code, some existing HTTP/1.0 user agents will erroneously change it into a GET request."

Problem w/ array param w/ hash elements

I ran into what seems to be a bug when attempting to pass an array of hashes as a parameter to RestClient.post (in the context of sending an array of objects represented as a hashes of attribute names / values).

Issuing the following request:

RestClient.post 'http://localhost:3000/test', :'attrs[]' => [{:foo => 'bar'}, {:foo => 'money'}]

and handling it w/ the following sinatra callback

post '/test' do
puts "#{params.inspect}"
end

prints out

{"attrs"=>["foobar", "foomoney"]}

when I am looking for

{"attrs" => [{"foo" => 'bar'}, {"foo" => 'money'}]

Is this a bug w/ rest-client or an issue on my part? Thanks alot.

lib/rest-client.rb not included in gemspec

Therefore the gem can't load in e.g. Rails using config.gem "rest-client"

--- a/rest-client.gemspec
+++ b/rest-client.gemspec
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
"VERSION",
"bin/restclient",
"lib/rest_client.rb",

  •      "lib/rest-client.rb",
       "lib/restclient.rb",
       "lib/restclient/exceptions.rb",
       "lib/restclient/abstract_response.rb",
    

Restclient runtime error on ruby 1.9.2.p0

Trying to invoke the restclient shell.

owain@/Users/owain/dev/p1$ restclient
/Users/owain/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rest-client-1.6.1/bin/restclient:36:in `r': can't modify frozen object (RuntimeError)
    from /Users/owain/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rest-client-1.6.1/bin/restclient:64:in `method_missing'
    from :29:in `require'
    from :29:in `require'
    from /Users/owain/.rvm/gems/ruby-1.9.2-p0@rails3/gems/rest-client-1.6.1/bin/restclient:73:in `'
    from /Users/owain/.rvm/gems/ruby-1.9.2-p0@rails3/bin/restclient:19:in `load'
    from /Users/owain/.rvm/gems/ruby-1.9.2-p0@rails3/bin/restclient:19:in `'

The offending method and method call appears to be:

def r
  @r ||= RestClient::Resource.new(@url, @username, @password)
end

r # force rc to load

parenthesize argument(s) for future version

Hi,

I'm getting a warning (see below) on requiring the rest-client.

/Library/Ruby/Gems/1.8/gems/rest-client-1.6.1/lib/restclient/abstract_response.rb:50: warning: parenthesize argument(s) for future version

It's just a warning but unnecessary IMHO.

Changing

raise RequestFailed self

into

raise RequestFailed(self)

should fix it.

Log format when using Ruby logger

When setting RestClient.log = Logger.new(STDOUT), why does the REST client log in a different format than all my other logger calls? I was expecting something like this:

E, [2010-06-28T10:06:54.553160 #10062] ERROR -- : whatever

Maybe it's make sense to add also something like HTTPClient and HTTPClient::Resource

With the only difference that there will be no difference in semantic of :get and :post, ... methods, and they both can have payloads?

RestClient (current)

def self.get(url, headers={}, &block)
  Request.execute(:method => :get, :url => url, :headers => headers, &block)
end

def self.post(url, payload, headers={}, &block)
  Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end

HTTPClient < RestClient

def self.get(url, payload = nil, headers={}, &block)
  Request.execute(:method => :get, :url => url, :payload => payload, :headers => headers, &block)
end

def self.post(url, payload = nil, headers={}, &block)
  Request.execute(:method => :post, :url => url, :payload => payload, :headers => headers, &block)
end

I understood that it was made such way in according to ActiveResource routing scheme, but RESTful API not always correspond to such scheme.

What do you think?

Basic Authentication does not survive a redirect

If I first make a GET on a URL with username/password (HTTP basic authentication) and get a redirect back as a response then the username/password will not be used for the subsequent request.

BadRequest exception hides relevant details

One API I'm working with responds with a 400 response for a large variety of errors, but includes XML data in the response describing in detail the problem. For example:

<?xml version="1.0" encoding="utf-8"?><Error code="400" description="Bad Request" message="One or more fields are invalid; Invalid Field Validation Message : An existing Customer record has been found" />

Right now, this response is hidden behind the exception raised by rest-client, however. All I see in a case like above is:
Exception `RestClient::BadRequest' at C:/Ruby/lib/ruby/gems/1.9.1/gems/rest-client-1.5.1/lib/restclient/abstract_response.rb:53 - Bad Request

It would be nice to have the to_s representation of RestClient::ExceptionWithResponse (and its descendants) include the response body.

Document nested hash payload

I am using rest_client for a Rails project and had to dig around quite a bit, but found the nested payload very useful. I think it would be a good thing to document. This is probably used by any Rails developer with nested models. An example of my code:

RestClient.post( url, 
  { 
    :transfer => {
      :path => '/foo/bar',
      :owner => 'that_guy',
      :group => 'those_guys'
    },
    :upload => {
      :file => File.new(path)
    }
  })

When setting multiple cookies on a Request, the "Cookie" header is malformed

When multiple cookies are set on a request, the "Cookie" header concatenates the key/value pairs using commas ( , ). It should be using a semi-colon instead, as per http://www.ietf.org/rfc/rfc2109.txt (Section 4.1)

RestClient.log=($stderr)
RestClient.get( "http://google.ca", { :cookies => { :bruno => "gentil", :laurent => "gentil" } })

Output:

RestClient.get "http://google.ca", "Accept-encoding"=>"gzip, deflate", "Cookie"=>"bruno=gentil,laurent=gentil", "Accept"=>"*/*; q=0.5, application/xml"

Problem is on line 60 of lib/restclient/request.rb:

    user_headers[:cookie] = @cookies.map {|(key, val)| "#{key.to_s}=#{val}" }.sort.join(";")

ZLib::Inflate doesn't work for HTTP servers that use raw DEFLATE compression

RestClient::Request.decode assumes that any request body compressed with the DEFLATE compression scheme will have ZLib headers. This is according to spec, but some web servers coughMicrosoft IIScough (see here) return raw DEFLATE data, without the ZLib headers.

Here's a forum post that describes how Mongrel copes with this for browsers that make the same error. I think this will work for RestClient as well:

begin
  Zlib::Inflate.new.inflate body
rescue Zlib::DataError
  # No luck with Zlib decompression. Let's try with raw deflate,
  # like some broken web servers do.
  Zlib::Inflate.new(-Zlib::MAX_WBITS).inflate body;
end

If I have time, I'll test this behaviour against an IIS server and create a patch. In the meantime, I'm creating this issue so I don't forget about it, and to inform others who might run into the same problem.

Caching

See if we can add a simple caching mechanism for get requests

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.