Class: Baykit::BayServer::Docker::Http::H1::Command::CmdHeader

Inherits:
H1Command
  • Object
show all
Includes:
Protocol, Util
Defined in:
lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb

Constant Summary collapse

STATE_READ_FIRST_LINE =
1
STATE_READ_MESSAGE_HEADERS =
2
CR_CODE_POINT =
"\r".codepoints[0]
LF_CODE_POINT =
"\n".codepoints[0]

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(is_req_header) ⇒ CmdHeader

Returns a new instance of CmdHeader.



43
44
45
46
47
48
49
50
51
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 43

def initialize(is_req_header)
  super(H1Type::HEADER)
  @headers = []
  @is_req_header = is_req_header
  @method = nil
  @uri = nil
  @version = nil
  @status = nil
end

Instance Attribute Details

#headersObject (readonly)

Returns the value of attribute headers.



38
39
40
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 38

def headers
  @headers
end

#is_req_headerObject (readonly)

request packet



39
40
41
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 39

def is_req_header
  @is_req_header
end

#methodObject

Returns the value of attribute method.



40
41
42
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 40

def method
  @method
end

#statusObject

Returns the value of attribute status.



41
42
43
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 41

def status
  @status
end

#uriObject

Returns the value of attribute uri.



40
41
42
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 40

def uri
  @uri
end

#versionObject

Returns the value of attribute version.



40
41
42
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 40

def version
  @version
end

Class Method Details

.new_req_header(method, uri, version) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 53

def CmdHeader.new_req_header(method, uri, version)
  h = CmdHeader.new(true)
  h.method = method
  h.uri = uri
  h.version = version
  return h
end

.new_res_header(headers, version) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 61

def CmdHeader.new_res_header(headers, version)
  h = CmdHeader.new(false)
  h.version = version
  h.status = headers.status
  headers.names.each do |name|
    headers.values(name).each do |value|
      h.add_header name, value
    end
  end
  return h
end

Instance Method Details

#add_header(name, value) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 73

def add_header(name, value)
  if name == nil
    raise Sink.new("name is nil")
  end
  if value == nil
    BayLog.warn("Header value is nil: %s", name)
    return
  end

  if !name.kind_of?(String)
    BayLog.error("header name is not string: name=%s value=%s", name, value)
    raise Sink.new("IllegalArgument")
  end
  if !value.kind_of?(String)
    BayLog.error("header value is not string: name=%s value=%s", name, value)
    raise Sink.new("IllegalArgument")
  end

  @headers.append([name, value])
end

#handle(cmd_handler) ⇒ Object



185
186
187
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 185

def handle(cmd_handler)
  return cmd_handler.handle_header(self)
end

#pack(pkt) ⇒ Object



167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 167

def pack(pkt)
  acc = pkt.new_data_accessor
  if @is_req_header
    pack_request_line(acc)
  else
    pack_status_line(acc)
  end

  @headers.each do |nv|
    #@BayServer.debug "Packe header #{nv[0]}=#{nv[1]}"
    pack_message_header(acc, nv[0], nv[1])
  end

  pack_end_header(acc)
  #BayLog.debug "#{self} pack header data header=#{pkt.header.length} bytes data=#{pkt.data.length} bytes"
  #BayLog.debug "#{self} pack header data: #{pkt.data.bytes}"
end

#set_header(name, value) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 94

def set_header(name, value)
  if name == nil
    raise Sink.new("Nil")
  end
  if value == nil
    BayLog.warn("Header value is null: %s", name)
    return
  end

  if !name.kind_of?(String)
    raise Sink.new("IllegalArgument")
  end
  if !value.kind_of?(String)
    raise Sink.new("IllegalArgument")
  end

  @headers.each do |nv|
    if nv[0].casecmp?(name)
      nv[1] = value
      return
    end
  end

  headers.append([name, value])
end

#to_sObject



189
190
191
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 189

def to_s
  "CommandHeader[H1]"
end

#unpack(pkt) ⇒ Object



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/baykit/bayserver/docker/http/h1/command/cmd_header.rb', line 120

def unpack(pkt)
  acc = pkt.new_data_accessor
  data_len = pkt.data_len()
  state = STATE_READ_FIRST_LINE

  line_start_pos = 0
  line_len = 0

  data_len.times do |pos|
    b = acc.get_byte
    case b
    when CharUtil::CR_BYTE
      next

    when CharUtil::LF_BYTE
      if line_len == 0
        break
      end
      if state == STATE_READ_FIRST_LINE
        if @is_req_header
          unpack_request_line(pkt.buf, line_start_pos, line_len)
        else
          unpack_status_line(pkt.buf, line_start_pos, line_len)
        end

        state = STATE_READ_MESSAGE_HEADERS
      else
        unpack_message_header(pkt.buf, line_start_pos, line_len)
      end

      line_len = 0
      line_start_pos = pos + 1

    else
      line_len += 1
    end

  end

  if state == STATE_READ_FIRST_LINE
    raise ProtocolException.new(
      BayMessage.get(
        :HTP_INVALID_HEADER_FORMAT,
        pkt.buf[line_start_pos, line_len]))
  end
end