4267a229创建于 2024年8月2日历史提交
/*
    Copyright (c) [2023] [squallzhao]
    fountain is licensed under APACHE LICENSE, VERSION 2.0.
    You can use this software according to the terms and conditions of the APACHE LICENSE, VERSION 2.0.
    You may obtain a copy of APACHE LICENSE, VERSION 2.0 at: https://www.apache.org/licenses/LICENSE-2.0
*/
package microservice.web.http11
import std.convert.*
import microservice.trace.*

public class Http11Req {
    var httpMethodType = HttpCommon.GET
    public var uri = ""
    public var queryString = ""
    public var headers = Headers()
    public var params = Params()
    public var body = ""

    private var length: Int32 = -1
    public func getBodyLength(): Int32{
        return length;
    }
    
    public func getMethod(): String{
        return httpMethodType  
    }

    public func parseFirstLine(line: String): Unit{
        var pathFlag = 4
        if (line.startsWith(HttpCommon.GET)){
            httpMethodType = HttpCommon.GET
            pathFlag = 4
        } else  if (line.startsWith(HttpCommon.POST)){
            httpMethodType = HttpCommon.POST
            pathFlag = 5
        } 
        var path = line[pathFlag..line.indexOf(' ',pathFlag).getOrThrow()]
        //var path = line.substring(pathFlag,line.indexOf(' ',pathFlag).getOrThrow())
        if (line.startsWith(HttpCommon.GET)){
            var t = path.indexOf('?')
            if (t != Option<Int64>.None){
                uri = path[0..t.getOrThrow()]
                queryString = path[t.getOrThrow()+1..path.indexOf(' ').getOrThrow()-1]
                params.load(queryString)
            } else{
                uri = path
            }
        } else  if (line.startsWith(HttpCommon.POST)){
            var t = path.indexOf(' ')
            if (t != Option<Int64>.None){
                uri = path[0..t.getOrThrow()]
                queryString = ""
            } else{
                uri = path
            }
        }
    }

    public func parseOtherLine(line: String): Unit{
        var header = Header()
        if (header.parse(line)){
            headers.put(header.key.getOrThrow(), header.value.getOrThrow())

            if (header.key== HttpCommon.CONTENT_LENGTH){
                this.length = Int32.parse(header.value.getOrThrow())
            }
        }
    }

    public func dump(){
        Logger.trace("receive a request")
        Logger.trace("uri="+uri)
        Logger.trace("queryString="+queryString)
        headers.dump()
        params.dump()
        Logger.trace("body="+body)
    }
}