@@ -5,6 +5,7 @@ use std::task::Poll;
5
5
use std:: time:: Instant ;
6
6
7
7
use graph:: prelude:: * ;
8
+ use graph:: semver:: VersionReq ;
8
9
use graph:: { components:: server:: query:: GraphQLServerError , data:: query:: QueryTarget } ;
9
10
use http:: header;
10
11
use http:: header:: {
@@ -89,17 +90,49 @@ where
89
90
self . serve_dynamic_file ( self . graphiql_html ( ) )
90
91
}
91
92
93
+ fn resolve_api_version (
94
+ & self ,
95
+ request : & Request < Body > ,
96
+ ) -> Result < ApiVersion , GraphQLServerError > {
97
+ let mut version = ApiVersion :: default ( ) ;
98
+
99
+ if let Some ( query) = request. uri ( ) . query ( ) {
100
+ let potential_version_requirement = query. split ( "&" ) . find_map ( |pair| {
101
+ if pair. starts_with ( "api-version=" ) {
102
+ if let Some ( version_requirement) = pair. split ( "=" ) . nth ( 1 ) {
103
+ return Some ( version_requirement) ;
104
+ }
105
+ }
106
+ return None ;
107
+ } ) ;
108
+
109
+ if let Some ( version_requirement) = potential_version_requirement {
110
+ version = ApiVersion :: new (
111
+ & VersionReq :: parse ( version_requirement)
112
+ . map_err ( |error| GraphQLServerError :: ClientError ( error. to_string ( ) ) ) ?,
113
+ )
114
+ . map_err ( |error| GraphQLServerError :: ClientError ( error) ) ?;
115
+ }
116
+ }
117
+
118
+ Ok ( version)
119
+ }
120
+
92
121
async fn handle_graphql_query_by_name (
93
122
self ,
94
123
subgraph_name : String ,
95
124
request : Request < Body > ,
96
125
) -> GraphQLServiceResult {
126
+ let version = self . resolve_api_version ( & request) ?;
97
127
let subgraph_name = SubgraphName :: new ( subgraph_name. as_str ( ) ) . map_err ( |( ) | {
98
128
GraphQLServerError :: ClientError ( format ! ( "Invalid subgraph name {:?}" , subgraph_name) )
99
129
} ) ?;
100
130
101
- self . handle_graphql_query ( subgraph_name. into ( ) , request. into_body ( ) )
102
- . await
131
+ self . handle_graphql_query (
132
+ QueryTarget :: Name ( subgraph_name, version) ,
133
+ request. into_body ( ) ,
134
+ )
135
+ . await
103
136
}
104
137
105
138
fn handle_graphql_query_by_id (
@@ -108,11 +141,16 @@ where
108
141
request : Request < Body > ,
109
142
) -> GraphQLServiceResponse {
110
143
let res = DeploymentHash :: new ( id)
111
- . map_err ( |id| GraphQLServerError :: ClientError ( format ! ( "Invalid subgraph id `{}`" , id) ) ) ;
144
+ . map_err ( |id| GraphQLServerError :: ClientError ( format ! ( "Invalid subgraph id `{}`" , id) ) )
145
+ . and_then ( |id| match self . resolve_api_version ( & request) {
146
+ Ok ( version) => Ok ( ( id, version) ) ,
147
+ Err ( error) => Err ( error) ,
148
+ } ) ;
149
+
112
150
match res {
113
151
Err ( _) => self . handle_not_found ( ) ,
114
- Ok ( id ) => self
115
- . handle_graphql_query ( id . into ( ) , request. into_body ( ) )
152
+ Ok ( ( id , version ) ) => self
153
+ . handle_graphql_query ( QueryTarget :: Deployment ( id , version ) , request. into_body ( ) )
116
154
. boxed ( ) ,
117
155
}
118
156
}
0 commit comments