Class ::nsmcp::Server (public)

 ::nx::Class ::nsmcp::Server[i]

Defined in /usr/local/ns/tcl/nsmcp/lib/transport.tcl

Testcases:
No testcase defined.
Source code:
    :property transport:required
    :property {path /mcp}
    :public method install {} {
        ::nsmcp::install_cleanup
        foreach method {POST GET DELETE PUT PATCH OPTIONS HEAD} {
            ns_register_proc -noinherit $method ${:path} [list [self] http]
        }
    }
    :public method http {} {
        set headers {}
        set input [ns_conn headers]
        for {set i 0} {$i < [ns_set size $input]} {incr i} {
            set name [string tolower [ns_set key $input $i]]
            # Do not silently select one of several authentication/origin headers.
            if {[dict exists $headers $name] && $name in {authorization origin content-type mcp-protocol-version}} {
                ns_return 400 text/plain "Duplicate request header"
                return
            }
            if {[dict exists $headers $name]} {
                dict append headers $name , [ns_set value $input $i]
            } else {
                dict set headers $name [ns_set value $input $i]
            }
        }
        if {[ns_conn contentlength] > [${:transport} maxBodyBytes]} {
            ns_return 413 text/plain "Request body too large"
            return
        }
        try {
            set response [${:transport} request [ns_conn method] $headers  [ns_conn content] [ns_conn server]]
            set contentType text/plain
            dict for {key value} [dict get $response headers] {
                if {[string equal -nocase $key Content-Type]} {
                    set contentType $value
                } else {
                    ns_set put [ns_conn outputheaders] $key $value
                }
            }
            ns_set put [ns_conn outputheaders] Cache-Control no-store
            ns_return [dict get $response status] $contentType [dict get $response body]
        } on error {message options} {
            ns_log error "nsmcp: HTTP adapter failed"
            ns_return 500 text/plain "Internal error"
        } finally {
            ::nsmcp::cleanup
        }
    }
XQL Not present:
Generic, PostgreSQL, Oracle
[ hide source ] | [ make this the default ]
Show another procedure: