blob: d7ca5491835be942c91b7925a00abc2dd544768f [file] [log] [blame]
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package http
import (
"net"
"net/http"
"net/url"
)
// Request represents the HTTP request received by APISIX.
// We don't use net/http's Request because it doesn't suit our purpose.
// Take `Request.Header` as an example:
//
// 1. We need to record any change to the request headers. As the Request.Header
// is not an interface, there is not way to inject our special tracker.
// 2. As the author of fasthttp pointed out, "headers are stored in a map[string][]string.
// So the server must parse all the headers, ...". The official API is suboptimal, which
// is even worse in our case as it is not a real HTTP server.
type Request interface {
// ID returns the request id
ID() uint32
// ConfToken returns the token represents the configuration of current route.
// Each route have its unique token, so we can use it to distinguish different
// route in the same plugin.
ConfToken() uint32
// SrcIP returns the client's IP
SrcIP() net.IP
// Method returns the HTTP method (GET, POST, PUT, etc.)
Method() string
// Path returns the path part of the client's URI (without query string and the other parts)
// It won't be equal to the one in the Request-Line sent by the client if it has
// been rewritten by APISIX
Path() []byte
// SetPath is the setter for Path
SetPath([]byte)
// Header returns the HTTP headers
Header() Header
// Args returns the query string
Args() url.Values
}
// Header is like http.Header, but only implements the subset of its methods
type Header interface {
// Set sets the header entries associated with key to the single element value.
// It replaces any existing values associated with key.
// The key is case insensitive
Set(key, value string)
// Del deletes the values associated with key. The key is case insensitive
Del(key string)
// Get gets the first value associated with the given key.
// If there are no values associated with the key, Get returns "".
// It is case insensitive
Get(key string) string
// View returns the internal structure. It is expected for read operations. Any write operation
// won't be recorded
View() http.Header
// TODO: support Add
}