mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-03 18:34:43 +00:00
Merge branch 'devel' of https://github.com/Araq/Nim into devel
This commit is contained in:
@@ -37,12 +37,24 @@ type
|
||||
proc (total, progress: BiggestInt, speed: float):
|
||||
Future[void] {.closure, gcsafe.}
|
||||
|
||||
proc expectReply(ftp: AsyncFtpClient): Future[TaintedString] =
|
||||
result = ftp.csock.recvLine()
|
||||
const multiLineLimit = 10000
|
||||
|
||||
proc expectReply(ftp: AsyncFtpClient): Future[TaintedString] {.async.} =
|
||||
result = await ftp.csock.recvLine()
|
||||
var count = 0
|
||||
while result[3] == '-':
|
||||
## Multi-line reply.
|
||||
let line = await ftp.csock.recvLine()
|
||||
result.add("\n" & line)
|
||||
count.inc()
|
||||
if count >= multiLineLimit:
|
||||
raise newException(ReplyError, "Reached maximum multi-line reply count.")
|
||||
|
||||
proc send*(ftp: AsyncFtpClient, m: string): Future[TaintedString] {.async.} =
|
||||
## Send a message to the server, and wait for a primary reply.
|
||||
## ``\c\L`` is added for you.
|
||||
##
|
||||
## **Note:** The server may return multiple lines of coded replies.
|
||||
await ftp.csock.send(m & "\c\L")
|
||||
return await ftp.expectReply()
|
||||
|
||||
@@ -79,6 +91,8 @@ proc connect*(ftp: AsyncFtpClient) {.async.} =
|
||||
# 120 Service ready in nnn minutes.
|
||||
# We wait until we receive 220.
|
||||
reply = await ftp.expectReply()
|
||||
|
||||
# Handle 220 messages from the server
|
||||
assertReply(reply, "220")
|
||||
|
||||
if ftp.user != "":
|
||||
|
||||
@@ -107,6 +107,8 @@ type
|
||||
EInvalidReply: ReplyError, EFTP: FTPError
|
||||
].}
|
||||
|
||||
const multiLineLimit = 10000
|
||||
|
||||
proc ftpClient*(address: string, port = Port(21),
|
||||
user, pass = ""): FtpClient =
|
||||
## Create a ``FtpClient`` object.
|
||||
@@ -135,10 +137,24 @@ proc expectReply[T](ftp: FtpBase[T]): TaintedString =
|
||||
ftp.csock.readLine(result)
|
||||
else:
|
||||
discard ftp.csock.readLine(result)
|
||||
var count = 0
|
||||
while result[3] == '-':
|
||||
## Multi-line reply.
|
||||
var line = TaintedString""
|
||||
when T is Socket:
|
||||
ftp.csock.readLine(line)
|
||||
else:
|
||||
discard ftp.csock.readLine(line)
|
||||
result.add("\n" & line)
|
||||
count.inc()
|
||||
if count >= multiLineLimit:
|
||||
raise newException(ReplyError, "Reached maximum multi-line reply count.")
|
||||
|
||||
proc send*[T](ftp: FtpBase[T], m: string): TaintedString =
|
||||
## Send a message to the server, and wait for a primary reply.
|
||||
## ``\c\L`` is added for you.
|
||||
##
|
||||
## **Note:** The server may return multiple lines of coded replies.
|
||||
blockingOperation(ftp.csock):
|
||||
ftp.csock.send(m & "\c\L")
|
||||
return ftp.expectReply()
|
||||
@@ -263,7 +279,13 @@ proc connect*[T](ftp: FtpBase[T]) =
|
||||
else:
|
||||
{.fatal: "Incorrect socket instantiation".}
|
||||
|
||||
# TODO: Handle 120? or let user handle it.
|
||||
var reply = ftp.expectReply()
|
||||
if reply.startsWith("120"):
|
||||
# 120 Service ready in nnn minutes.
|
||||
# We wait until we receive 220.
|
||||
reply = ftp.expectReply()
|
||||
|
||||
# Handle 220 messages from the server
|
||||
assertReply ftp.expectReply(), "220"
|
||||
|
||||
if ftp.user != "":
|
||||
|
||||
@@ -821,6 +821,24 @@ proc get*(client: AsyncHttpClient, url: string): Future[Response] {.async.} =
|
||||
result = await client.request(redirectTo, httpGET)
|
||||
lastUrl = redirectTo
|
||||
|
||||
proc post*(client: AsyncHttpClient, url: string, body = "", multipart: MultipartData = nil): Future[Response] {.async.} =
|
||||
## Connects to the hostname specified by the URL and performs a POST request.
|
||||
##
|
||||
## This procedure will follow redirects up to a maximum number of redirects
|
||||
## specified in ``newAsyncHttpClient``.
|
||||
let (mpHeader, mpBody) = format(multipart)
|
||||
|
||||
template withNewLine(x): expr =
|
||||
if x.len > 0 and not x.endsWith("\c\L"):
|
||||
x & "\c\L"
|
||||
else:
|
||||
x
|
||||
var xb = mpBody.withNewLine() & body
|
||||
client.headers["Content-Type"] = mpHeader.split(": ")[1]
|
||||
client.headers["Content-Length"] = $len(xb)
|
||||
|
||||
result = await client.request(url, httpPOST, xb)
|
||||
|
||||
when not defined(testing) and isMainModule:
|
||||
when true:
|
||||
# Async
|
||||
|
||||
@@ -26,7 +26,7 @@ To build from source you will need:
|
||||
If you are on a fairly modern *nix system, the following steps should work:
|
||||
|
||||
```
|
||||
$ git clone git://github.com/Araq/Nim.git
|
||||
$ git clone git://github.com/nim-lang/Nim.git
|
||||
$ cd Nim
|
||||
$ git clone --depth 1 git://github.com/nim-lang/csources
|
||||
$ cd csources && sh build.sh
|
||||
|
||||
Reference in New Issue
Block a user