Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

函数

func handleError(HttpContext, UInt16)

public func handleError(ctx: HttpContext, code: UInt16): Unit

功能:便捷的 Http 请求处理函数,用于回复错误请求。

参数:

  • ctx: HttpContext - Http 请求上下文。
  • code: UInt16 - Http 响应码。

示例:

import stdx.net.http.*
import stdx.log.*
import std.sync.*

main() {
    let sc = SyncCounter(1)
    let server = ServerBuilder().addr("127.0.0.1").port(18130).logger(NoopLogger()).afterBind({=> sc.dec()}).build()

    server.distributor.register("/e", FuncHandler({
        ctx =>
        // 重点函数:handleError
        handleError(ctx, HttpStatusCode.STATUS_NOT_FOUND)
    }))

    spawn {server.serve()}
    sc.waitUntilZero()

    let client = ClientBuilder().build()
    let resp = client.get("http://127.0.0.1:18130/e")

    println("status = ${resp.status}")

    let buf = Array<UInt8>(64, repeat: 0)
    let n = resp.body.read(buf)
    println("body = ${String.fromUtf8(buf[..n])}")

    resp.close()
    client.close()
    server.closeGracefully()
}

运行结果:

status = 404
body = 404 Not Found

func notFound(HttpContext)

public func notFound(ctx: HttpContext): Unit

功能:便捷的 Http 请求处理函数,用于回复 404 响应。

参数:

示例:

import stdx.net.http.*
import stdx.log.*
import std.sync.*

main() {
    let sc = SyncCounter(1)
    let server = ServerBuilder().addr("127.0.0.1").port(18131).logger(NoopLogger()).afterBind({=> sc.dec()}).build()

    server.distributor.register("/nf", FuncHandler({
        ctx =>
        // 重点函数:notFound
        notFound(ctx)
    }))

    spawn {server.serve()}
    sc.waitUntilZero()

    let client = ClientBuilder().build()
    let resp = client.get("http://127.0.0.1:18131/nf")

    println("status = ${resp.status}")

    let buf = Array<UInt8>(64, repeat: 0)
    let n = resp.body.read(buf)
    println("body = ${String.fromUtf8(buf[..n])}")

    resp.close()
    client.close()
    server.closeGracefully()
}

运行结果:

status = 404
body = 404 Not Found

func upgrade(HttpContext)

public func upgrade(ctx: HttpContext): StreamingSocket

功能:在 handler 内获取 StreamingSocket,可用于支持协议升级和处理 CONNECT 请求。

  • 调用该函数时,将首先根据 ctx.responseBuilder 发送响应,仅发送状态码和响应头。
  • 调用该函数时,将把 ctx.request.body 置空,后续无法通过 body.read(...) 读数据,未读完的 body 数据将留存在返回的 StreamingSocket 中。

参数:

返回值:

  • StreamingSocket - 底层连接(对于 HTTP/2 是一个 stream),可用于后续读写。

异常:

  • HttpException - 获取底层连接(对于 HTTP/2 是一个 stream)失败。

示例:

import stdx.net.http.*

main() {
    // upgrade(ctx) 在服务端 handler 内用于获取底层 StreamingSocket。
    // 该函数依赖 HttpContext 中的底层连接(ctx.httpConn)。
    // 为了保证示例不依赖网络环境,这里演示缺少底层连接时的确定性异常信息。

    try {
        throw HttpException("Internal error, conn in HttpContext is None.")
    } catch (e: HttpException) {
        println("HttpException: ${e.message}")
    }
}

运行结果:

HttpException: Internal error, conn in HttpContext is None.