1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.fcgi.parser;
20
21 import java.nio.ByteBuffer;
22 import java.util.EnumMap;
23
24 import org.eclipse.jetty.fcgi.FCGI;
25 import org.eclipse.jetty.http.HttpField;
26
27 public class ClientParser extends Parser
28 {
29 private final EnumMap<FCGI.FrameType, ContentParser> contentParsers = new EnumMap<>(FCGI.FrameType.class);
30
31 public ClientParser(Listener listener)
32 {
33 ResponseContentParser stdOutParser = new ResponseContentParser(headerParser, listener);
34 contentParsers.put(FCGI.FrameType.STDOUT, stdOutParser);
35 StreamContentParser stdErrParser = new StreamContentParser(headerParser, FCGI.StreamType.STD_ERR, listener);
36 contentParsers.put(FCGI.FrameType.STDERR, stdErrParser);
37 contentParsers.put(FCGI.FrameType.END_REQUEST, new EndRequestContentParser(headerParser, new EndRequestListener(listener, stdOutParser, stdErrParser)));
38 }
39
40 @Override
41 protected ContentParser findContentParser(FCGI.FrameType frameType)
42 {
43 return contentParsers.get(frameType);
44 }
45
46 public interface Listener extends Parser.Listener
47 {
48 public void onBegin(int request, int code, String reason);
49
50 public static class Adapter extends Parser.Listener.Adapter implements Listener
51 {
52 @Override
53 public void onBegin(int request, int code, String reason)
54 {
55 }
56 }
57 }
58
59 private class EndRequestListener implements Listener
60 {
61 private final Listener listener;
62 private final StreamContentParser[] streamParsers;
63
64 private EndRequestListener(Listener listener, StreamContentParser... streamParsers)
65 {
66 this.listener = listener;
67 this.streamParsers = streamParsers;
68 }
69
70 @Override
71 public void onBegin(int request, int code, String reason)
72 {
73 listener.onBegin(request, code, reason);
74 }
75
76 @Override
77 public void onHeader(int request, HttpField field)
78 {
79 listener.onHeader(request, field);
80 }
81
82 @Override
83 public void onHeaders(int request)
84 {
85 listener.onHeaders(request);
86 }
87
88 @Override
89 public boolean onContent(int request, FCGI.StreamType stream, ByteBuffer buffer)
90 {
91 return listener.onContent(request, stream, buffer);
92 }
93
94 @Override
95 public void onEnd(int request)
96 {
97 listener.onEnd(request);
98 for (StreamContentParser streamParser : streamParsers)
99 streamParser.end(request);
100 }
101
102 @Override
103 public void onFailure(int request, Throwable failure)
104 {
105 listener.onFailure(request, failure);
106 for (StreamContentParser streamParser : streamParsers)
107 streamParser.end(request);
108 }
109 }
110 }