// File: JianjiaoSQ[P]MyPoorWebServer/http/http_conn.cpp
// Function: http_conn::parse_request_line(char*)
http_conn::HTTP_CODE http_conn::parse_request_line(char *text)
{
    m_url = strpbrk(text, " \t");  // 搜索返回位置
    if (!m_url)
    {
        return BAD_REQUEST;
    }
    *m_url++ = '\0';
    char *method = text;
    if (strcasecmp(method, "GET") == 0) // 判断字符串是否相等，忽略大小写
        m_method = GET;
    else if (strcasecmp(method, "POST") == 0)
    {
        m_method = POST;
        cgi = 1;
    }
    else
        return BAD_REQUEST;
    m_url += strspn(m_url, " \t"); // 该函数返回 str1 中第一个不在字符串 str2 中出现的字符下标。

    m_version = strpbrk(m_url, " \t");
    if (!m_version)
        return BAD_REQUEST;
    *m_version++ = '\0';
    m_version += strspn(m_version, " \t");
    if (strcasecmp(m_version, "HTTP/1.1") != 0)
        return BAD_REQUEST;
    if (strncasecmp(m_url, "http://", 7) == 0) // 比较参数 s1 和  s2 字符串前n个字符
    {
        m_url += 7;
        m_url = strchr(m_url, '/');
    }

    if (strncasecmp(m_url, "https://", 8) == 0)
    {
        m_url += 8;
        m_url = strchr(m_url, '/');
    }

    if (!m_url || m_url[0] != '/')
        return BAD_REQUEST;
    //当url为/时，显示判断界面
    if (strlen(m_url) == 1)
        strcat(m_url, "judge.html");
    m_check_state = CHECK_STATE_HEADER;
    return NO_REQUEST;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rdi
leaq 0x8eb4(%rip), %rsi      # 0xe237
callq 0x3700
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xd08(%rax)
cmpq $0x0, 0xd08(%rax)
jne 0x53ac
movl $0x2, -0x4(%rbp)
jmp 0x5615
movq -0x28(%rbp), %rcx
movq 0xd08(%rcx), %rax
movq %rax, %rdx
addq $0x1, %rdx
movq %rdx, 0xd08(%rcx)
movb $0x0, (%rax)
movq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rdi
leaq 0x8e5f(%rip), %rsi      # 0xe23a
callq 0x34c0
cmpl $0x0, %eax
jne 0x53f5
movq -0x28(%rbp), %rax
movl $0x0, 0xc3c(%rax)
jmp 0x5432
movq -0x20(%rbp), %rdi
leaq 0x8e3e(%rip), %rsi      # 0xe23e
callq 0x34c0
cmpl $0x0, %eax
jne 0x5424
movq -0x28(%rbp), %rax
movl $0x1, 0xc3c(%rax)
movl $0x1, 0xde4(%rax)
jmp 0x5430
movl $0x2, -0x4(%rbp)
jmp 0x5615
jmp 0x5432
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rdi
leaq 0x8df3(%rip), %rsi      # 0xe237
callq 0x3190
movq %rax, %rcx
movq -0x28(%rbp), %rax
addq 0xd08(%rax), %rcx
movq %rcx, 0xd08(%rax)
movq 0xd08(%rax), %rdi
leaq 0x8dcb(%rip), %rsi      # 0xe237
callq 0x3700
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xd10(%rax)
cmpq $0x0, 0xd10(%rax)
jne 0x5495
movl $0x2, -0x4(%rbp)
jmp 0x5615
movq -0x28(%rbp), %rax
movq 0xd10(%rax), %rcx
movq %rcx, %rdx
addq $0x1, %rdx
movq %rdx, 0xd10(%rax)
movb $0x0, (%rcx)
movq 0xd10(%rax), %rdi
leaq 0x8d78(%rip), %rsi      # 0xe237
callq 0x3190
movq %rax, %rcx
movq -0x28(%rbp), %rax
addq 0xd10(%rax), %rcx
movq %rcx, 0xd10(%rax)
movq 0xd10(%rax), %rdi
leaq 0x8d5c(%rip), %rsi      # 0xe243
callq 0x34c0
cmpl $0x0, %eax
je 0x54fd
movl $0x2, -0x4(%rbp)
jmp 0x5615
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rdi
leaq 0x8d3d(%rip), %rsi      # 0xe24c
movl $0x7, %edx
callq 0x35b0
cmpl $0x0, %eax
jne 0x5553
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rcx
addq $0x7, %rcx
movq %rcx, 0xd08(%rax)
movq 0xd08(%rax), %rdi
movl $0x2f, %esi
callq 0x3160
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xd08(%rax)
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rdi
leaq 0x8cef(%rip), %rsi      # 0xe254
movl $0x8, %edx
callq 0x35b0
cmpl $0x0, %eax
jne 0x55a9
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rcx
addq $0x8, %rcx
movq %rcx, 0xd08(%rax)
movq 0xd08(%rax), %rdi
movl $0x2f, %esi
callq 0x3160
movq %rax, %rcx
movq -0x28(%rbp), %rax
movq %rcx, 0xd08(%rax)
movq -0x28(%rbp), %rax
cmpq $0x0, 0xd08(%rax)
je 0x55ca
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rax
movsbl (%rax), %eax
cmpl $0x2f, %eax
je 0x55d3
movl $0x2, -0x4(%rbp)
jmp 0x5615
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rdi
callq 0x31b0
cmpq $0x1, %rax
jne 0x5600
movq -0x28(%rbp), %rax
movq 0xd08(%rax), %rdi
leaq 0x8c62(%rip), %rsi      # 0xe25d
callq 0x3730
movq -0x28(%rbp), %rax
movl $0x1, 0xc38(%rax)
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nop